jira-ruby 1.2.0 → 2.3.0
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 +5 -5
 - data/.gitignore +3 -0
 - data/.travis.yml +5 -3
 - data/Gemfile +7 -1
 - data/Guardfile +1 -1
 - data/README.md +452 -0
 - data/Rakefile +6 -7
 - data/example.rb +23 -1
 - data/http-basic-example.rb +13 -12
 - data/jira-ruby.gemspec +13 -13
 - data/lib/jira/base.rb +53 -52
 - data/lib/jira/base_factory.rb +3 -6
 - data/lib/jira/client.rb +127 -30
 - data/lib/jira/has_many_proxy.rb +0 -1
 - data/lib/jira/http_client.rb +54 -16
 - data/lib/jira/http_error.rb +3 -5
 - data/lib/jira/jwt_client.rb +67 -0
 - data/lib/jira/oauth_client.rb +47 -17
 - data/lib/jira/request_client.rb +16 -5
 - data/lib/jira/resource/agile.rb +34 -9
 - data/lib/jira/resource/applinks.rb +5 -8
 - data/lib/jira/resource/attachment.rb +41 -3
 - data/lib/jira/resource/board.rb +91 -0
 - data/lib/jira/resource/board_configuration.rb +9 -0
 - data/lib/jira/resource/comment.rb +0 -2
 - data/lib/jira/resource/component.rb +1 -3
 - data/lib/jira/resource/createmeta.rb +12 -14
 - data/lib/jira/resource/field.rb +22 -22
 - data/lib/jira/resource/filter.rb +2 -2
 - data/lib/jira/resource/issue.rb +69 -38
 - data/lib/jira/resource/issue_picker_suggestions.rb +24 -0
 - data/lib/jira/resource/issue_picker_suggestions_issue.rb +10 -0
 - data/lib/jira/resource/issuelink.rb +3 -5
 - data/lib/jira/resource/issuelinktype.rb +0 -1
 - data/lib/jira/resource/issuetype.rb +1 -3
 - data/lib/jira/resource/priority.rb +1 -3
 - data/lib/jira/resource/project.rb +5 -7
 - data/lib/jira/resource/rapidview.rb +28 -7
 - data/lib/jira/resource/remotelink.rb +1 -4
 - data/lib/jira/resource/resolution.rb +2 -4
 - data/lib/jira/resource/serverinfo.rb +1 -2
 - data/lib/jira/resource/sprint.rb +86 -17
 - data/lib/jira/resource/sprint_report.rb +8 -0
 - data/lib/jira/resource/status.rb +1 -3
 - data/lib/jira/resource/suggested_issue.rb +9 -0
 - data/lib/jira/resource/transition.rb +2 -6
 - data/lib/jira/resource/user.rb +12 -2
 - data/lib/jira/resource/version.rb +1 -3
 - data/lib/jira/resource/watcher.rb +35 -0
 - data/lib/jira/resource/webhook.rb +3 -6
 - data/lib/jira/resource/worklog.rb +3 -5
 - data/lib/jira/version.rb +1 -1
 - data/lib/jira-ruby.rb +12 -2
 - data/lib/tasks/generate.rake +4 -4
 - data/spec/integration/attachment_spec.rb +17 -8
 - data/spec/integration/comment_spec.rb +31 -34
 - data/spec/integration/component_spec.rb +21 -24
 - data/spec/integration/field_spec.rb +15 -18
 - data/spec/integration/issue_spec.rb +45 -46
 - data/spec/integration/issuelinktype_spec.rb +8 -11
 - data/spec/integration/issuetype_spec.rb +5 -7
 - data/spec/integration/priority_spec.rb +5 -8
 - data/spec/integration/project_spec.rb +13 -20
 - data/spec/integration/rapidview_spec.rb +17 -10
 - data/spec/integration/resolution_spec.rb +7 -10
 - data/spec/integration/status_spec.rb +5 -8
 - data/spec/integration/transition_spec.rb +17 -20
 - data/spec/integration/user_spec.rb +24 -8
 - data/spec/integration/version_spec.rb +21 -25
 - data/spec/integration/watcher_spec.rb +62 -0
 - data/spec/integration/webhook.rb +8 -17
 - data/spec/integration/worklog_spec.rb +30 -34
 - data/spec/jira/base_factory_spec.rb +11 -12
 - data/spec/jira/base_spec.rb +216 -229
 - data/spec/jira/client_spec.rb +227 -159
 - data/spec/jira/has_many_proxy_spec.rb +11 -12
 - data/spec/jira/http_client_spec.rb +254 -31
 - data/spec/jira/http_error_spec.rb +7 -9
 - data/spec/jira/jwt_uri_builder_spec.rb +59 -0
 - data/spec/jira/oauth_client_spec.rb +110 -39
 - data/spec/jira/request_client_spec.rb +36 -9
 - data/spec/jira/resource/agile_spec.rb +135 -0
 - data/spec/jira/resource/attachment_spec.rb +127 -9
 - data/spec/jira/resource/board_spec.rb +224 -0
 - data/spec/jira/resource/createmeta_spec.rb +29 -32
 - data/spec/jira/resource/field_spec.rb +42 -48
 - data/spec/jira/resource/filter_spec.rb +40 -40
 - data/spec/jira/resource/issue_picker_suggestions_spec.rb +79 -0
 - data/spec/jira/resource/issue_spec.rb +88 -85
 - data/spec/jira/resource/issuelink_spec.rb +1 -1
 - data/spec/jira/resource/jira_picker_suggestions_issue_spec.rb +18 -0
 - data/spec/jira/resource/project_factory_spec.rb +2 -4
 - data/spec/jira/resource/project_spec.rb +33 -33
 - data/spec/jira/resource/sprint_spec.rb +90 -0
 - data/spec/jira/resource/user_factory_spec.rb +6 -8
 - data/spec/jira/resource/worklog_spec.rb +9 -11
 - data/spec/mock_responses/board/1.json +33 -0
 - data/spec/mock_responses/board/1_issues.json +62 -0
 - data/spec/mock_responses/empty_issues.json +8 -0
 - data/spec/mock_responses/issue/10002/watchers.json +13 -0
 - data/spec/mock_responses/issue.json +1 -1
 - data/spec/mock_responses/sprint/1_issues.json +125 -0
 - data/spec/spec_helper.rb +8 -9
 - data/spec/support/clients_helper.rb +4 -4
 - data/spec/support/shared_examples/integration.rb +60 -77
 - metadata +115 -55
 - data/.ruby-version +0 -1
 - data/README.rdoc +0 -333
 - /data/spec/mock_responses/{attachment → issue/10002/attachments}/10000.json +0 -0
 
    
        data/lib/jira/resource/sprint.rb
    CHANGED
    
    | 
         @@ -1,36 +1,105 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'cgi'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
