HiveBrain v1.2.0
Get Started
← Back to all entries
patternrubyrailsMinor

Creating a Ruby gem that talks to another gem

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
creatingtalksthatanotherrubygem

Problem

I am working on creating an interface gem that works with the Jira-Ruby gem.

I have several questions and would like a general review for both my code and my attempt at creating a gem (I've never written one before). Any advice on where to go next would also be appreciated.

File structure:

jira_interface
   lib
      jira_interface
          config.rb
          version.rb
          app_interface.rb 
      jira_interface.rb
   jira_interface.gemspec
   #...etc files, I used bundle's gem command to set up


My main module (jira_interface.rb) looks like this:

require "jira_interface/version"
require "jira"
require "jira_interface/config"
require "jira_interface/app_interface"

module JiraInterface

  def get_jira_client
      @client = Jira::Client.new(USERINFORMATION)
  end

  def get_project(project_name)
     @client.Project.find(project_name)
  end

end


And my app_interface.rb looks like this:

class AppInterface {"summary"=> issue_desc, "project"=> {"id" => project.id}, "issuetype"=> {"id"=> "1"}}})
  end

  def update_issue(issue_id)
    issue = @client.Issue.find(issue_id)

    comment = issue.comments.build
    comment.save({"body"=> "This happened again at #{Date.time}"})
  end

  def get_issues(issue_desc, project_name)
    project = get_project(project_name)

    if project.issues.detect { |issue| issue.fields['summary'].include?(issue_desc) }
      update_issue(issue.id)
    else
      create_issue(issue_desc, project)
    end
  end

end


The goal is pretty simple: call get_issues() from the rails app when an error happens. If the error is already documented, post a comment saying that it happened again. If it's not, then create a new issue.

To the best of my knowledge, this should work because I've been following the examples found online. However, I've been having a heck of a time just testing it. If anyone could suggest a good way of testing this, that would be much appreciated.

Solution

I suggest you take a close look at how the gem you are using is tested. Those tests include mocks for all responses of the API (I assume) and is a good example for testing gems in general.

Notice:

  • helper methods in the support folder including shared examples



  • mock data to simulate responses from the source API



  • custom matchers to make code better readable and reduce repetition of code (DRY-principle)



Those to me are the three most important you should embrace for now.

Context

StackExchange Code Review Q#29962, answer score: 2

Revisions (0)

No revisions yet.