jira-ruby-dmg 0.1.10 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/lib/jira/base.rb +8 -3
- data/lib/jira/client.rb +12 -0
- data/lib/jira/resource/agileboard.rb +74 -0
- data/lib/jira/resource/project.rb +14 -0
- data/lib/jira/resource/sprint.rb +81 -0
- data/lib/jira/resource/velocity.rb +11 -0
- data/lib/jira/version.rb +1 -1
- data/lib/jira.rb +4 -1
- data/spec/jira/resource/project_spec.rb +25 -1
- data/spec/jira/resource/sprint_spec.rb +63 -0
- data/spec/spec_helper.rb +1 -0
- metadata +7 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 5091836e1cd94b8d437b8b90ffd30f240cd9075a
         | 
| 4 | 
            +
              data.tar.gz: c2335e7bdc26a6aecdad5494a87587fbf54c1089
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1b4188f3c85f548a907dfd59e01c282f681ea6fba9d0a0dafbd5776e0afa3de63d1289d711c122ae2fc874a2d411678d0263c246550cc7024a72ac8622e25c33
         | 
| 7 | 
            +
              data.tar.gz: cb4b9f8dea064c7a36abadc57a5477ebdd76fe77618d15b7cddabfb0972f926627ae02445719b527b8f55465818549e26bec4a2648113ee9648ba16099620f88
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    
    
        data/lib/jira/base.rb
    CHANGED
    
    | @@ -98,9 +98,8 @@ module JIRA | |
| 98 98 | 
             
                  if collection_attributes_are_nested
         | 
| 99 99 | 
             
                    json = json[endpoint_name.pluralize]
         | 
| 100 100 | 
             
                  end
         | 
| 101 | 
            -
                   | 
| 102 | 
            -
             | 
| 103 | 
            -
                  end
         | 
| 101 | 
            +
                  
         | 
| 102 | 
            +
                  self.populate(client, options, json)
         | 
| 104 103 | 
             
                end
         | 
| 105 104 |  | 
| 106 105 | 
             
                # Finds and retrieves a resource with the given ID.
         | 
| @@ -153,6 +152,12 @@ module JIRA | |
| 153 152 | 
             
                  :id
         | 
| 154 153 | 
             
                end
         | 
| 155 154 |  | 
| 155 | 
            +
                def self.populate(client, options, json)
         | 
| 156 | 
            +
                  json.map do |attrs|
         | 
| 157 | 
            +
                    self.new(client, {:attrs => attrs}.merge(options))
         | 
| 158 | 
            +
                  end
         | 
| 159 | 
            +
                end
         | 
| 160 | 
            +
             | 
| 156 161 | 
             
                def self.parse_json(string) # :nodoc:
         | 
| 157 162 | 
             
                  JSON.parse(string)
         | 
| 158 163 | 
             
                end
         | 
    
        data/lib/jira/client.rb
    CHANGED
    
    | @@ -125,6 +125,18 @@ module JIRA | |
| 125 125 | 
             
                  JIRA::Resource::FieldFactory.new(self)
         | 
| 126 126 | 
             
                end
         | 
| 127 127 |  | 
| 128 | 
            +
                def Sprint # :nodoc:
         | 
| 129 | 
            +
                  JIRA::Resource::SprintFactory.new(self)
         | 
| 130 | 
            +
                end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                def Agileboard # :nodoc:
         | 
| 133 | 
            +
                  JIRA::Resource::AgileboardFactory.new(self)
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                def Velocity # :nodoc:
         | 
| 137 | 
            +
                  JIRA::Resource::VelocityFactory.new(self)
         | 
| 138 | 
            +
                end
         | 
| 139 | 
            +
             | 
| 128 140 | 
             
                # HTTP methods without a body
         | 
| 129 141 | 
             
                def delete(path, headers = {})
         | 
| 130 142 | 
             
                  request(:delete, path, nil, merge_default_headers(headers))
         | 
| @@ -0,0 +1,74 @@ | |
| 1 | 
            +
            module JIRA
         | 
| 2 | 
            +
              module Resource
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                class AgileboardFactory < JIRA::BaseFactory # :nodoc:
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                class Agileboard < JIRA::Base
         | 