1 
     | 
    
         
             
            module JIRA
         
     | 
| 
       4 
2 
     | 
    
         
             
              module Resource
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
3 
     | 
    
         
             
                class SprintFactory < JIRA::BaseFactory # :nodoc:
         
     | 
| 
       7 
4 
     | 
    
         
             
                end
         
     | 
| 
       8 
5 
     | 
    
         | 
| 
       9 
6 
     | 
    
         
             
                class Sprint < JIRA::Base
         
     | 
| 
      
 7 
     | 
    
         
            +
                  def self.find(client, key)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    response = client.get(agile_path(client, key))
         
     | 
| 
      
 9 
     | 
    
         
            +
                    json = parse_json(response.body)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    client.Sprint.build(json)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
                   
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                     
     | 
| 
      
 13 
     | 
    
         
            +
                  # get all issues of sprint
         
     | 
| 
      
 14 
     | 
    
         
            +
                  def issues(options = {})
         
     | 
| 
      
 15 
     | 
    
         
            +
                    jql = 'sprint = ' + id.to_s
         
     | 
| 
      
 16 
     | 
    
         
            +
                    jql += " and updated >= '#{options[:updated]}'" if options[:updated]
         
     | 
| 
      
 17 
     | 
    
         
            +
                    Issue.jql(client, jql)
         
     | 
| 
       14 
18 
     | 
    
         
             
                  end
         
     | 
| 
       15 
19 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
                  def  
     | 
| 
       17 
     | 
    
         
            -
                     
     | 
| 
       18 
     | 
    
         
            -
                     
     | 
| 
       19 
     | 
    
         
            -
                     
     | 
| 
       20 
     | 
    
         
            -
                    parse_json(response.body)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  def add_issue(issue)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    request_body = { issues: [issue.id] }.to_json
         
     | 
| 
      
 22 
     | 
    
         
            +
                    response = client.post("#{agile_path}/issue", request_body)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    true
         
     | 
| 
       21 
24 
     | 
    
         
             
                  end
         
     | 
| 
       22 
25 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
                   
     | 
| 
      
 26 
     | 
    
         
            +
                  def sprint_report
         
     | 
| 
      
 27 
     | 
    
         
            +
                    get_sprint_details_attribute('sprint_report')
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
       24 
29 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
                  def  
     | 
| 
       26 
     | 
    
         
            -
                     
     | 
| 
      
 30 
     | 
    
         
            +
                  def start_date
         
     | 
| 
      
 31 
     | 
    
         
            +
                    get_sprint_details_attribute('start_date')
         
     | 
| 
       27 
32 
     | 
    
         
             
                  end
         
     | 
| 
       28 
33 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
                  def  
     | 
| 
       30 
     | 
    
         
            -
                     
     | 
| 
      
 34 
     | 
    
         
            +
                  def end_date
         
     | 
| 
      
 35 
     | 
    
         
            +
                    get_sprint_details_attribute('end_date')
         
     | 
| 
       31 
36 
     | 
    
         
             
                  end
         
     | 
| 
       32 
37 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
      
 38 
     | 
    
         
            +
                  def complete_date
         
     | 
| 
      
 39 
     | 
    
         
            +
                    get_sprint_details_attribute('complete_date')
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  def get_sprint_details_attribute(attribute_name)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    attribute = instance_variable_get("@#{attribute_name}")
         
     | 
| 
      
 44 
     | 
    
         
            +
                    return attribute if attribute
         
     | 
| 
      
 45 
     | 
    
         
            +
                    get_sprint_details
         
     | 
| 
      
 46 
     | 
    
         
            +
                    instance_variable_get("@#{attribute_name}")
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  def get_sprint_details
         
     | 
| 
      
 50 
     | 
    
         
            +
                    search_url =
         
     | 
| 
      
 51 
     | 
    
         
            +
                      "#{client.options[:site]}#{client.options[:client_path]}/rest/greenhopper/1.0/rapid/charts/sprintreport?rapidViewId=#{rapidview_id}&sprintId=#{id}"
         
     | 
| 
      
 52 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 53 
     | 
    
         
            +
                      response = client.get(search_url)
         
     | 
| 
      
 54 
     | 
    
         
            +
                    rescue StandardError
         
     | 
| 
      
 55 
     | 
    
         
            +
                      return nil
         
     | 
| 
      
 56 
     | 
    
         
            +
                    end
         
     | 
| 
      
 57 
     | 
    
         
            +
                    json = self.class.parse_json(response.body)
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                    @start_date = Date.parse(json['sprint']['startDate']) unless json['sprint']['startDate'] == 'None'
         
     | 
| 
      
 60 
     | 
    
         
            +
                    @end_date = Date.parse(json['sprint']['endDate']) unless json['sprint']['endDate'] == 'None'
         
     | 
| 
      
 61 
     | 
    
         
            +
                    @completed_date = Date.parse(json['sprint']['completeDate']) unless json['sprint']['completeDate'] == 'None'
         
     | 
