jira-ruby 3.0.0.beta1 → 3.0.0.beta2
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/.github/workflows/CI.yml +1 -0
- data/.github/workflows/codeql.yml +0 -4
- data/.gitignore +3 -1
- data/.rubocop.yml +1 -69
- data/.yardopts +4 -0
- data/lib/jira/base.rb +5 -13
- data/lib/jira/client.rb +59 -4
- data/lib/jira/has_many_proxy.rb +30 -28
- data/lib/jira/http_client.rb +64 -1
- data/lib/jira/oauth_client.rb +62 -0
- data/lib/jira/request_client.rb +26 -1
- data/lib/jira/resource/attachment.rb +88 -3
- data/lib/jira/resource/field.rb +4 -8
- data/lib/jira/resource/issue.rb +64 -4
- data/lib/jira/resource/issue_picker_suggestions.rb +1 -1
- data/lib/jira/resource/issuelink.rb +4 -3
- data/lib/jira/resource/watcher.rb +1 -1
- data/lib/jira/resource/webhook.rb +5 -1
- data/lib/jira/version.rb +1 -1
- data/lib/tasks/generate.rake +1 -1
- data/spec/integration/project_spec.rb +1 -1
- data/spec/integration/rapidview_spec.rb +1 -1
- data/spec/integration/user_spec.rb +12 -3
- data/spec/integration/watcher_spec.rb +6 -2
- data/spec/integration/{webhook.rb → webhook_spec.rb} +8 -1
- data/spec/jira/base_factory_spec.rb +11 -2
- data/spec/jira/base_spec.rb +80 -57
- data/spec/jira/client_spec.rb +20 -18
- data/spec/jira/http_client_spec.rb +2 -2
- data/spec/jira/oauth_client_spec.rb +8 -4
- data/spec/jira/resource/agile_spec.rb +2 -2
- data/spec/jira/resource/attachment_spec.rb +36 -13
- data/spec/jira/resource/board_spec.rb +5 -5
- data/spec/jira/resource/field_spec.rb +23 -24
- data/spec/jira/resource/issue_spec.rb +18 -18
- data/spec/jira/resource/project_spec.rb +6 -6
- data/spec/jira/resource/sprint_spec.rb +20 -8
- data/spec/jira/resource/status_spec.rb +1 -1
- data/spec/jira/resource/user_factory_spec.rb +2 -2
- data/spec/jira/resource/worklog_spec.rb +1 -1
- data/spec/support/clients_helper.rb +2 -2
- data/spec/support/mock_client.rb +9 -0
- data/spec/support/mock_response.rb +8 -0
- metadata +9 -10
| @@ -1,56 +1,55 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe JIRA::Resource::Field do
         | 
| 4 | 
            -
              let(:cache) { OpenStruct.new }
         | 
| 5 | 
            -
             | 
| 6 4 | 
             
              let(:client) do
         | 
| 7 5 | 
             
                client = double(options: { rest_base_path: '/jira/rest/api/2' })
         | 
| 8 6 | 
             
                field = JIRA::Resource::FieldFactory.new(client)
         | 
| 9 7 | 
             
                allow(client).to receive(:Field).and_return(field)
         | 