| 8 | 
            +
                  has_one :filter
         | 
| 9 | 
            +
                  has_one :boardAdmin, :class => JIRA::Resource::User
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  # override population for different responses from jira
         | 
| 12 | 
            +
                  def self.populate(client, options, json)
         | 
| 13 | 
            +
                    if json['views']
         | 
| 14 | 
            +
                      json = json['views']
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    super
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  # override collection path for different API endpoint
         | 
| 21 | 
            +
                  def self.collection_path(client, prefix = '/')
         | 
| 22 | 
            +
                     '/rest/greenhopper/1.0/rapidviews/list'
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  # get all issues of agile board
         | 
| 26 | 
            +
                  def issues
         | 
| 27 | 
            +
                    search_url = client.options[:site] + 
         | 
| 28 | 
            +
                                 '/rest/greenhopper/1.0/xboard/work/allData/?rapidViewId=' + attrs['id'].to_s
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    response = client.get(search_url)
         | 
| 31 | 
            +
                    json = self.class.parse_json(response.body)
         | 
| 32 | 
            +
                    json['issues'].map do |issue|
         | 
| 33 | 
            +
                      client.Issue.build(issue)
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  # get all sprints of agile board
         | 
| 38 | 
            +
                  def sprints
         | 
| 39 | 
            +
                    search_url = client.options[:site] + '/rest/greenhopper/1.0/sprintquery/' + attrs['id'].to_s
         | 
| 40 | 
            +
                    response = client.get(search_url)
         | 
| 41 | 
            +
                    json = self.class.parse_json(response.body)
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    vels = velocities
         | 
| 44 | 
            +
                    json['sprints'].map do |sprint|
         | 
| 45 | 
            +
                      velocity = vels.select { |vel| vel.sprint_id.to_s == sprint["id"].to_s }.first
         | 
| 46 | 
            +
                      sprint["velocity"] = velocity
         | 
| 47 | 
            +
                      client.Sprint.build(sprint)
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  # get velocities of agile board
         | 
| 52 | 
            +
                  def velocities
         | 
| 53 | 
            +
                    search_url = client.options[:site] + 
         | 
| 54 | 
            +
                                 '/rest/greenhopper/1.0/rapid/charts/velocity.json?rapidViewId=' + id.to_s
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    begin
         | 
| 57 | 
            +
                      response = client.get(search_url)
         | 
| 58 | 
            +
                    rescue
         | 
| 59 | 
            +
                      return []
         | 
| 60 | 
            +
                    end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    json = self.class.parse_json(response.body)
         | 
| 63 | 
            +
                    json['velocityStatEntries'].map do |velocity|
         | 
| 64 | 
            +
                      client.Velocity.build({
         | 
| 65 | 
            +
                        "sprint_id" => velocity[0],
         | 
| 66 | 
            +
                        "estimated" => velocity[1]['estimated']['value'],
         | 
| 67 | 
            +
                        "completed" => velocity[1]['completed']['value']
         | 
| 68 | 
            +
                      })
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                  
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
              end
         | 
| 74 | 
            +
            end
         | 
| @@ -26,6 +26,20 @@ module JIRA | |
| 26 26 | 
             
                      client.Issue.build(issue)
         | 
| 27 27 | 
             
                    end
         | 
| 28 28 | 
             
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  # Returns all sprints for this project
         | 
| 31 | 
            +
                  def sprints
         | 
| 32 | 
            +
                    search_url = client.options[:site] + 
         | 
| 33 | 
            +
                                 '/rest/greenhopper/1.0/integration/teamcalendars/sprint/list?jql=project=' + key
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    response = client.get(search_url)
         | 
| 36 | 
            +
                    json = self.class.parse_json(response.body)
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    json["sprints"].map do |sprint|
         | 
| 39 | 
            +
                      client.Sprint.build(sprint)
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 29 43 | 
             
                end
         | 
| 30 44 | 
             
              end
         | 
| 31 45 | 
             
            end
         | 
| @@ -0,0 +1,81 @@ | |
| 1 | 
            +
            module JIRA
         | 