| 
      
 62 
     | 
    
         
            +
                    @sprint_report = client.SprintReport.build(json['contents'])
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  def rapidview_id
         
     | 
| 
      
 66 
     | 
    
         
            +
                    return @attrs['rapidview_id'] if @attrs['rapidview_id']
         
     | 
| 
      
 67 
     | 
    
         
            +
                    search_url = client.options[:site] + '/secure/GHGoToBoard.jspa?sprintId=' + id.to_s
         
     | 
| 
      
 68 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 69 
     | 
    
         
            +
                      response = client.get(search_url)
         
     | 
| 
      
 70 
     | 
    
         
            +
                    rescue JIRA::HTTPError => error
         
     | 
| 
      
 71 
     | 
    
         
            +
                      return unless error.response.instance_of? Net::HTTPFound
         
     | 
| 
      
 72 
     | 
    
         
            +
                      rapid_view_match = /rapidView=(\d+)&/.match(error.response['location'])
         
     | 
| 
      
 73 
     | 
    
         
            +
                      @attrs['rapidview_id'] = rapid_view_match[1] unless rapid_view_match.nil?
         
     | 
| 
      
 74 
     | 
    
         
            +
                    end
         
     | 
| 
      
 75 
     | 
    
         
            +
                  end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                  def save(attrs = {}, _path = nil)
         
     | 
| 
      
 78 
     | 
    
         
            +
                    attrs = @attrs if attrs.empty?
         
     | 
| 
      
 79 
     | 
    
         
            +
                    super(attrs, agile_path)
         
     | 
| 
      
 80 
     | 
    
         
            +
                  end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                  def save!(attrs = {}, _path = nil)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    attrs = @attrs if attrs.empty?
         
     | 
| 
      
 84 
     | 
    
         
            +
                    super(attrs, agile_path)
         
     | 
| 
      
 85 
     | 
    
         
            +
                  end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                  # WORK IN PROGRESS
         
     | 
| 
      
 88 
     | 
    
         
            +
                  def complete
         
     | 
| 
      
 89 
     | 
    
         
            +
                    complete_url = "#{client.options[:site]}/rest/greenhopper/1.0/sprint/#{id}/complete"
         
     | 
| 
      
 90 
     | 
    
         
            +
                    response = client.put(complete_url)
         
     | 
| 
      
 91 
     | 
    
         
            +
                    self.class.parse_json(response.body)
         
     | 
| 
      
 92 
     | 
    
         
            +
                  end
         
     | 
| 
       34 
93 
     | 
    
         | 
| 
      
 94 
     | 
    
         
            +
                  private
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                  def agile_path
         
     | 
| 
      
 97 
     | 
    
         
            +
                    self.class.agile_path(client, id)
         
     | 
| 
      
 98 
     | 
    
         
            +
                  end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                  def self.agile_path(client, key)
         
     | 
| 
      
 101 
     | 
    
         
            +
                    "#{client.options[:context_path]}/rest/agile/1.0/sprint/#{key}"
         
     | 
| 
      
 102 
     | 
    
         
            +
                  end
         
     | 
| 
      
 103 
     | 
    
         
            +
                end
         
     | 
| 
       35 
104 
     | 
    
         
             
              end
         
     | 
| 
       36 
105 
     | 
    
         
             
            end
         
     | 
    
        data/lib/jira/resource/status.rb
    CHANGED
    
    
| 
         @@ -1,11 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module JIRA
         
     | 
| 
       2 
2 
     | 
    
         
             
              module Resource
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
3 
     | 
    
         
             
                class TransitionFactory < JIRA::BaseFactory # :nodoc:
         
     | 
| 
       5 
4 
     | 
    
         
             
                end
         
     | 
| 
       6 
5 
     | 
    
         | 
| 
       7 
6 
     | 
    
         
             
                class Transition < JIRA::Base
         
     | 
| 
       8 
     | 
    
         
            -
                  has_one :to, : 
     | 
| 
      
 7 
     | 
    
         
            +
                  has_one :to, class: JIRA::Resource::Status
         
     | 
| 
       9 
8 
     | 
    
         
             
                  belongs_to :issue
         
     | 
| 
       10 
9 
     | 
    
         | 
| 
       11 
10 
     | 
    
         
             
                  nested_collections true
         
     | 
| 
         @@ -16,9 +15,7 @@ module JIRA 
     | 
|
| 
       16 
15 
     | 
    
         | 
| 
       17 
16 
     | 
    
         
             
                  def self.all(client, options = {})
         
     | 
| 
       18 
17 
     | 
    
         
             
                    issue = options[:issue]
         
     | 
| 
       19 
     | 
    
         
            -
                    unless issue
         
     | 
| 
       20 
     | 
    
         
            -
                      raise ArgumentError.new("parent issue is required")
         
     | 
| 
       21 
     | 
    
         
            -
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
                    raise ArgumentError, 'parent issue is required' unless issue
         
     | 
| 
       22 
19 
     | 
    
         | 
| 
       23 
20 
     | 
    
         
             
                    path = "#{issue.self}/#{endpoint_name}?expand=transitions.fields"
         
     | 
| 
       24 
21 
     | 
    
         
             
                    response = client.get(path)
         
     | 
| 
         @@ -28,6 +25,5 @@ module JIRA 
     | 
|
| 
       28 
25 
     | 
    
         
             
                    end
         
     | 
| 
       29 
26 
     | 
    
         
             
                  end
         
     | 
| 
       30 
27 
     | 
    
         
             
                end
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
28 
     | 
    
         
             
              end
         
     | 
| 
       33 
29 
     | 
    
         
             
            end
         
     | 
    
        data/lib/jira/resource/user.rb
    CHANGED
    
    | 
         @@ -1,6 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module JIRA
         
     | 