| 10 | 
            -
                allow(client).to receive(: | 
| 8 | 
            +
                allow(client).to receive(:field_map_cache).and_return(nil)
         | 
| 9 | 
            +
                allow(client).to receive(:field_map_cache=)
         | 
| 11 10 | 
             
                # info about all fields on the client
         | 
| 12 11 | 
             
                allow(client.Field).to receive(:all).and_return([
         | 
| 13 12 | 
             
                                                                  described_class.new(client,
         | 
| 14 13 | 
             
                                                                                      attrs: { 'id' => 'customfield_10666', 'name' => 'Priority', 'custom' => true, 'orderable' => true, 'navigable' => true,
         | 
| 15 | 
            -
             | 
| 14 | 
            +
                                                                                               'searchable' => true, 'clauseNames' => ['cf[10666]', 'Priority'], 'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_666 } }),
         | 
| 16 15 | 
             
                                                                  described_class.new(client,
         | 
| 17 16 | 
             
                                                                                      attrs: { 'id' => 'issuekey', 'name' => 'Key', 'custom' => false, 'orderable' => false,
         | 
| 18 | 
            -
             | 
| 17 | 
            +
                                                                                               'navigable' => true, 'searchable' => false, 'clauseNames' => %w[id issue issuekey key] }),
         | 
| 19 18 | 
             
                                                                  described_class.new(client,
         | 
| 20 19 | 
             
                                                                                      attrs: { 'id' => 'priority', 'name' => 'Priority', 'custom' => false, 'orderable' => true,
         | 
| 21 | 
            -
             | 
| 20 | 
            +
                                                                                               'navigable' => true, 'searchable' => true, 'clauseNames' => ['priority'], 'schema' => { 'type' => 'priority', 'system' => 'priority' } }),
         | 
| 22 21 | 
             
                                                                  described_class.new(client,
         | 
| 23 22 | 
             
                                                                                      attrs: { 'id' => 'summary', 'name' => 'Summary', 'custom' => false, 'orderable' => true,
         | 
| 24 | 
            -
             | 
| 23 | 
            +
                                                                                               'navigable' => true, 'searchable' => true, 'clauseNames' => ['summary'], 'schema' => { 'type' => 'string', 'system' => 'summary' } }),
         | 
| 25 24 | 
             
                                                                  described_class.new(client,
         | 
| 26 25 | 
             
                                                                                      attrs: { 'id' => 'issuetype', 'name' => 'Issue Type', 'custom' => false, 'orderable' => true,
         | 
| 27 | 
            -
             | 
| 26 | 
            +
                                                                                               'navigable' => true, 'searchable' => true, 'clauseNames' => %w[issuetype type], 'schema' => { 'type' => 'issuetype', 'system' => 'issuetype' } }),
         | 
| 28 27 | 
             
                                                                  described_class.new(client,
         | 
| 29 28 | 
             
                                                                                      attrs: { 'id' => 'customfield_10111', 'name' => 'SingleWord', 'custom' => true, 'orderable' => true,
         | 
| 30 | 
            -
             | 
| 29 | 
            +
                                                                                               'navigable' => true, 'searchable' => true, 'clauseNames' => ['cf[10111]', 'SingleWord'],       'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_111 } }),
         | 
| 31 30 | 
             
                                                                  described_class.new(client,
         | 
| 32 31 | 
             
                                                                                      attrs: { 'id' => 'customfield_10222', 'name' => 'Multi Word', 'custom' => true, 'orderable' => true,
         | 
| 33 | 
            -
             | 
| 32 | 
            +
                                                                                               'navigable' => true, 'searchable' => true, 'clauseNames' => ['cf[10222]', 'Multi Word'],       'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_222 } }),
         | 
| 34 33 | 
             
                                                                  described_class.new(client,
         | 
| 35 34 | 
             
                                                                                      attrs: { 'id' => 'customfield_10333', 'name' => 'Why/N@t', 'custom' => true, 'orderable' => true,
         | 
| 36 | 
            -
             | 
| 35 | 
            +
                                                                                               'navigable' => true, 'searchable' => true, 'clauseNames' => ['cf[10333]', 'Why/N@t'],          'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_333 } }),
         | 
| 37 36 | 
             
                                                                  described_class.new(client,
         | 
| 38 37 | 
             
                                                                                      attrs: { 'id' => 'customfield_10444', 'name' => 'SingleWord', 'custom' => true, 'orderable' => true,
         | 
| 39 | 
            -
             | 
| 38 | 
            +
                                                                                               'navigable' => true, 'searchable' => true, 'clauseNames' => ['cf[10444]', 'SingleWord'],       'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_444 } })
         | 
| 40 39 | 
             
                                                                ])
         | 
| 41 40 | 
             
                client
         | 
| 42 41 | 
             
              end
         | 
| 43 42 |  | 
| 44 43 | 
             
              describe 'field_mappings' do
         | 
| 45 | 
            -
                shared_context ' | 
| 44 | 
            +
                shared_context 'with or without mapping' do
         | 
| 46 45 | 
             
                  subject do
         | 
| 47 46 | 
             
                    described_class.new(client, attrs: {
         | 
| 48 47 | 
             
                                          'priority' => 1,
         | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 48 | 
            +
                                          'customfield_10111' => 'data_in_custom_field',
         | 
| 49 | 
            +
                                          'customfield_10222' => 'multi word custom name',
         | 
| 50 | 
            +
                                          'customfield_10333' => 'complex custom name',
         | 
| 51 | 
            +
                                          'customfield_10444' => 'duplicated custom name',
         | 
| 52 | 
            +
                                          'customfield_10666' => 'duplicate of a system name'
         | 
| 54 53 | 
             
                                        })
         | 
| 55 54 | 
             
                  end
         | 
| 56 55 |  | 
| @@ -65,12 +64,12 @@ describe JIRA::Resource::Field do | |
| 65 64 | 
             
                  it 'is not confused by common attribute keys' do
         | 
| 66 65 | 
             
                    expect { subject.name }.to raise_error(NoMethodError)
         | 
| 67 66 | 
             
                    expect { subject.custom }.to raise_error(NoMethodError)
         | 
| 68 | 
            -
                    expect(subject.id).to  | 
| 67 | 
            +
                    expect(subject.id).to be_nil   # picks up ID from the parent -
         | 
| 69 68 | 
             
                  end
         | 
| 70 69 | 
             
                end
         | 
| 71 70 |  | 
| 72 | 
            -
                context ' | 
| 73 | 
            -
                  include_context ' | 
| 71 | 
            +
                context 'when fields are not yet mapped' do
         | 
| 72 | 
            +
                  include_context 'with or without mapping'
         | 
| 74 73 |  | 
| 75 74 | 
             
                  it 'can find a standard field by id' do
         | 
| 76 75 | 
             
                    expect(subject.priority).to eq(1)
         | 
| @@ -87,12 +86,12 @@ describe JIRA::Resource::Field do | |
| 87 86 | 
             
                  it 'is not confused by common attribute keys and raises error' do
         | 
| 88 87 | 
             
                    expect { subject.name }.to raise_error(NoMethodError)
         | 
| 89 88 | 
             
                    expect { subject.custom }.to raise_error(NoMethodError)
         | 
| 90 | 
            -
                    expect(subject.id).to  | 
| 89 | 
            +
                    expect(subject.id).to be_nil   # picks up ID from the parent -
         | 
| 91 90 | 
             
                  end
         | 
| 92 91 | 
             
                end
         | 
| 93 92 |  | 
| 94 | 
            -
                context ' | 
| 95 | 
            -
                  include_context ' | 
| 93 | 
            +
                context 'when fields have been mapped' do
         | 
| 94 | 
            +
                  include_context 'with or without mapping'
         | 
| 96 95 |  | 
| 97 96 | 
             
                  it 'warns of duplicate fields' do
         | 
| 98 97 | 
             
                    expect { client.Field.map_fields }.to output(/renaming as Priority_10666/).to_stderr
         | 
| @@ -7,7 +7,7 @@ describe JIRA::Resource::Issue do | |
| 7 7 | 
             
              let(:client) do
         | 
| 8 8 | 
             
                client = double(options: { rest_base_path: '/jira/rest/api/2' })
         | 
| 9 9 | 
             
                allow(client).to receive(:Field).and_return(JIRA::Resource::FieldFactory.new(client))
         | 
| 10 | 
            -
                allow(client).to receive(: | 
| 10 | 
            +
                allow(client).to receive(:field_map_cache).and_return(nil)
         | 
| 11 11 | 
             
                client
         | 
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| @@ -25,7 +25,7 @@ describe JIRA::Resource::Issue do | |
| 25 25 | 
             
                  end
         | 
| 26 26 |  | 
| 27 27 | 
             
                  it 'responds to key' do
         | 
| 28 | 
            -
                    expect(@decorated.respond_to?(:key)).to  | 
| 28 | 
            +
                    expect(@decorated.respond_to?(:key)).to be(true)
         | 
| 29 29 | 
             
                  end
         | 
| 30 30 |  | 
| 31 31 | 
             
                  it 'does not raise an error' do
         | 
| @@ -51,7 +51,7 @@ describe JIRA::Resource::Issue do | |
| 51 51 | 
             
                expect(client).to receive(:Issue).and_return(issue)
         | 
| 52 52 | 
             
                expect(issue).to receive(:build).with({ 'id' => '1', 'summary' => 'Bugs Everywhere' })
         | 
| 53 53 |  | 
| 54 | 
            -
                 | 
| 54 | 
            +
                described_class.all(client)
         | 
| 55 55 | 
             
              end
         | 
| 56 56 |  | 
| 57 57 | 
             
              it 'finds an issue by key or id' do
         | 
| @@ -113,7 +113,7 @@ describe JIRA::Resource::Issue do | |
| 113 113 |  | 
| 114 114 | 
             
              it 'searches an issue with a jql query string and maxResults equals zero and should return the count of tickets' do
         | 
| 115 115 | 
             
                response = double
         | 
| 116 | 
            -
                 | 
| 116 | 
            +
                double
         | 
| 117 117 |  | 
| 118 118 | 
             
                allow(response).to receive(:body).and_return('{"total": 1, "issues": []}')
         | 
| 119 119 | 
             
                expect(client).to receive(:get)
         | 
| @@ -175,20 +175,20 @@ describe JIRA::Resource::Issue do | |
| 175 175 | 
             
                subject do
         | 
| 176 176 | 
             
                  described_class.new(client, attrs: {
         | 
| 177 177 | 
             
                                        'id' => '123',
         | 
| 178 | 
            -
             | 
| 179 | 
            -
             | 
| 180 | 
            -
             | 
| 181 | 
            -
             | 
| 182 | 
            -
             | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 186 | 
            -
             | 
| 187 | 
            -
             | 
| 188 | 
            -
             | 
| 189 | 
            -
             | 
| 190 | 
            -
             | 
| 191 | 
            -
             | 
| 178 | 
            +
                                        'fields' => {
         | 
| 179 | 
            +
                                          'reporter' => { 'foo' => 'bar' },
         | 
| 180 | 
            +
                                          'assignee' => { 'foo' => 'bar' },
         | 
| 181 | 
            +
                                          'project' => { 'foo' => 'bar' },
         | 
| 182 | 
            +
                                          'priority' => { 'foo' => 'bar' },
         | 
| 183 | 
            +
                                          'issuetype' => { 'foo' => 'bar' },
         | 
| 184 | 
            +
                                          'status' => { 'foo' => 'bar' },
         | 
| 185 | 
            +
                                          'resolution' => { 'foo' => 'bar' },
         | 
| 186 | 
            +
                                          'components' => [{ 'foo' => 'bar' }, { 'baz' => 'flum' }],
         | 
| 187 | 
            +
                                          'versions' => [{ 'foo' => 'bar' }, { 'baz' => 'flum' }],
         | 
| 188 | 
            +
                                          'comment' => { 'comments' => [{ 'foo' => 'bar' }, { 'baz' => 'flum' }] },
         | 
| 189 | 
            +
                                          'attachment' => [{ 'foo' => 'bar' }, { 'baz' => 'flum' }],
         | 
| 190 | 
            +
                                          'worklog' => { 'worklogs' => [{ 'foo' => 'bar' }, { 'baz' => 'flum' }] }
         | 
| 191 | 
            +
                                        }
         | 
| 192 192 | 
             
                                      })
         | 
| 193 193 | 
             
                end
         | 
| 194 194 |  | 
| @@ -11,8 +11,8 @@ describe JIRA::Resource::Project do | |
| 11 11 | 
             
                subject do
         | 
| 12 12 | 
             
                  described_class.new(client, attrs: {
         | 
| 13 13 | 
             
                                        'lead' => { 'foo' => 'bar' },
         | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 14 | 
            +
                                        'issueTypes' => [{ 'foo' => 'bar' }, { 'baz' => 'flum' }],
         | 
| 15 | 
            +
                                        'versions' => [{ 'foo' => 'bar' }, { 'baz' => 'flum' }]
         | 
| 16 16 | 
             
                                      })
         | 
| 17 17 | 
             
                end
         | 
| 18 18 |  | 
| @@ -36,7 +36,7 @@ describe JIRA::Resource::Project do | |
| 36 36 | 
             
                end
         | 
| 37 37 |  | 
| 38 38 | 
             
                it 'returns issues' do
         | 
| 39 | 
            -
                  response_body = '{"expand":"schema,names","startAt":0,"maxResults":1,"total":1,"issues":[{"expand":"editmeta,renderedFields,transitions,changelog,operations","id":"53062","self":"/rest/api/2/issue/53062","key":"test key","fields":{"summary":"test summary"}}]}' | 
| 39 | 
            +
                  response_body = '{"expand":"schema,names","startAt":0,"maxResults":1,"total":1,"issues":[{"expand":"editmeta,renderedFields,transitions,changelog,operations","id":"53062","self":"/rest/api/2/issue/53062","key":"test key","fields":{"summary":"test summary"}}]}'
         | 
| 40 40 | 
             
                  response = double('response',
         | 
| 41 41 | 
             
                                    body: response_body)
         | 
| 42 42 | 
             
                  issue_factory = double('issue factory')
         | 
| @@ -52,7 +52,7 @@ describe JIRA::Resource::Project do | |
| 52 52 |  | 
| 53 53 | 
             
                context 'with changelog' do
         | 
| 54 54 | 
             
                  it 'returns issues' do
         | 
| 55 | 
            -
                    response_body = '{"expand":"schema,names","startAt":0,"maxResults":1,"total":1,"issues":[{"expand":"editmeta,renderedFields,transitions,changelog,operations","id":"53062","self":"/rest/api/2/issue/53062","key":"test key","fields":{"summary":"test summary"},"changelog":{}}]}' | 
| 55 | 
            +
                    response_body = '{"expand":"schema,names","startAt":0,"maxResults":1,"total":1,"issues":[{"expand":"editmeta,renderedFields,transitions,changelog,operations","id":"53062","self":"/rest/api/2/issue/53062","key":"test key","fields":{"summary":"test summary"},"changelog":{}}]}'
         | 
| 56 56 | 
             
                    response = double('response',
         | 
| 57 57 | 
             
                                      body: response_body)
         | 
| 58 58 | 
             
                    issue_factory = double('issue factory')
         | 
| @@ -73,7 +73,7 @@ describe JIRA::Resource::Project do | |
| 73 73 | 
             
                let(:project_key) { SecureRandom.hex }
         | 
| 74 74 | 
             
                let(:response) { double('response', body: '[{}]') }
         | 
| 75 75 |  | 
| 76 | 
            -
                context 'pagination' do
         | 
| 76 | 
            +
                context 'with pagination' do
         | 
| 77 77 | 
             
                  before do
         | 
| 78 78 | 
             
                    user_factory = double('user factory')
         | 
| 79 79 | 
             
                    expect(client).to receive(:User).and_return(user_factory)
         | 
| @@ -113,7 +113,7 @@ describe JIRA::Resource::Project do | |
| 113 113 | 
             
                    max_results = rand(1000)
         | 
| 114 114 |  | 
| 115 115 | 
             
                    expect(client).to receive(:get)
         | 
| 116 | 
            -
                      .with("/jira/rest/api/2/user/assignable/search?project=#{project_key}&startAt=#{start_at}&maxResults=#{max_results}") | 
| 116 | 
            +
                      .with("/jira/rest/api/2/user/assignable/search?project=#{project_key}&startAt=#{start_at}&maxResults=#{max_results}")
         | 
| 117 117 | 
             
                      .and_return(response)
         | 
| 118 118 |  | 
| 119 119 | 
             
                    project.users(start_at:, max_results:)
         | 
| @@ -43,7 +43,9 @@ describe JIRA::Resource::Sprint do | |
| 43 43 | 
             
                    let(:given_attrs) { { start_date: '2016-06-10' } }
         | 
| 44 44 |  | 
| 45 45 | 
             
                    it 'calls save on the super class with the given attributes & agile url' do
         | 
| 46 | 
            -
                       | 
| 46 | 
            +
                      mock_response = double('response', body: '{"id":"123"}')
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                      expect(client).to receive(:post).with(agile_sprint_path, given_attrs.to_json).and_return(mock_response)
         | 
| 47 49 |  | 
| 48 50 | 
             
                      sprint.save(given_attrs)
         | 
| 49 51 | 
             
                    end
         | 
| @@ -51,7 +53,9 @@ describe JIRA::Resource::Sprint do | |
| 51 53 |  | 
| 52 54 | 
             
                  context 'when attributes are not specified' do
         | 
| 53 55 | 
             
                    it 'calls save on the super class with the instance attributes & agile url' do
         | 
| 54 | 
            -
                       | 
| 56 | 
            +
                      mock_response = double('response', body: '{"id":"123"}')
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                      expect(client).to receive(:post).with(agile_sprint_path, instance_attrs.to_json).and_return(mock_response)
         | 
| 55 59 |  | 
| 56 60 | 
             
                      sprint.save
         | 
| 57 61 | 
             
                    end
         | 
| @@ -59,7 +63,9 @@ describe JIRA::Resource::Sprint do | |
| 59 63 |  | 
| 60 64 | 
             
                  context 'when providing the path argument' do
         | 
| 61 65 | 
             
                    it 'ignores it' do
         | 
| 62 | 
            -
                       | 
| 66 | 
            +
                      mock_response = double('response', body: '{"id":"123"}')
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                      expect(client).to receive(:post).with(agile_sprint_path, instance_attrs.to_json).and_return(mock_response)
         | 
| 63 69 |  | 
| 64 70 | 
             
                      sprint.save({}, 'mavenlink.com')
         | 
| 65 71 | 
             
                    end
         | 
| @@ -77,7 +83,9 @@ describe JIRA::Resource::Sprint do | |
| 77 83 | 
             
                    let(:given_attrs) { { start_date: '2016-06-10' } }
         | 
| 78 84 |  | 
| 79 85 | 
             
                    it 'calls save! on the super class with the given attributes & agile url' do
         | 
| 80 | 
            -
                       | 
| 86 | 
            +
                      mock_response = double('response', body: '{"id":"123"}')
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                      expect(client).to receive(:post).with(agile_sprint_path, given_attrs.to_json).and_return(mock_response)
         | 
| 81 89 |  | 
| 82 90 | 
             
                      sprint.save!(given_attrs)
         | 
| 83 91 | 
             
                    end
         | 
| @@ -85,7 +93,9 @@ describe JIRA::Resource::Sprint do | |
| 85 93 |  | 
| 86 94 | 
             
                  context 'when attributes are not specified' do
         | 
| 87 95 | 
             
                    it 'calls save! on the super class with the instance attributes & agile url' do
         | 
| 88 | 
            -
                       | 
| 96 | 
            +
                      mock_response = double('response', body: '{"id":"123"}')
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                      expect(client).to receive(:post).with(agile_sprint_path, instance_attrs.to_json).and_return(mock_response)
         | 
| 89 99 |  | 
| 90 100 | 
             
                      sprint.save!
         | 
| 91 101 | 
             
                    end
         | 
| @@ -93,14 +103,16 @@ describe JIRA::Resource::Sprint do | |
| 93 103 |  | 
| 94 104 | 
             
                  context 'when providing the path argument' do
         | 
| 95 105 | 
             
                    it 'ignores it' do
         | 
| 96 | 
            -
                       | 
| 106 | 
            +
                      mock_response = double('response', body: '{"id":"123"}')
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                      expect(client).to receive(:post).with(agile_sprint_path, instance_attrs.to_json).and_return(mock_response)
         | 
| 97 109 |  | 
| 98 110 | 
             
                      sprint.save!({}, 'mavenlink.com')
         | 
| 99 111 | 
             
                    end
         | 
| 100 112 | 
             
                  end
         | 
| 101 113 | 
             
                end
         | 
| 102 114 |  | 
| 103 | 
            -
                context 'an issue exists' do
         | 
| 115 | 
            +
                context 'when an issue exists' do
         | 
| 104 116 | 
             
                  let(:issue_id) { 1001 }
         | 
| 105 117 | 
             
                  let(:post_issue_path) do
         | 
| 106 118 | 
             
                    described_class.agile_path(client, sprint.id)
         | 
| @@ -126,7 +138,7 @@ describe JIRA::Resource::Sprint do | |
| 126 138 | 
             
                  end
         | 
| 127 139 | 
             
                end
         | 
| 128 140 |  | 
| 129 | 
            -
                context 'multiple issues  | 
| 141 | 
            +
                context 'when multiple issues exist' do
         | 
| 130 142 | 
             
                  let(:issue_ids) { [1001, 1012] }
         | 
| 131 143 | 
             
                  let(:post_issue_path) do
         | 
| 132 144 | 
             
                    described_class.agile_path(client, sprint.id)
         | 
| @@ -4,7 +4,7 @@ describe JIRA::Resource::Status do | |
| 4 4 | 
             
              let(:client) do
         | 
| 5 5 | 
             
                client = double(options: { rest_base_path: '/jira/rest/api/2' })
         | 
| 6 6 | 
             
                allow(client).to receive(:Field).and_return(JIRA::Resource::FieldFactory.new(client))
         | 
| 7 | 
            -
                allow(client).to receive(: | 
| 7 | 
            +
                allow(client).to receive(:field_map_cache).and_return(nil)
         | 
| 8 8 | 
             
                client
         | 
| 9 9 | 
             
              end
         | 
| 10 10 |  | 
| @@ -4,13 +4,13 @@ describe JIRA::Resource::UserFactory do | |
| 4 4 | 
             
              subject { described_class.new(client) }
         | 
| 5 5 |  | 
| 6 6 | 
             
              let(:client) do
         | 
| 7 | 
            -
                instance_double( | 
| 7 | 
            +
                instance_double(Client, options: { rest_base_path: '/jira/rest/api/2' })
         | 
| 8 8 | 
             
              end
         | 
| 9 9 |  | 
| 10 10 | 
             
              describe '#myself' do
         | 
| 11 11 | 
             
                let(:response) do
         | 
| 12 12 | 
             
                  instance_double(
         | 
| 13 | 
            -
                     | 
| 13 | 
            +
                    Response, body: get_mock_response('user_accountId=1234567890abcdef01234567.json')
         | 
| 14 14 | 
             
                  )
         | 
| 15 15 | 
             
                end
         | 
| 16 16 |  | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            module ClientsHelper
         | 
| 2 | 
            -
              def with_each_client(& | 
| 2 | 
            +
              def with_each_client(&)
         | 
| 3 3 | 
             
                clients = {}
         | 
| 4 4 |  | 
| 5 5 | 
             
                oauth_client = JIRA::Client.new(consumer_key: 'foo', consumer_secret: 'bar')
         | 
| @@ -9,6 +9,6 @@ module ClientsHelper | |
| 9 9 | 
             
                basic_client = JIRA::Client.new(username: 'foo', password: 'bar', auth_type: :basic, use_ssl: false)
         | 
| 10 10 | 
             
                clients['http://localhost:2990'] = basic_client
         | 
| 11 11 |  | 
| 12 | 
            -
                clients.each(& | 
| 12 | 
            +
                clients.each(&)
         | 
| 13 13 | 
             
              end
         | 
| 14 14 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,15 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: jira-ruby
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3.0.0. | 
| 4 | 
            +
              version: 3.0.0.beta2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - SUMO Heavy Industries
         | 
| 8 8 | 
             
            - test IO
         | 
| 9 | 
            -
            autorequire:
         | 
| 10 9 | 
             
            bindir: bin
         | 
| 11 10 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 11 | 
            +
            date: 2025-03-11 00:00:00.000000000 Z
         | 
| 13 12 | 
             
            dependencies:
         | 
| 14 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 14 | 
             
              name: activesupport
         | 
| @@ -68,7 +67,6 @@ dependencies: | |
| 68 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 69 68 | 
             
                    version: '1.0'
         | 
| 70 69 | 
             
            description: API for JIRA
         | 
| 71 | 
            -
            email:
         | 
| 72 70 | 
             
            executables: []
         | 
| 73 71 | 
             
            extensions: []
         | 
| 74 72 | 
             
            extra_rdoc_files: []
         | 
| @@ -81,6 +79,7 @@ files: | |
| 81 79 | 
             
            - ".github/workflows/rubocop.yml"
         | 
| 82 80 | 
             
            - ".gitignore"
         | 
| 83 81 | 
             
            - ".rubocop.yml"
         | 
| 82 | 
            +
            - ".yardopts"
         | 
| 84 83 | 
             
            - Gemfile
         | 
| 85 84 | 
             
            - Guardfile
         | 
| 86 85 | 
             
            - LICENSE
         | 
| @@ -150,7 +149,7 @@ files: | |
| 150 149 | 
             
            - spec/integration/user_spec.rb
         | 
| 151 150 | 
             
            - spec/integration/version_spec.rb
         | 
| 152 151 | 
             
            - spec/integration/watcher_spec.rb
         | 
| 153 | 
            -
            - spec/integration/ | 
| 152 | 
            +
            - spec/integration/webhook_spec.rb
         | 
| 154 153 | 
             
            - spec/integration/worklog_spec.rb
         | 
| 155 154 | 
             
            - spec/jira/base_factory_spec.rb
         | 
| 156 155 | 
             
            - spec/jira/base_spec.rb
         | 
| @@ -237,6 +236,8 @@ files: | |
| 237 236 | 
             
            - spec/support/matchers/have_attributes.rb
         | 
| 238 237 | 
             
            - spec/support/matchers/have_many.rb
         | 
| 239 238 | 
             
            - spec/support/matchers/have_one.rb
         | 
| 239 | 
            +
            - spec/support/mock_client.rb
         | 
| 240 | 
            +
            - spec/support/mock_response.rb
         | 
| 240 241 | 
             
            - spec/support/shared_examples/integration.rb
         | 
| 241 242 | 
             
            homepage: http://www.sumoheavy.com
         | 
| 242 243 | 
             
            licenses:
         | 
| @@ -244,7 +245,6 @@ licenses: | |
| 244 245 | 
             
            metadata:
         | 
| 245 246 | 
             
              source_code_uri: https://github.com/sumoheavy/jira-ruby
         | 
| 246 247 | 
             
              rubygems_mfa_required: 'true'
         | 
| 247 | 
            -
            post_install_message:
         | 
| 248 248 | 
             
            rdoc_options: []
         | 
| 249 249 | 
             
            require_paths:
         | 
| 250 250 | 
             
            - lib
         | 
| @@ -255,12 +255,11 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 255 255 | 
             
                  version: 3.1.0
         | 
| 256 256 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 257 257 | 
             
              requirements:
         | 
| 258 | 
            -
              - - " | 
| 258 | 
            +
              - - ">="
         | 
| 259 259 | 
             
                - !ruby/object:Gem::Version
         | 
| 260 | 
            -
                  version:  | 
| 260 | 
            +
                  version: '0'
         | 
| 261 261 | 
             
            requirements: []
         | 
| 262 | 
            -
            rubygems_version: 3. | 
| 263 | 
            -
            signing_key:
         | 
| 262 | 
            +
            rubygems_version: 3.6.2
         | 
| 264 263 | 
             
            specification_version: 4
         | 
| 265 264 | 
             
            summary: Ruby Gem for use with the Atlassian JIRA REST API
         | 
| 266 265 | 
             
            test_files: []
         |