| 2 | 
            +
              module Resource
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                class SprintFactory < JIRA::BaseFactory # :nodoc:
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                class Sprint < JIRA::Base
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  # get all issues of sprint
         | 
| 10 | 
            +
                  def issues
         | 
| 11 | 
            +
                    jql = "sprint = " + id
         | 
| 12 | 
            +
                    Issue.jql(client, jql)
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  # get rapid view id
         | 
| 16 | 
            +
                  def agileboard_id
         | 
| 17 | 
            +
                    search_url = client.options[:site] + "/secure/GHGoToBoard.jspa?sprintId=" + id.to_s
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    begin
         | 
| 20 | 
            +
                      response = client.get(search_url)
         | 
| 21 | 
            +
                    rescue JIRA::HTTPError => error
         | 
| 22 | 
            +
                      unless error.response.instance_of? Net::HTTPFound
         | 
| 23 | 
            +
                        return
         | 
| 24 | 
            +
                      end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      rapid_view_match = /rapidView=(\d+)&/.match(error.response['location'])
         | 
| 27 | 
            +
                      if rapid_view_match != nil
         | 
| 28 | 
            +
                        return rapid_view_match[1]
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  def velocity=(velocity)
         | 
| 34 | 
            +
                    @attrs["velocity"] = velocity
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  def velocity
         | 
| 38 | 
            +
                    unless attrs.keys.include? "velocity"
         | 
| 39 | 
            +
                      @attrs["velocity"] = get_velocity
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    @attrs["velocity"]
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  private
         | 
| 46 | 
            +
                  def get_velocity
         | 
| 47 | 
            +
                    search_url = client.options[:site] + 
         | 
| 48 | 
            +
                                 '/rest/greenhopper/1.0/rapid/charts/velocity.json?rapidViewId=' + agileboard_id.to_s
         | 
| 49 | 
            +
                    begin
         | 
| 50 | 
            +
                      response = client.get(search_url).body
         | 
| 51 | 
            +
                    rescue
         | 
| 52 | 
            +
                      return empty_velocity
         | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    json = self.class.parse_json(response)
         | 
| 56 | 
            +
                    resultVelocity = json['velocityStatEntries'].select do |sprint_id|
         | 
| 57 | 
            +
                      sprint_id.to_i == id.to_i
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
                    
         | 
| 60 | 
            +
                    if resultVelocity.length == 0
         | 
| 61 | 
            +
                      return empty_velocity
         | 
| 62 | 
            +
                    end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                    client.Velocity.build({
         | 
| 65 | 
            +
                      "sprint_id" => id,
         | 
| 66 | 
            +
                      "estimated" => resultVelocity[id.to_s]['estimated']['value'],
         | 
| 67 | 
            +
                      "completed" => resultVelocity[id.to_s]['completed']['value']
         | 
| 68 | 
            +
                    })
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  def empty_velocity
         | 
| 72 | 
            +
                    client.Velocity.build({
         | 
| 73 | 
            +
                      "sprint_id" => id,
         | 
| 74 | 
            +
                      "estimated" => 0,
         | 
| 75 | 
            +
                      "completed" => 0
         | 
| 76 | 
            +
                    })
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
            end
         | 
    
        data/lib/jira/version.rb
    CHANGED
    
    
    
        data/lib/jira.rb
    CHANGED
    
    | @@ -17,13 +17,16 @@ require 'jira/resource/issuetype' | |
| 17 17 | 
             
            require 'jira/resource/version'
         | 
| 18 18 | 
             
            require 'jira/resource/status'
         | 
| 19 19 | 
             
            require 'jira/resource/transition'
         | 
| 20 | 
            +
            require 'jira/resource/filter'
         | 
| 21 | 
            +
            require 'jira/resource/velocity'
         | 
| 22 | 
            +
            require 'jira/resource/sprint'
         | 
| 20 23 | 
             
            require 'jira/resource/project'
         | 
| 21 24 | 
             
            require 'jira/resource/priority'
         | 
| 22 25 | 
             
            require 'jira/resource/comment'
         | 
| 23 26 | 
             
            require 'jira/resource/worklog'
         | 