| 
       2 
2 
     | 
    
         
             
              module Resource
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
3 
     | 
    
         
             
                class UserFactory < JIRA::BaseFactory # :nodoc:
         
     | 
| 
       5 
4 
     | 
    
         
             
                  def myself
         
     | 
| 
       6 
5 
     | 
    
         
             
                    instance = build
         
     | 
| 
         @@ -11,10 +10,21 @@ module JIRA 
     | 
|
| 
       11 
10 
     | 
    
         
             
                end
         
     | 
| 
       12 
11 
     | 
    
         | 
| 
       13 
12 
     | 
    
         
             
                class User < JIRA::Base
         
     | 
| 
      
 13 
     | 
    
         
            +
                  MAX_RESULTS = 1000
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       14 
15 
     | 
    
         
             
                  def self.singular_path(client, key, prefix = '/')
         
     | 
| 
       15 
16 
     | 
    
         
             
                    collection_path(client, prefix) + '?username=' + key
         
     | 
| 
       16 
17 
     | 
    
         
             
                  end
         
     | 
| 
       17 
     | 
    
         
            -
                end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
      
 19 
     | 
    
         
            +
                  # Cannot retrieve more than 1,000 users through the api, please see: https://jira.atlassian.com/browse/JRASERVER-65089
         
     | 
| 
      
 20 
     | 
    
         
            +
                  def self.all(client)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    response  = client.get("/rest/api/2/users/search?username=_&maxResults=#{MAX_RESULTS}")
         
     | 
| 
      
 22 
     | 
    
         
            +
                    all_users = JSON.parse(response.body)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                    all_users.flatten.uniq.map do |user|
         
     | 
| 
      
 25 
     | 
    
         
            +
                      client.User.build(user)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    end
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
       19 
29 
     | 
    
         
             
              end
         
     | 
| 
       20 
30 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,35 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module JIRA
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Resource
         
     | 
| 
      
 3 
     | 
    
         
            +
                class WatcherFactory < JIRA::BaseFactory # :nodoc:
         
     | 
| 
      
 4 
     | 
    
         
            +
                end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                class Watcher < JIRA::Base
         
     | 
| 
      
 7 
     | 
    
         
            +
                  belongs_to :issue
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  nested_collections true
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  def self.endpoint_name
         
     | 
| 
      
 12 
     | 
    
         
            +
                    'watchers'
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  def self.all(client, options = {})
         
     | 
| 
      
 16 
     | 
    
         
            +
                    issue = options[:issue]
         
     | 
| 
      
 17 
     | 
    
         
            +
                    raise ArgumentError, 'parent issue is required' unless issue
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    path = "#{issue.self}/#{endpoint_name}"
         
     | 
| 
      
 20 
     | 
    
         
            +
                    response = client.get(path)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    json = parse_json(response.body)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    json['watchers'].map do |watcher|
         
     | 
| 
      
 23 
     | 
    
         
            +
                      issue.watchers.build(watcher)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  def save!(user_id, path = nil)
         
     | 
| 
      
 28 
     | 
    
         
            +
                    path ||= new_record? ? url : patched_url
         
     | 
| 
      
 29 
     | 
    
         
            +
                    response = client.post(path, user_id.to_json)
         
     | 
| 
      
 30 
     | 
    
         
            +
                    true
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,12 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module JIRA
         
     | 
| 
       2 
2 
     | 
    
         
             
              module Resource
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
3 
     | 
    
         
             
                class WebhookFactory < JIRA::BaseFactory # :nodoc:
         
     | 
| 
       5 
4 
     | 
    
         
             
                end
         
     | 
| 
       6 
5 
     | 
    
         | 
| 
       7 
6 
     | 
    
         
             
                class Webhook < JIRA::Base
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                  REST_BASE_PATH = '/rest/webhooks/1.0'
         
     | 
| 
      
 7 
     | 
    
         
            +
                  REST_BASE_PATH = '/rest/webhooks/1.0'.freeze
         
     | 
| 
       10 
8 
     | 
    
         | 
| 
       11 
9 
     | 
    
         
             
                  def self.endpoint_name
         
     | 
| 
       12 
10 
     | 
    
         
             
                    'webhook'
         
     | 
| 
         @@ -17,14 +15,14 @@ module JIRA 
     | 
|
| 
       17 
15 
     | 
    
         
             
                  end
         
     | 
| 
       18 
16 
     | 
    
         | 
| 
       19 
17 
     | 
    
         
             
                  def self.collection_path(client, prefix = '/')
         
     | 
| 
       20 
     | 
    
         
            -
                     
     | 
| 
      
 18 
     | 
    
         
            +
                    full_url(client) + prefix + endpoint_name
         
     | 
| 
       21 
19 
     | 
    
         
             
                  end
         
     | 
| 
       22 
20 
     | 
    
         | 
| 
       23 
21 
     | 
    
         
             
                  def self.all(client, options = {})
         
     | 
| 
       24 
22 
     | 
    
         
             
                    response = client.get(collection_path(client))
         
     | 
| 
       25 
23 
     | 
    
         
             
                    json = parse_json(response.body)
         
     | 
| 
       26 
24 
     | 
    
         
             
                    json.map do |attrs|
         
     | 
| 
       27 
     | 
    
         
            -
                       
     | 
| 
      
 25 
     | 
    
         
            +
                      new(client, { attrs: attrs }.merge(options))
         
     | 
| 
       28 
26 
     | 
    
         
             
                    end
         
     | 
| 
       29 
27 
     | 
    
         
             
                  end
         
     | 
| 
       30 
28 
     | 
    
         | 
| 
         @@ -34,7 +32,6 @@ module JIRA 
     | 
|
| 
       34 
32 
     | 
    
         
             
                  # def self.delete(options={})
         
     | 
| 
       35 
33 
     | 
    
         | 
| 
       36 
34 
     | 
    
         
             
                  # end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
35 
     | 
    
         
             
                end
         
     | 
| 
       39 
36 
     | 
    
         
             
              end
         
     | 
| 
       40 
37 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,16 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module JIRA
         
     | 
| 
       2 
2 
     | 
    
         
             
              module Resource
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
3 
     | 
    
         
             
                class WorklogFactory < JIRA::BaseFactory # :nodoc:
         
     | 
| 
       5 
4 
     | 
    
         
             
                end
         
     | 
| 
       6 
5 
     | 
    
         | 
| 
       7 
6 
     | 
    
         
             
                class Worklog < JIRA::Base
         
     | 
| 
       8 
     | 
    
         
            -
                  has_one :author, : 
     | 
| 
       9 
     | 
    
         
            -
                  has_one :update_author, : 
     | 
| 
       10 
     | 
    
         
            -
                                          : 
     | 
| 
      
 7 
     | 
    
         
            +
                  has_one :author, class: JIRA::Resource::User
         
     | 
| 
      
 8 
     | 
    
         
            +
                  has_one :update_author, class: JIRA::Resource::User,
         
     | 
| 
      
 9 
     | 
    
         
            +
                                          attribute_key: 'updateAuthor'
         
     | 
| 
       11 
10 
     | 
    
         
             
                  belongs_to :issue
         
     | 
| 
       12 
11 
     | 
    
         
             
                  nested_collections true
         
     | 
| 
       13 
12 
     | 
    
         
             
                end
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
13 
     | 
    
         
             
              end
         
     | 
| 
       16 
14 
     | 
    
         
             
            end
         
     | 
    
        data/lib/jira/version.rb
    CHANGED
    
    
    
        data/lib/jira-ruby.rb
    CHANGED
    
    | 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            $LOAD_PATH << __dir__
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            require 'active_support'
         
     | 
| 
       3 
4 
     | 
    
         
             
            require 'active_support/inflector'
         
     | 
| 
       4 
5 
     | 
    
         
             
            ActiveSupport::Inflector.inflections do |inflector|
         
     | 
| 
       5 
6 
     | 
    
         
             
              inflector.singular /status$/, 'status'
         
     | 
| 
         @@ -11,6 +12,7 @@ require 'jira/has_many_proxy' 
     | 
|
| 
       11 
12 
     | 
    
         
             
            require 'jira/http_error'
         
     | 
| 
       12 
13 
     | 
    
         | 
| 
       13 
14 
     | 
    
         
             
            require 'jira/resource/user'
         
     | 
| 
      
 15 
     | 
    
         
            +
            require 'jira/resource/watcher'
         
     | 
| 
       14 
16 
     | 
    
         
             
            require 'jira/resource/attachment'
         
     | 
| 
       15 
17 
     | 
    
         
             
            require 'jira/resource/component'
         
     | 
| 
       16 
18 
     | 
    
         
             
            require 'jira/resource/issuetype'
         
     | 
| 
         @@ -24,7 +26,12 @@ require 'jira/resource/worklog' 
     | 
|
| 
       24 
26 
     | 
    
         
             
            require 'jira/resource/applinks'
         
     | 
| 
       25 
27 
     | 
    
         
             
            require 'jira/resource/issuelinktype'
         
     | 
| 
       26 
28 
     | 
    
         
             
            require 'jira/resource/issuelink'
         
     | 
| 
      
 29 
     | 
    
         
            +
            require 'jira/resource/suggested_issue'
         
     | 
| 
      
 30 
     | 
    
         
            +
            require 'jira/resource/issue_picker_suggestions_issue'
         
     | 
| 
      
 31 
     | 
    
         
            +
            require 'jira/resource/issue_picker_suggestions'
         
     | 
| 
       27 
32 
     | 
    
         
             
            require 'jira/resource/remotelink'
         
     | 
| 
      
 33 
     | 
    
         
            +
            require 'jira/resource/sprint'
         
     | 
| 
      
 34 
     | 
    
         
            +
            require 'jira/resource/sprint_report'
         
     | 
| 
       28 
35 
     | 
    
         
             
            require 'jira/resource/issue'
         
     | 
| 
       29 
36 
     | 
    
         
             
            require 'jira/resource/filter'
         
     | 
| 
       30 
37 
     | 
    
         
             
            require 'jira/resource/field'
         
     | 
| 
         @@ -34,10 +41,13 @@ require 'jira/resource/serverinfo' 
     | 
|
| 
       34 
41 
     | 
    
         
             
            require 'jira/resource/createmeta'
         
     | 
| 
       35 
42 
     | 
    
         
             
            require 'jira/resource/webhook'
         
     | 
| 
       36 
43 
     | 
    
         
             
            require 'jira/resource/agile'
         
     | 
| 
       37 
     | 
    
         
            -
            require 'jira/resource/ 
     | 
| 
      
 44 
     | 
    
         
            +
            require 'jira/resource/board'
         
     | 
| 
      
 45 
     | 
    
         
            +
            require 'jira/resource/board_configuration'
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
       38 
47 
     | 
    
         
             
            require 'jira/request_client'
         
     | 
| 
       39 
48 
     | 
    
         
             
            require 'jira/oauth_client'
         
     | 
| 
       40 
49 
     | 
    
         
             
            require 'jira/http_client'
         
     | 
| 
      
 50 
     | 
    
         
            +
            require 'jira/jwt_client'
         
     | 
| 
       41 
51 
     | 
    
         
             
            require 'jira/client'
         
     | 
| 
       42 
52 
     | 
    
         | 
| 
       43 
53 
     | 
    
         
             
            require 'jira/railtie' if defined?(Rails)
         
     | 
    
        data/lib/tasks/generate.rake
    CHANGED
    
    | 
         @@ -1,18 +1,18 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'securerandom'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            namespace :jira do
         
     | 