| 24 27 | 
             
            require 'jira/resource/issue'
         | 
| 25 | 
            -
            require 'jira/resource/filter'
         | 
| 26 28 | 
             
            require 'jira/resource/field'
         | 
| 29 | 
            +
            require 'jira/resource/agileboard'
         | 
| 27 30 |  | 
| 28 31 | 
             
            require 'jira/request_client'
         | 
| 29 32 | 
             
            require 'jira/oauth_client'
         | 
| @@ -3,7 +3,8 @@ require 'spec_helper' | |
| 3 3 | 
             
            describe JIRA::Resource::Project do
         | 
| 4 4 |  | 
| 5 5 | 
             
              let(:client) { double("client", :options => {
         | 
| 6 | 
            -
                                      :rest_base_path => '/jira/rest/api/2'
         | 
| 6 | 
            +
                                      :rest_base_path => '/jira/rest/api/2',
         | 
| 7 | 
            +
                                      :site => 'https://example.com'
         | 
| 7 8 | 
             
                                    })
         | 
| 8 9 | 
             
              }
         | 
| 9 10 |  | 
| @@ -67,4 +68,27 @@ describe JIRA::Resource::Project do | |
| 67 68 | 
             
                  end
         | 
| 68 69 | 
             
                end
         | 
| 69 70 | 
             
              end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              describe "sprints" do
         | 
| 73 | 
            +
                subject {
         | 
| 74 | 
            +
                  JIRA::Resource::Project.new(client, :attrs => {
         | 
| 75 | 
            +
                      'key'         => 'test'
         | 
| 76 | 
            +
                    })
         | 
| 77 | 
            +
                }
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                it "returns sprints" do
         | 
| 80 | 
            +
                  response_body = '{"expand":"schema,names","startAt":0,"maxResults":1,"total":1,"sprints":[{"expand":"editmeta,renderedFields,transitions,changelog,operations","id":"53062","self":"/rest/api/2/issue/53062","key":"test key","fields":{"summary":"test summary"}}]}'
         | 
| 81 | 
            +
                  response = double("response",
         | 
| 82 | 
            +
                    :body => response_body)
         | 
| 83 | 
            +
                  sprint_factory = double("sprint factory")
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  client.should_receive(:get)
         | 
| 86 | 
            +
                    .with('https://example.com/rest/greenhopper/1.0/integration/teamcalendars/sprint/list?jql=project=test')
         | 
| 87 | 
            +
                    .and_return(response)
         | 
| 88 | 
            +
                  client.should_receive(:Sprint).and_return(sprint_factory)
         | 
| 89 | 
            +
                  sprint_factory.should_receive(:build)
         | 
| 90 | 
            +
                    .with(JSON.parse(response_body)["sprints"][0])
         | 
| 91 | 
            +
                  subject.sprints
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
              end
         | 
| 70 94 | 
             
            end
         | 
| @@ -0,0 +1,63 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe JIRA::Resource::Sprint do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              let(:client) { double("client", :options => {
         | 
| 6 | 
            +
                                      :rest_base_path => '/jira/rest/api/2',
         | 
| 7 | 
            +
                                      :site => 'https://example.com'
         | 
| 8 | 
            +
                                    })
         | 
| 9 | 
            +
              }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              describe "relationships" do
         | 
| 12 | 
            +
                subject {
         | 
| 13 | 
            +
                  JIRA::Resource::Sprint.new(client, :attrs => {
         | 
| 14 | 
            +
                      'filter'        => {'foo' => 'bar'},
         | 
| 15 | 
            +
                      'boardAdmin'  => {'foo' =>'bar'}
         | 
| 16 | 
            +
                  })
         | 
| 17 | 
            +
                }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                it "has the correct relationships" do
         | 
| 20 | 
            +
                  subject.should have_one(:filter, JIRA::Resource::Filter)
         | 
| 21 | 
            +
                  subject.filter.foo.should == 'bar'
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  subject.should have_one(:boardAdmin, JIRA::Resource::User)
         | 
| 24 | 
            +
                  subject.boardAdmin.foo.should == "bar"
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
             
         | 