| 
       4 
     | 
    
         
            -
              desc  
     | 
| 
      
 4 
     | 
    
         
            +
              desc 'Generate a consumer key for your application'
         
     | 
| 
       5 
5 
     | 
    
         
             
              task :generate_consumer_key do
         
     | 
| 
       6 
6 
     | 
    
         
             
                key = SecureRandom.hex(16)
         
     | 
| 
       7 
7 
     | 
    
         
             
                puts "You can use this as your consumer key: #{key}"
         
     | 
| 
       8 
8 
     | 
    
         
             
              end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
              desc  
     | 
| 
      
 10 
     | 
    
         
            +
              desc 'Run the system call to generate a RSA public certificate'
         
     | 
| 
       11 
11 
     | 
    
         
             
              task :generate_public_cert do
         
     | 
| 
       12 
12 
     | 
    
         
             
                puts "Executing 'openssl req -x509 -nodes -newkey rsa:1024 -sha1 -keyout rsakey.pem -out rsacert.pem'"
         
     | 
| 
       13 
13 
     | 
    
         
             
                system('openssl req -x509 -subj "/C=US/ST=New York/L=New York/O=SUMO Heavy Industries/CN=www.sumoheavy.com" -nodes -newkey rsa:1024 -sha1 -keyout rsakey.pem -out rsacert.pem')
         
     | 
| 
       14 
14 
     | 
    
         
             
                puts "Done. The RSA-SHA1 private keyfile is in the current directory: \'rsakey.pem\'."
         
     | 
| 
       15 
     | 
    
         
            -
                puts  
     | 