| 29 | 
            +
              describe "collection_path" do
         | 
| 30 | 
            +
                subject {
         | 
| 31 | 
            +
                  JIRA::Resource::Sprint
         | 
| 32 | 
            +
                }
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                it "should have the correct collection path" do
         | 
| 35 | 
            +
                  collection_path = JIRA::Resource::Sprint.collection_path(client)
         | 
| 36 | 
            +
                  collection_path.should == '/rest/greenhopper/1.0/rapidviews/list'
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              describe "issues" do
         | 
| 41 | 
            +
                subject {
         | 
| 42 | 
            +
                  JIRA::Resource::Sprint.new(client, :attrs => {
         | 
| 43 | 
            +
                      'id'         => '42'
         | 
| 44 | 
            +
                    })
         | 
| 45 | 
            +
                }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                it "returns issues" do
         | 
| 48 | 
            +
                  response_body = '{"expand":"names,schema","startAt":0,"maxResults":1,"total":299,"issues":[{"expand":"editmeta,renderedFields,transitions,changelog,operations","id":"865585","self":"https://thisisdmg.atlassian.net/rest/api/2/issue/865585","key":"GHPOO-2728","fields":{"summary":"Touch | Produktberater | Beim ersten Mal Verändern des Jahrgangssliders wird die Ergbnissemenge nicht korrekt gesetzt.","progress":{"progress":300,"total":300,"percent":100},"issuetype":{"self":"https://thisisdmg.atlassian.net/rest/api/2/issuetype/1","id":"1","description":"A problem which impairs or prevents the functions of the product.","iconUrl":"https://thisisdmg.atlassian.net/images/icons/issuetypes/bug.png","name":"Bug","subtask":false},"timespent":300,"reporter":{"self":"https://thisisdmg.atlassian.net/rest/api/2/user?username=heinemann_c.gewalt","name":"heinemann_c.gewalt","emailAddress":"c.gewalt@nextpilgrims.com","avatarUrls":{"16x16":"https://thisisdmg.atlassian.net/secure/useravatar?size=xsmall&avatarId=10122","24x24":"https://thisisdmg.atlassian.net/secure/useravatar?size=small&avatarId=10122","32x32":"https://thisisdmg.atlassian.net/secure/useravatar?size=medium&avatarId=10122","48x48":"https://thisisdmg.atlassian.net/secure/useravatar?avatarId=10122"},"displayName":"Christian Gewalt","active":true},"created":"2014-04-02T14:02:43.000+0200","updated":"2014-04-14T16:00:37.000+0200","description":"Beim ersten Mal Verändern des Jahrgangssliders wird die Ergbnissemenge nicht korrekt gesetzt. Danach funktioniert es dann. ","priority":{"self":"https://thisisdmg.atlassian.net/rest/api/2/priority/3","iconUrl":"https://thisisdmg.atlassian.net/images/icons/priorities/major.png","name":"Major","id":"3"},"customfield_10001":"2014-04-14 16:00:37.849","customfield_10002":null,"customfield_10003":null,"issuelinks":[],"customfield_10000":"1_*:*_1_*:*_596873640_*|*_5_*:*_1_*:*_0","subtasks":[],"customfield_10008":null,"customfield_10007":null,"status":{"self":"https://thisisdmg.atlassian.net/rest/api/2/status/6","description":"The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.","iconUrl":"https://thisisdmg.atlassian.net/images/icons/statuses/closed.png","name":"Closed","id":"6","statusCategory":{"self":"https://thisisdmg.atlassian.net/rest/api/2/statuscategory/3","id":3,"key":"done","colorName":"green","name":"Complete"}},"customfield_10006":"349","labels":["Kundenfeedback","TouchScreen"],"workratio":-1,"project":{"self":"https://thisisdmg.atlassian.net/rest/api/2/project/13600","id":"13600","key":"GHPOO","name":"Gebrüder Heinemann - DIA","avatarUrls":{"16x16":"https://thisisdmg.atlassian.net/secure/projectavatar?size=xsmall&pid=13600&avatarId=10011","24x24":"https://thisisdmg.atlassian.net/secure/projectavatar?size=small&pid=13600&avatarId=10011","32x32":"https://thisisdmg.atlassian.net/secure/projectavatar?size=medium&pid=13600&avatarId=10011","48x48":"https://thisisdmg.atlassian.net/secure/projectavatar?pid=13600&avatarId=10011"},"projectCategory":{"self":"https://thisisdmg.atlassian.net/rest/api/2/projectCategory/10100","id":"10100","description":"Hier finden sich alle Kundenprojekte","name":"Kunden Projekte"}},"environment":null,"lastViewed":null,"aggregateprogress":{"progress":300,"total":300,"percent":100},"customfield_10012":["com.atlassian.greenhopper.service.sprint.Sprint@1829488[rapidViewId=142,state=CLOSED,name=07.04 - 24.04,startDate=2014-04-07T13:55:52.263+02:00,endDate=2014-04-24T15:00:00.000+02:00,completeDate=2014-04-22T17:30:25.628+02:00,id=642]"],"components":[{"self":"https://thisisdmg.atlassian.net/rest/api/2/component/13904","id":"13904","name":"Technik"}],"customfield_10011":null,"timeoriginalestimate":null,"votes":{"self":"https://thisisdmg.atlassian.net/rest/api/2/issue/GHPOO-2728/votes","votes":0,"hasVoted":false},"resolution":{"self":"https://thisisdmg.atlassian.net/rest/api/2/resolution/5","id":"5","description":"All attempts at reproducing this issue failed, or not enough information was available to reproduce the issue. Reading the code produces no clues as to why this behavior would occur. If more information appears later, please reopen the issue.","name":"Cannot Reproduce"},"fixVersions":[{"self":"https://thisisdmg.atlassian.net/rest/api/2/version/15700","id":"15700","description":"Prototyp","name":"Prototyp","archived":false,"released":false}],"resolutiondate":"2014-04-09T11:50:37.000+0200","creator":{"self":"https://thisisdmg.atlassian.net/rest/api/2/user?username=heinemann_c.gewalt","name":"heinemann_c.gewalt","emailAddress":"c.gewalt@nextpilgrims.com","avatarUrls":{"16x16":"https://thisisdmg.atlassian.net/secure/useravatar?size=xsmall&avatarId=10122","24x24":"https://thisisdmg.atlassian.net/secure/useravatar?size=small&avatarId=10122","32x32":"https://thisisdmg.atlassian.net/secure/useravatar?size=medium&avatarId=10122","48x48":"https://thisisdmg.atlassian.net/secure/useravatar?avatarId=10122"},"displayName":"Christian Gewalt","active":true},"aggregatetimeoriginalestimate":null,"duedate":null,"customfield_10104":null,"customfield_10105":null,"watches":{"self":"https://thisisdmg.atlassian.net/rest/api/2/issue/GHPOO-2728/watchers","watchCount":2,"isWatching":false},"customfield_10103":null,"customfield_10102":null,"customfield_10600":"GHPOO-113","customfield_10101":null,"customfield_10100":null,"assignee":{"self":"https://thisisdmg.atlassian.net/rest/api/2/user?username=l.soeder","name":"l.soeder","emailAddress":"l.soeder@thisisdmg.com","avatarUrls":{"16x16":"https://thisisdmg.atlassian.net/secure/useravatar?size=xsmall&ownerId=l.soeder&avatarId=11302","24x24":"https://thisisdmg.atlassian.net/secure/useravatar?size=small&ownerId=l.soeder&avatarId=11302","32x32":"https://thisisdmg.atlassian.net/secure/useravatar?size=medium&ownerId=l.soeder&avatarId=11302","48x48":"https://thisisdmg.atlassian.net/secure/useravatar?ownerId=l.soeder&avatarId=11302"},"displayName":"Lars Söder","active":true},"aggregatetimeestimate":0,"versions":[{"self":"https://thisisdmg.atlassian.net/rest/api/2/version/15700","id":"15700","description":"Prototyp","name":"Prototyp","archived":false,"released":false},{"self":"https://thisisdmg.atlassian.net/rest/api/2/version/17100","id":"17100","description":"Labshop installation vom 21. März","name":"Prototyp 3. Abnahme","archived":false,"released":true,"releaseDate":"2014-03-21"}],"customfield_10700":null,"customfield_10400":null,"timeestimate":0,"customfield_10300":"Not Started","aggregatetimespent":300}}]}'
         | 
| 49 | 
            +
                  response = double("response",
         | 
| 50 | 
            +
                    :body => response_body)
         | 
| 51 | 
            +
                  issue_factory = double("issue factory")
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  client.should_receive(:get)
         | 
| 54 | 
            +
                    .with('https://example.com/rest/greenhopper/1.0/xboard/work/allData/?rapidViewId=42')
         | 
| 55 | 
            +
                    .and_return(response)
         | 
| 56 | 
            +
                  client.should_receive(:Issue).and_return(issue_factory)
         | 
| 57 | 
            +
                  issue_factory.should_receive(:build)
         | 
| 58 | 
            +
                    .with(JSON.parse(response_body)["issues"][0])
         | 
| 59 | 
            +
                  subject.issues
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: jira-ruby-dmg
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.20
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - ThisIs! DMG
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014-05- | 
| 11 | 
            +
            date: 2014-05-26 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: railties
         | 
| @@ -119,6 +119,7 @@ files: | |
| 119 119 | 
             
            - lib/jira/oauth_client.rb
         | 
| 120 120 | 
             
            - lib/jira/railtie.rb
         | 
| 121 121 | 
             
            - lib/jira/request_client.rb
         | 
| 122 | 
            +
            - lib/jira/resource/agileboard.rb
         | 