| 
       16 
     | 
    
         
            -
                system( 
     | 
| 
      
 15 
     | 
    
         
            +
                puts 'You will need to copy the following certificate into your application link configuration in Jira:'
         
     | 
| 
      
 16 
     | 
    
         
            +
                system('cat rsacert.pem')
         
     | 
| 
       17 
17 
     | 
    
         
             
              end
         
     | 
| 
       18 
18 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,23 +1,32 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe JIRA::Resource::Attachment do
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
4 
     | 
    
         
             
              with_each_client do |site_url, client|
         
     | 
| 
       6 
5 
     | 
    
         
             
                let(:client) { client }
         
     | 
| 
       7 
6 
     | 
    
         
             
                let(:site_url) { site_url }
         
     | 
| 
       8 
7 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                let(:key) {  
     | 
| 
      
 8 
     | 
    
         
            +
                let(:key) { '10000' }
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                let(:target) { JIRA::Resource::Attachment.new(client, attrs: { 'id' => '99999' }, issue_id: '10002') }
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
12 
     | 
    
         
             
                let(:expected_attributes) do
         
     | 
| 
       12 
13 
     | 
    
         
             
                  {
         
     | 
| 
       13 
     | 
    
         
            -
                    'self' =>  
     | 
| 
       14 
     | 
    
         
            -
                    'size' =>  
     | 
| 
       15 
     | 
    
         
            -
                    'filename' =>  
     | 
| 
      
 14 
     | 
    
         
            +
                    'self' => 'http://localhost:2990/jira/rest/api/2/attachment/10000',
         
     | 
| 
      
 15 
     | 
    
         
            +
                    'size' => 15_360,
         
     | 
| 
      
 16 
     | 
    
         
            +
                    'filename' => 'ballmer.png'
         
     | 
| 
       16 
17 
     | 
    
         
             
                  }
         
     | 
| 
       17 
18 
     | 
    
         
             
                end
         
     | 
| 
       18 
19 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
                 
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 20 
     | 
    
         
            +
                let(:belongs_to) do
         
     | 
| 
      
 21 
     | 
    
         
            +
                  JIRA::Resource::Issue.new(client, attrs: {
         
     | 
| 
      
 22 
     | 
    
         
            +
                                              'id' => '10002',
         
     | 
| 
      
 23 
     | 
    
         
            +
                                              'fields' => {
         
     | 
| 
      
 24 
     | 
    
         
            +
                                                'attachment' => { 'attachments' => [] }
         
     | 
| 
      
 25 
     | 
    
         
            +
                                              }
         
     | 
| 
      
 26 
     | 
    
         
            +
                                            })
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                it_should_behave_like 'a resource with a singular GET endpoint'
         
     | 
| 
      
 30 
     | 
    
         
            +
                it_should_behave_like 'a resource with a DELETE endpoint'
         
     | 
| 
       22 
31 
     | 
    
         
             
              end
         
     | 
| 
       23 
32 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,55 +1,52 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe JIRA::Resource::Comment do
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
4 
     | 
    
         
             
              with_each_client do |site_url, client|
         
     | 
| 
       6 
5 
     | 
    
         
             
                let(:client) { client }
         
     | 
| 
       7 
6 
     | 
    
         
             
                let(:site_url) { site_url }
         
     | 
| 
       8 
7 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                let(:key) {  
     | 
| 
      
 8 
     | 
    
         
            +
                let(:key) { '10000' }
         
     | 
| 
       10 
9 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
                let(:target) { JIRA::Resource::Comment.new(client, : 
     | 
| 
      
 10 
     | 
    
         
            +
                let(:target) { JIRA::Resource::Comment.new(client, attrs: { 'id' => '99999' }, issue_id: '54321') }
         
     | 
| 
       12 
11 
     | 
    
         | 
| 
       13 
12 
     | 
    
         
             
                let(:expected_collection_length) { 2 }
         
     | 
| 
       14 
13 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                let(:belongs_to)  
     | 
| 
       16 
     | 
    
         
            -
                  JIRA::Resource::Issue.new(client, : 
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                 
     | 
| 
      
 14 
     | 
    
         
            +
                let(:belongs_to) do
         
     | 
| 
      
 15 
     | 
    
         
            +
                  JIRA::Resource::Issue.new(client, attrs: {
         
     | 
| 
      
 16 
     | 
    
         
            +
                                              'id' => '10002',
         
     | 
| 
      
 17 
     | 
    
         
            +
                                              'fields' => {
         
     | 
| 
      
 18 
     | 
    
         
            +
                                                'comment' => { 'comments' => [] }
         
     | 
| 
      
 19 
     | 
    
         
            +
                                              }
         
     | 
| 
      
 20 
     | 
    
         
            +
                                            })
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
       23 
22 
     | 
    
         | 
| 
       24 
23 
     | 
    
         
             
                let(:expected_attributes) do
         
     | 
| 
       25 
24 
     | 
    
         
             
                  {
         
     | 
| 
       26 
     | 
    
         
            -
                    'self' =>  
     | 
| 
      
 25 
     | 
    
         
            +
                    'self' => 'http://localhost:2990/jira/rest/api/2/issue/10002/comment/10000',
         
     | 
| 
       27 
26 
     | 
    
         
             
                    'id'   => key,
         
     | 
| 
       28 
     | 
    
         
            -
                    'body' =>  
     | 
| 
      
 27 
     | 
    
         
            +
                    'body' => 'This is a comment. Creative.'
         
     | 
| 
       29 
28 
     | 
    
         
             
                  }
         
     | 
| 
       30 
29 
     | 
    
         
             
                end
         
     | 
| 
       31 
30 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
                let(:attributes_for_post)  
     | 
| 
       33 
     | 
    
         
            -
                  {  
     | 
| 
       34 
     | 
    
         
            -
                 
     | 
| 
       35 
     | 
    
         
            -
                let(:expected_attributes_from_post)  
     | 
| 
       36 
     | 
    
         
            -
                  {  
     | 
| 
       37 
     | 
    
         
            -
                 
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                let(:attributes_for_put)  
     | 
| 
       40 
     | 
    
         
            -
                  { 
     | 
| 
       41 
     | 
    
         
            -
                 
     | 
| 
       42 
     | 
    
         
            -
                let(:expected_attributes_from_put)  
     | 
| 
       43 
     | 
    
         
            -
                  {  
     | 
| 
       44 
     | 
    
         
            -
                 
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                it_should_behave_like "a resource"
         
     | 
| 
       47 
     | 
    
         
            -
                it_should_behave_like "a resource with a collection GET endpoint"
         
     | 
| 
       48 
     | 
    
         
            -
                it_should_behave_like "a resource with a singular GET endpoint"
         
     | 
| 
       49 
     | 
    
         
            -
                it_should_behave_like "a resource with a DELETE endpoint"
         
     | 
| 
       50 
     | 
    
         
            -
                it_should_behave_like "a resource with a POST endpoint"
         
     | 
| 
       51 
     | 
    
         
            -
                it_should_behave_like "a resource with a PUT endpoint"
         
     | 
| 
      
 31 
     | 
    
         
            +
                let(:attributes_for_post) do
         
     | 
| 
      
 32 
     | 
    
         
            +
                  { 'body' => 'new comment' }
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
                let(:expected_attributes_from_post) do
         
     | 
| 
      
 35 
     | 
    
         
            +
                  { 'id' => '10001', 'body' => 'new comment' }
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                let(:attributes_for_put) do
         
     | 
| 
      
 39 
     | 
    
         
            +
                  { 'body' => 'new body' }
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
                let(:expected_attributes_from_put) do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  { 'id' => '10000', 'body' => 'new body' }
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
       52 
44 
     | 
    
         | 
| 
      
 45 
     | 
    
         
            +
                it_should_behave_like 'a resource'
         
     | 
| 
      
 46 
     | 
    
         
            +
                it_should_behave_like 'a resource with a collection GET endpoint'
         
     | 
| 
      
 47 
     | 
    
         
            +
                it_should_behave_like 'a resource with a singular GET endpoint'
         
     | 
| 
      
 48 
     | 
    
         
            +
                it_should_behave_like 'a resource with a DELETE endpoint'
         
     | 
| 
      
 49 
     | 
    
         
            +
                it_should_behave_like 'a resource with a POST endpoint'
         
     | 
| 
      
 50 
     | 
    
         
            +
                it_should_behave_like 'a resource with a PUT endpoint'
         
     | 
| 
       53 
51 
     | 
    
         
             
              end
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
52 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,42 +1,39 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe JIRA::Resource::Component do
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
4 
     | 
    
         
             
              with_each_client do |site_url, client|
         
     | 
| 
       7 
5 
     | 
    
         
             
                let(:client) { client }
         
     | 
| 
       8 
6 
     | 
    
         
             
                let(:site_url) { site_url }
         
     | 
| 
       9 
7 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                let(:key) {  
     | 
| 
      
 8 
     | 
    
         
            +
                let(:key) { '10000' }
         
     | 
| 
       11 
9 
     | 
    
         | 
| 
       12 
10 
     | 
    
         
             
                let(:expected_attributes) do
         
     | 
| 
       13 
11 
     | 
    
         
             
                  {
         
     | 
| 
       14 
     | 
    
         
            -
                    'self' =>  
     | 
| 
      
 12 
     | 
    
         
            +
                    'self' => 'http://localhost:2990/jira/rest/api/2/component/10000',
         
     | 
| 
       15 
13 
     | 
    
         
             
                    'id'   => key,
         
     | 
| 
       16 
     | 
    
         
            -
                    'name' =>  
     | 
| 
      
 14 
     | 
    
         
            +
                    'name' => 'Cheesecake'
         
     | 
| 
       17 
15 
     | 
    
         
             
                  }
         
     | 
| 
       18 
16 
     | 
    
         
             
                end
         
     | 
| 
       19 
17 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
                let(:attributes_for_post)  
     | 
| 
       21 
     | 
    
         
            -
                  { 
     | 
| 
       22 
     | 
    
         
            -
                 
     | 
| 
       23 
     | 
    
         
            -
                let(:expected_attributes_from_post)  
     | 
| 
       24 
     | 
    
         
            -
                  {  
     | 
| 
       25 
     | 
    
         
            -
                 
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                let(:attributes_for_put) {
         
     | 
| 
       28 
     | 
    
         
            -
                  {"name" => "Jammy", "project" => "SAMPLEPROJECT" }
         
     | 
| 
       29 
     | 
    
         
            -
                }
         
     | 
| 
       30 
     | 
    
         
            -
                let(:expected_attributes_from_put) {
         
     | 
| 
       31 
     | 
    
         
            -
                  { "id" => "10000", "name" => "Jammy" }
         
     | 
| 
       32 
     | 
    
         
            -
                }
         
     | 
| 
      
 18 
     | 
    
         
            +
                let(:attributes_for_post) do
         
     | 
| 
      
 19 
     | 
    
         
            +
                  { 'name' => 'Test component', 'project' => 'SAMPLEPROJECT' }
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
                let(:expected_attributes_from_post) do
         
     | 
| 
      
 22 
     | 
    
         
            +
                  { 'id' => '10001', 'name' => 'Test component' }
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
       33 
24 
     | 
    
         | 
| 
       34 
     | 
    
         
            -
                 
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                 
     | 
| 
       37 
     | 
    
         
            -
                 
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                 
     | 
| 
      
 25 
     | 
    
         
            +
                let(:attributes_for_put) do
         
     | 
| 
      
 26 
     | 
    
         
            +
                  { 'name' => 'Jammy', 'project' => 'SAMPLEPROJECT' }
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
                let(:expected_attributes_from_put) do
         
     | 
| 
      
 29 
     | 
    
         
            +
                  { 'id' => '10000', 'name' => 'Jammy' }
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
       40 
31 
     | 
    
         | 
| 
      
 32 
     | 
    
         
            +
                it_should_behave_like 'a resource'
         
     | 
| 
      
 33 
     | 
    
         
            +
                it_should_behave_like 'a resource with a singular GET endpoint'
         
     | 
| 
      
 34 
     | 
    
         
            +
                it_should_behave_like 'a resource with a DELETE endpoint'
         
     | 
| 
      
 35 
     | 
    
         
            +
                it_should_behave_like 'a resource with a POST endpoint'
         
     | 
| 
      
 36 
     | 
    
         
            +
                it_should_behave_like 'a resource with a PUT endpoint'
         
     | 
| 
      
 37 
     | 
    
         
            +
                it_should_behave_like 'a resource with a PUT endpoint that rejects invalid fields'
         
     | 
| 
       41 
38 
     | 
    
         
             
              end
         
     | 
| 
       42 
39 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,35 +1,32 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe JIRA::Resource::Field do
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
4 
     | 
    
         
             
              with_each_client do |site_url, client|
         
     | 
| 
       6 
5 
     | 
    
         
             
                let(:client) { client }
         
     | 
| 
       7 
6 
     | 
    
         
             
                let(:site_url) { site_url }
         
     | 
| 
       8 
7 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                let(:key) { "1" }
         
     | 
| 
      
 8 
     | 
    
         
            +
                let(:key) { '1' }
         
     | 
| 
       11 
9 
     | 
    
         | 
| 
       12 
10 
     | 
    
         
             
                let(:expected_attributes) do
         
     | 
| 
       13 
11 
     | 
    
         
             
                  {
         
     | 
| 
       14 
     | 
    
         
            -
                     
     | 
| 
       15 
     | 
    
         
            -
                     
     | 
| 
       16 
     | 
    
         
            -
                     
     | 
| 
       17 
     | 
    
         
            -
                     
     | 
| 
       18 
     | 
    
         
            -
                     
     | 
| 
       19 
     | 
    
         
            -
                     
     | 
| 
       20 
     | 
    
         
            -
                     
     | 
| 
       21 
     | 
    
         
            -
                     
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
                    'id' => key,
         
     | 
| 
      
 13 
     | 
    
         
            +
                    'name' => 'Description',
         
     | 
| 
      
 14 
     | 
    
         
            +
                    'custom' => false,
         
     | 
| 
      
 15 
     | 
    
         
            +
                    'orderable' => true,
         
     | 
| 
      
 16 
     | 
    
         
            +
                    'navigable' => true,
         
     | 
| 
      
 17 
     | 
    
         
            +
                    'searchable' => true,
         
     | 
| 
      
 18 
     | 
    
         
            +
                    'clauseNames' => ['description'],
         
     | 
| 
      
 19 
     | 
    
         
            +
                    'schema' => {
         
     | 
| 
      
 20 
     | 
    
         
            +
                      'type' => 'string',
         
     | 
| 
      
 21 
     | 
    
         
            +
                      'system' => 'description'
         
     | 
| 
      
 22 
     | 
    
         
            +
                    }
         
     | 
| 
       25 
23 
     | 
    
         
             
                  }
         
     | 
| 
       26 
24 
     | 
    
         
             
                end
         
     | 
| 
       27 
25 
     | 
    
         | 
| 
       28 
26 
     | 
    
         
             
                let(:expected_collection_length) { 2 }
         
     | 
| 
       29 
27 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
                it_should_behave_like  
     | 
| 
       31 
     | 
    
         
            -
                it_should_behave_like  
     | 
| 
       32 
     | 
    
         
            -
                it_should_behave_like  
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
                it_should_behave_like 'a resource'
         
     | 
| 
      
 29 
     | 
    
         
            +
                it_should_behave_like 'a resource with a collection GET endpoint'
         
     | 
| 
      
 30 
     | 
    
         
            +
                it_should_behave_like 'a resource with a singular GET endpoint'
         
     | 
| 
       34 
31 
     | 
    
         
             
              end
         
     | 
| 
       35 
32 
     | 
    
         
             
            end
         
     |