| 122 123 | 
             
            - lib/jira/resource/attachment.rb
         | 
| 123 124 | 
             
            - lib/jira/resource/comment.rb
         | 
| 124 125 | 
             
            - lib/jira/resource/component.rb
         | 
| @@ -128,9 +129,11 @@ files: | |
| 128 129 | 
             
            - lib/jira/resource/issuetype.rb
         | 
| 129 130 | 
             
            - lib/jira/resource/priority.rb
         | 
| 130 131 | 
             
            - lib/jira/resource/project.rb
         | 
| 132 | 
            +
            - lib/jira/resource/sprint.rb
         | 
| 131 133 | 
             
            - lib/jira/resource/status.rb
         | 
| 132 134 | 
             
            - lib/jira/resource/transition.rb
         | 
| 133 135 | 
             
            - lib/jira/resource/user.rb
         | 
| 136 | 
            +
            - lib/jira/resource/velocity.rb
         | 
| 134 137 | 
             
            - lib/jira/resource/version.rb
         | 
| 135 138 | 
             
            - lib/jira/resource/worklog.rb
         | 
| 136 139 | 
             
            - lib/jira/tasks.rb
         | 
| @@ -162,6 +165,7 @@ files: | |
| 162 165 | 
             
            - spec/jira/resource/issue_spec.rb
         | 
| 163 166 | 
             
            - spec/jira/resource/project_factory_spec.rb
         | 
| 164 167 | 
             
            - spec/jira/resource/project_spec.rb
         | 
| 168 | 
            +
            - spec/jira/resource/sprint_spec.rb
         | 
| 165 169 | 
             
            - spec/jira/resource/worklog_spec.rb
         | 
| 166 170 | 
             
            - spec/mock_responses/attachment/10000.json
         | 
| 167 171 | 
             
            - spec/mock_responses/component.post.json
         | 
| @@ -256,6 +260,7 @@ test_files: | |
| 256 260 | 
             
            - spec/jira/resource/issue_spec.rb
         | 
| 257 261 | 
             
            - spec/jira/resource/project_factory_spec.rb
         | 
| 258 262 | 
             
            - spec/jira/resource/project_spec.rb
         | 
| 263 | 
            +
            - spec/jira/resource/sprint_spec.rb
         | 
| 259 264 | 
             
            - spec/jira/resource/worklog_spec.rb
         | 
| 260 265 | 
             
            - spec/mock_responses/attachment/10000.json
         | 
| 261 266 | 
             
            - spec/mock_responses/component.post.json
         |