jiralicious 0.4.0 → 0.4.3

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 35abe5a91ed496a677046d8d7cf6776be6388529
4
+ data.tar.gz: a5c39e5f19761e501d88fe16578bd94cbfd1b8e7
5
+ SHA512:
6
+ metadata.gz: a16791567cc35d0155ebcc0400e3dc5d62f7870fbb83aa994138ff6bafb1757ce0498078640db2b73a690daed0cf8b1b05b1e6fcb258985c261d01f9e707c07f
7
+ data.tar.gz: 264071527d0704fbbd06c2523d27b911f8d5336d7456e08c406b9c0ec4817d3319a539339f96459baaf40aadb0d8f37dde870d8f113321307d6611eb22573bc4
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # jiralicious
2
2
 
3
- [![Build Status](https://travis-ci.org/jstewart/jiralicious.png)](https://travis-ci.org/jstewart/jiralicious)
3
+ [![Build Status](https://travis-ci.org/dorack/jiralicious.png)](https://travis-ci.org/dorack/jiralicious)
4
4
 
5
5
  ## Examples:
6
6
 
@@ -40,6 +40,19 @@ Finding a single issue:
40
40
 
41
41
  Default auth type is now Basic auth. Cookie auth will be deprecated in the next version.
42
42
 
43
+ ## Changes in 0.4.2
44
+
45
+ * Opened up HTTParty to any version.
46
+ * Issue.new now works if provided a hash set.
47
+ * Error is thrown if the Jira key is invalid.
48
+ * Error is thrown if issue cannot be created during new opperation.
49
+ * Corrected and Updated RSPEC
50
+
51
+ ## Changes from 0.4.0 to 0.4.1
52
+
53
+ * Initial implementation of OAuth.
54
+ ** Note: the system does not support webhooks at this time. **
55
+
43
56
  ## Changes from 0.3.0
44
57
 
45
58
  * User and Avatars are now supported.
@@ -63,6 +76,7 @@ Default auth type is now Basic auth. Cookie auth will be deprecated in the next
63
76
  * Stanley Handschuh (dorack)
64
77
  * Mike Fiedler (miketheman)
65
78
  * Girish Sonawane (girishso)
79
+ * Jan Lindblom (janlindblom)
66
80
 
67
81
  ## Contributing to jiralicious
68
82
 
@@ -13,9 +13,19 @@ Gem::Specification.new do |s|
13
13
  s.email = "jstewart@fusionary.com"
14
14
  s.authors = ["Jason Stewart"]
15
15
  s.add_runtime_dependency 'crack', '~> 0.1.8'
16
- s.add_runtime_dependency 'httparty', '>= 0.10', '< 0.12.0'
16
+ if Gem::Version.new(RUBY_VERSION) > Gem::Version.new('1.9.2')
17
+ s.add_runtime_dependency 'httparty', '>= 0.10'
18
+ else
19
+ s.add_runtime_dependency 'httparty', '>= 0.10', '< 0.12.0'
20
+ end
17
21
  s.add_runtime_dependency 'hashie', '>= 1.1'
18
22
  s.add_runtime_dependency 'json', '>= 1.6', '< 1.9.0'
23
+ s.add_runtime_dependency 'oauth'
24
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('1.9.0')
25
+ s.add_runtime_dependency 'nokogiri'
26
+ else
27
+ s.add_runtime_dependency 'nokogiri', '< 1.6'
28
+ end
19
29
  s.add_development_dependency 'rspec', '~> 2.6'
20
30
  s.add_development_dependency 'rake'
21
31
  s.add_development_dependency 'fakeweb', '~> 1.3.0'
@@ -23,6 +23,7 @@ require 'jiralicious/user'
23
23
  require 'jiralicious/user/avatar'
24
24
  require 'jiralicious/basic_session'
25
25
  require 'jiralicious/cookie_session'
26
+ require 'jiralicious/oauth_session'
26
27
  require 'jiralicious/configuration'
27
28
  require 'jiralicious/avatar'
28
29
 
@@ -139,6 +139,18 @@ module Jiralicious
139
139
  end
140
140
  end
141
141
 
142
+ ##
143
+ # Validates that the provided key is not malformed
144
+ #
145
+ #
146
+ def issueKey_test(key, no_throw = false)
147
+ if key.nil? || !(/^[A-Z]+-[0-9]+$/i =~ key)
148
+ raise Jiralicious::JiraError.new("The key #{key} is invalid") unless no_throw
149
+ return false
150
+ end
151
+ return true
152
+ end
153
+
142
154
  alias :all :find_all
143
155
  end
144
156
 
@@ -6,7 +6,7 @@ module Jiralicious
6
6
  #
7
7
  module Configuration
8
8
  # Array of available attributes
9
- VALID_OPTIONS = [:username, :password, :uri, :api_version, :auth_type, :project]
9
+ VALID_OPTIONS = [:username, :password, :uri, :api_version, :auth_type, :project, :oauth_secret, :oauth_secret_filename, :oauth_pass_phrase, :oauth_consumer_key, :config_path]
10
10
  # Default user name set prior to login attempt
11
11
  DEFAULT_USERNAME = nil
12
12
  # Default password set prior to login attempt
@@ -56,6 +56,12 @@ module Jiralicious
56
56
  self.uri = DEFAULT_URI
57
57
  self.api_version = DEFAULT_API_VERSION
58
58
  self.auth_type = DEFAULT_AUTH_TYPE
59
+ self.project = nil
60
+ self.oauth_secret = nil
61
+ self.oauth_secret_filename = nil
62
+ self.oauth_pass_phrase = nil
63
+ self.oauth_consumer_key = nil
64
+ self.config_path = nil
59
65
  end
60
66
 
61
67
  ##
@@ -42,14 +42,19 @@ module Jiralicious
42
42
  def initialize(decoded_json = nil, default = nil)
43
43
  @loaded = false
44
44
  if (!decoded_json.nil?)
45
+ if !decoded_json.include? 'fields'
46
+ decoded_json = {'fields' => decoded_json}
47
+ end
45
48
  super(decoded_json)
46
49
  parse!(decoded_json["fields"])
47
50
  if default.nil?
48
51
  @fields = Fields.new(self['fields']) if self['fields']
49
- @comments = Comment.find_by_key(self.jira_key)
50
- @watchers = Watchers.find_by_key(self.jira_key)
51
- @transitions = Transitions.new(self.jira_key)
52
- @loaded = true
52
+ if self.jira_key
53
+ @comments = Comment.find_by_key(self.jira_key)
54
+ @watchers = Watchers.find_by_key(self.jira_key)
55
+ @transitions = Transitions.new(self.jira_key)
56
+ @loaded = true
57
+ end
53
58
  end
54
59
  end
55
60
  @fields = Fields.new if @fields.nil?
@@ -77,14 +82,14 @@ module Jiralicious
77
82
  if default.nil?
78
83
  parse!(self['fields'])
79
84
  @fields = Fields.new(self['fields']) if self['fields']
80
- @comments = Comment.find_by_key(self.jira_key)
81
- @watchers = Watchers.find_by_key(self.jira_key)
82
- @loaded = true
85
+ @comments = Comment.find_by_key(self.jira_key) if self.jira_key
86
+ @watchers = Watchers.find_by_key(self.jira_key) if self.jira_key
87
+ @loaded = true if self.jira_key
83
88
  else
84
89
  parse!(decoded_hash)
85
90
  end
86
91
  end
87
-
92
+
88
93
  ##
89
94
  # Forces the Jira Issue to reload with current or updated
90
95
  # information. This method is used in lazy loading methods.
@@ -249,12 +254,11 @@ module Jiralicious
249
254
  def save
250
255
  if loaded?
251
256
  self.class.update(@fields.format_for_update, self.jira_key)
252
- key = self.jira_key
253
257
  else
254
258
  response = self.class.create(@fields.format_for_create)
255
- key = response.parsed_response['key']
259
+ self.jira_key = response.parsed_response['key']
256
260
  end
257
- return key
261
+ return self.jira_key
258
262
  end
259
263
 
260
264
  ##
@@ -40,6 +40,7 @@ module Jiralicious
40
40
  # :key (required) issue key
41
41
  #
42
42
  def find_by_key(key)
43
+ issueKey_test(key)
43
44
  response = fetch({:parent => parent_name, :parent_key => key})
44
45
  a = new(response)
45
46
  a.jira_key = key
@@ -55,6 +56,7 @@ module Jiralicious
55
56
  # :id (required) comment id
56
57
  #
57
58
  def find_by_key_and_id(key, id)
59
+ issueKey_test(key)
58
60
  response = fetch({:parent => parent_name, :parent_key => key, :key => id})
59
61
  a = new(response)
60
62
  a.jira_key = key
@@ -70,6 +72,7 @@ module Jiralicious
70
72
  # :key (required) issue key
71
73
  #
72
74
  def add(comment, key)
75
+ issueKey_test(key)
73
76
  fetch({:method => :post, :body => comment, :parent => parent_name, :parent_key => key})
74
77
  end
75
78
 
@@ -84,6 +87,7 @@ module Jiralicious
84
87
  # :id (required) comment id
85
88
  #
86
89
  def edit(comment, key, id)
90
+ issueKey_test(key)
87
91
  fetch({:method => :put, :key => id, :body => comment, :parent => parent_name, :parent_key => key})
88
92
  end
89
93
 
@@ -100,6 +104,7 @@ module Jiralicious
100
104
  # :id (required) comment id
101
105
  #
102
106
  def remove(key, id)
107
+ issueKey_test(key)
103
108
  fetch({:method => :delete, :body_to_params => true, :key => id, :parent => parent_name, :parent_key => key})
104
109
  end
105
110
  end
@@ -100,6 +100,14 @@ module Jiralicious
100
100
  @fields_update[field].merge!(hash)
101
101
  end
102
102
 
103
+ ##
104
+ # Merges current to updated to allow for a forced
105
+ # update request to process.
106
+ #
107
+ def force_update
108
+ @fields_update.merge!(@fields_current)
109
+ end
110
+
103
111
  ##
104
112
  # Sets the field key with the provided value.
105
113
  #
@@ -55,6 +55,7 @@ module Jiralicious
55
55
  # :key (required) issue key
56
56
  #
57
57
  def find(key)
58
+ issueKey_test(key)
58
59
  response = fetch({:parent => parent_name, :parent_key => key})
59
60
  response.parsed_response['transitions'].each do |t|
60
61
  t['jira_key'] = key
@@ -71,6 +72,7 @@ module Jiralicious
71
72
  # :id (required) transition id
72
73
  #
73
74
  def find_by_key_and_id(key, id)
75
+ issueKey_test(key)
74
76
  response = fetch({:parent => parent_name, :parent_key => key, :body => {"transitionId" => id}, :body_to_params => true })
75
77
  response.parsed_response['transitions'].each do |t|
76
78
  t['jira_key'] = key
@@ -92,6 +94,7 @@ module Jiralicious
92
94
  # based on the individual transition
93
95
  #
94
96
  def go(key, id, options = {})
97
+ issueKey_test(key)
95
98
  transition = {"transition" => {"id" => id}}
96
99
  if options[:comment].is_a? String
97
100
  transition.merge!({"update" => {"comment" => [{"add" => {"body" => options[:comment].to_s}}]}})
@@ -120,6 +123,7 @@ module Jiralicious
120
123
  # :return (optional) boolean flag to determine if an object or hash is returned
121
124
  #
122
125
  def meta(key, id, options = {})
126
+ issueKey_test(key)
123
127
  response = fetch({:method => :get, :parent => parent_name, :parent_key => key, :body_to_params => true,
124
128
  :body => {"transitionId" => id, "expand" => "transitions.fields"}})
125
129
  response.parsed_response['transitions'].each do |t|
@@ -30,6 +30,7 @@ module Jiralicious
30
30
  # :key (required) issue key to find
31
31
  #
32
32
  def find_by_key(key)
33
+ issueKey_test(key)
33
34
  response = fetch({:parent => parent_name, :parent_key => key})
34
35
  a = new(response)
35
36
  a.jira_key = key
@@ -45,6 +46,7 @@ module Jiralicious
45
46
  # :key (required) issue key
46
47
  #
47
48
  def add(name, key)
49
+ issueKey_test(key)
48
50
  fetch({:method => :post, :body => name, :body_override => true, :parent => parent_name, :parent_key => key})
49
51
  end
50
52
 
@@ -57,6 +59,7 @@ module Jiralicious
57
59
  # :key (required) issue key
58
60
  #
59
61
  def remove(name, key)
62
+ issueKey_test(key)
60
63
  fetch({:method => :delete, :body_to_params => true, :body => {:username => name}, :parent => parent_name, :parent_key => key})
61
64
  end
62
65
  end
@@ -0,0 +1,129 @@
1
+ require 'oauth'
2
+ require 'nokogiri'
3
+
4
+ module Jiralicious
5
+ ##
6
+ # The OauthSesion class extends the default OAuth::AccessToken
7
+ # The functions herein convert between the current Jiralicious
8
+ # and HTTParty formats and those required by OAuth. This is a
9
+ # Bidirectional conversion.
10
+ #
11
+ class OauthSession < OAuth::AccessToken
12
+ attr_accessor :option
13
+
14
+ ##
15
+ # After Request reprocesses the response provided in to the
16
+ # HTTParty::Response format that is expected by the rest of
17
+ # the gem.
18
+ #
19
+ def after_request(response)
20
+ @response = HTTParty::Response.new(self, response, lambda { HTTParty::Parser.new(response.body, Jiralicious::Session.format).parse }, :body => response.body)
21
+ end
22
+
23
+ ##
24
+ # Initializer extends the functionality of the basic OAuth::AccessToken
25
+ # However provides the base functionality to handle the initial root
26
+ # generation for the custom Jiralicious authentication to JIRA
27
+ #
28
+ def initialize(token = nil, secret = nil)
29
+ self.option = {
30
+ :signature_method => 'RSA-SHA1',
31
+ :request_token_path => '/plugins/servlet/oauth/request-token',
32
+ :authorize_path => "/plugins/servlet/oauth/authorize",
33
+ :access_token_path => '/plugins/servlet/oauth/access-token',
34
+ :site => "http://rome:8080"
35
+ }
36
+ if (token.nil? || secret.nil?)
37
+ consumer = OAuth::Consumer.new(Jiralicious.oauth_consumer_key, OpenSSL::PKey::RSA.new(get_secret, Jiralicious.oauth_pass_phrase.to_s), self.option)
38
+ request_token = consumer.get_request_token
39
+ ## request access confirmation ##
40
+ bs = Jiralicious::BasicSession.new
41
+ bsr = bs.request(:get, request_token.authorize_url)
42
+ bsp = HTTParty::Parser.new(bsr.message, :html)
43
+ bsb = Nokogiri::HTML(bsp.body)
44
+ ## Parse confirm page and send form ##
45
+ a = {}
46
+ bsb.xpath('//input').each do |input|
47
+ if (input.get_attribute('name') != 'deny' && !input.get_attribute('name').nil?)
48
+ a.merge!({input.get_attribute('name').to_sym => input.get_attribute('value')})
49
+ end
50
+ end
51
+ urip = "#{request_token.authorize_url.split('?')[0]}?#{build_body(a)}"
52
+ bsr = bs.request(bsb.xpath('//form')[0].get_attribute('method').downcase.to_sym, urip)
53
+ ## Parse response for access ##
54
+ bss = bsr.message.split("&#39;") # brute force method don't know a better way to do this
55
+ crt = request_token.consumer.token_request(request_token.consumer.http_method, (request_token.consumer.access_token_url? ? request_token.consumer.access_token_url : request_token.consumer.access_token_path), request_token, {:oauth_verifier => bss[3]})
56
+ super(request_token.consumer, crt[:oauth_token], crt[:oauth_token_secret])
57
+ self.params = crt
58
+ else
59
+ super(token, secret)
60
+ end
61
+ end
62
+
63
+ ##
64
+ # Main access method to request data from the Jira API
65
+ #
66
+ # [Arguments]
67
+ # :method (required) http method type
68
+ #
69
+ # :options (required) request specific options
70
+ #
71
+ def request(method, *options)
72
+ if options.last.is_a?(Hash) && options.last[:handler]
73
+ response_handler = options.last.delete(:handler)
74
+ else
75
+ response_handler = handler
76
+ end
77
+ path = options.first
78
+ options = options.last
79
+ before_request if respond_to?(:before_request)
80
+ super(method, path, *options)
81
+ after_request(response) if respond_to?(:after_request)
82
+
83
+ response_handler.call(response)
84
+ end
85
+
86
+ protected
87
+
88
+ ##
89
+ # Restructures the Hash into a param string
90
+ #
91
+ def build_body(a)
92
+ o = ''
93
+ a.each do |k, v|
94
+ o += "#{k}=#{v}&"
95
+ end
96
+ o
97
+ end
98
+
99
+ ##
100
+ # returns the oauth_secret parameter or the file
101
+ #
102
+ def get_secret
103
+ if Jiralicious.oauth_secret.nil?
104
+ IO.read(Jiralicious.config_path + Jiralicious.oauth_secret_filename)
105
+ else
106
+ Jiralicious.oauth_secret
107
+ end
108
+ end
109
+
110
+ ##
111
+ # Configures the default handler. This can be overridden in
112
+ # the child class to provide additional error handling.
113
+ #
114
+ def handler
115
+ Proc.new do |response|
116
+ case response.code
117
+ when 200..204
118
+ response
119
+ else
120
+ message = response.body
121
+ if message.is_a?(Hash)
122
+ message = message['errorMessages'].join('\n')
123
+ end
124
+ Jiralicious::JiraError.new(message)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -42,7 +42,8 @@ module Jiralicious
42
42
  response.issues_raw.each do |issue|
43
43
  i_out.class.property :"#{issue["key"].gsub("-", "_")}"
44
44
  t = Issue.new
45
- i_out[issue["key"].gsub("-", "_")] = t.load(issue, true)
45
+ t.load(issue, true)
46
+ i_out[issue["key"].gsub("-", "_")] = t
46
47
  end
47
48
  i_out
48
49
  end
@@ -1,4 +1,4 @@
1
1
  module Jiralicious
2
2
  # Current Jiralicious Version
3
- VERSION = "0.4.0"
3
+ VERSION = "0.4.3"
4
4
  end
@@ -123,8 +123,7 @@ describe Jiralicious::Issue, "Managing Issues" do
123
123
  issue.watchers.watchers.count.should == 1
124
124
  end
125
125
 
126
-
127
- it "creates a new issue" do
126
+ it "creates a new issue through fields" do
128
127
  issue = Jiralicious::Issue.new
129
128
  issue.fields.set_id("project", "10000")
130
129
  issue.fields.set("summary", "this is a test of creating a scratch ticket")
@@ -139,6 +138,59 @@ describe Jiralicious::Issue, "Managing Issues" do
139
138
  issue.comments.comments.count.should == 0
140
139
  issue.watchers.watchers.count.should == 1
141
140
  end
141
+
142
+ it "creates a new issue thgrough load with reload" do
143
+ hash = {"fields" => {"project" => {"id" => "10000"},
144
+ "summary" => "this is a test of creating a scratch ticket",
145
+ "issuetype" => {"id" => "7"},
146
+ "assignee" => {"name" => "stanley.handschuh"},
147
+ "priority" => {"id" => "1"},
148
+ "labels" => ["new_label_p"],
149
+ "environment" => "example of environment",
150
+ "description" => "example of the description extending"
151
+ }}
152
+ issue = Jiralicious::Issue.new
153
+ issue.load(hash, true)
154
+ issue.save!
155
+ issue.jira_key.should == 'EX-2'
156
+ issue.comments.comments.count.should == 0
157
+ issue.watchers.watchers.count.should == 1
158
+ end
159
+
160
+ it "creates a new issue thgrough load without reload" do
161
+ hash = {"fields" => {"project" => {"id" => "10000"},
162
+ "summary" => "this is a test of creating a scratch ticket",
163
+ "issuetype" => {"id" => "7"},
164
+ "assignee" => {"name" => "stanley.handschuh"},
165
+ "priority" => {"id" => "1"},
166
+ "labels" => ["new_label_p"],
167
+ "environment" => "example of environment",
168
+ "description" => "example of the description extending"
169
+ }}
170
+ issue = Jiralicious::Issue.new
171
+ issue.load(hash)
172
+ issue.save!
173
+ issue.jira_key.should == 'EX-2'
174
+ issue.comments.comments.count.should == 0
175
+ issue.watchers.watchers.count.should == 1
176
+ end
177
+
178
+ it "creates a new issue through new" do
179
+ hash = {"project" => {"id" => "10000"},
180
+ "summary" => "this is a test of creating a scratch ticket",
181
+ "issuetype" => {"id" => "7"},
182
+ "assignee" => {"name" => "stanley.handschuh"},
183
+ "priority" => {"id" => "1"},
184
+ "labels" => ["new_label_p"],
185
+ "environment" => "example of environment",
186
+ "description" => "example of the description extending"
187
+ }
188
+ issue = Jiralicious::Issue.new(hash)
189
+ issue.save!
190
+ issue.jira_key.should == 'EX-2'
191
+ issue.comments.comments.count.should == 0
192
+ issue.watchers.watchers.count.should == 1
193
+ end
142
194
 
143
195
  it "updates a new issue" do
144
196
  issue = Jiralicious::Issue.find("EX-3")
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jiralicious
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
5
- prerelease:
4
+ version: 0.4.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jason Stewart
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-07 00:00:00.000000000 Z
11
+ date: 2014-05-10 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: crack
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,47 +27,36 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: httparty
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0.10'
38
- - - <
39
- - !ruby/object:Gem::Version
40
- version: 0.12.0
41
34
  type: :runtime
42
35
  prerelease: false
43
36
  version_requirements: !ruby/object:Gem::Requirement
44
- none: false
45
37
  requirements:
46
- - - ! '>='
38
+ - - '>='
47
39
  - !ruby/object:Gem::Version
48
40
  version: '0.10'
49
- - - <
50
- - !ruby/object:Gem::Version
51
- version: 0.12.0
52
41
  - !ruby/object:Gem::Dependency
53
42
  name: hashie
54
43
  requirement: !ruby/object:Gem::Requirement
55
- none: false
56
44
  requirements:
57
- - - ! '>='
45
+ - - '>='
58
46
  - !ruby/object:Gem::Version
59
47
  version: '1.1'
60
48
  type: :runtime
61
49
  prerelease: false
62
50
  version_requirements: !ruby/object:Gem::Requirement
63
- none: false
64
51
  requirements:
65
- - - ! '>='
52
+ - - '>='
66
53
  - !ruby/object:Gem::Version
67
54
  version: '1.1'
68
55
  - !ruby/object:Gem::Dependency
69
56
  name: json
70
57
  requirement: !ruby/object:Gem::Requirement
71
- none: false
72
58
  requirements:
73
- - - ! '>='
59
+ - - '>='
74
60
  - !ruby/object:Gem::Version
75
61
  version: '1.6'
76
62
  - - <
@@ -79,18 +65,44 @@ dependencies:
79
65
  type: :runtime
80
66
  prerelease: false
81
67
  version_requirements: !ruby/object:Gem::Requirement
82
- none: false
83
68
  requirements:
84
- - - ! '>='
69
+ - - '>='
85
70
  - !ruby/object:Gem::Version
86
71
  version: '1.6'
87
72
  - - <
88
73
  - !ruby/object:Gem::Version
89
74
  version: 1.9.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: oauth
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: nokogiri
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
90
103
  - !ruby/object:Gem::Dependency
91
104
  name: rspec
92
105
  requirement: !ruby/object:Gem::Requirement
93
- none: false
94
106
  requirements:
95
107
  - - ~>
96
108
  - !ruby/object:Gem::Version
@@ -98,7 +110,6 @@ dependencies:
98
110
  type: :development
99
111
  prerelease: false
100
112
  version_requirements: !ruby/object:Gem::Requirement
101
- none: false
102
113
  requirements:
103
114
  - - ~>
104
115
  - !ruby/object:Gem::Version
@@ -106,23 +117,20 @@ dependencies:
106
117
  - !ruby/object:Gem::Dependency
107
118
  name: rake
108
119
  requirement: !ruby/object:Gem::Requirement
109
- none: false
110
120
  requirements:
111
- - - ! '>='
121
+ - - '>='
112
122
  - !ruby/object:Gem::Version
113
123
  version: '0'
114
124
  type: :development
115
125
  prerelease: false
116
126
  version_requirements: !ruby/object:Gem::Requirement
117
- none: false
118
127
  requirements:
119
- - - ! '>='
128
+ - - '>='
120
129
  - !ruby/object:Gem::Version
121
130
  version: '0'
122
131
  - !ruby/object:Gem::Dependency
123
132
  name: fakeweb
124
133
  requirement: !ruby/object:Gem::Requirement
125
- none: false
126
134
  requirements:
127
135
  - - ~>
128
136
  - !ruby/object:Gem::Version
@@ -130,7 +138,6 @@ dependencies:
130
138
  type: :development
131
139
  prerelease: false
132
140
  version_requirements: !ruby/object:Gem::Requirement
133
- none: false
134
141
  requirements:
135
142
  - - ~>
136
143
  - !ruby/object:Gem::Version
@@ -167,6 +174,7 @@ files:
167
174
  - lib/jiralicious/issue/fields.rb
168
175
  - lib/jiralicious/issue/transitions.rb
169
176
  - lib/jiralicious/issue/watchers.rb
177
+ - lib/jiralicious/oauth_session.rb
170
178
  - lib/jiralicious/parsers/field_parser.rb
171
179
  - lib/jiralicious/project.rb
172
180
  - lib/jiralicious/project/avatar.rb
@@ -220,27 +228,26 @@ files:
220
228
  homepage: http://github.com/jstewart/jiralicious
221
229
  licenses:
222
230
  - MIT
231
+ metadata: {}
223
232
  post_install_message:
224
233
  rdoc_options: []
225
234
  require_paths:
226
235
  - lib
227
236
  required_ruby_version: !ruby/object:Gem::Requirement
228
- none: false
229
237
  requirements:
230
- - - ! '>='
238
+ - - '>='
231
239
  - !ruby/object:Gem::Version
232
240
  version: '0'
233
241
  required_rubygems_version: !ruby/object:Gem::Requirement
234
- none: false
235
242
  requirements:
236
- - - ! '>='
243
+ - - '>='
237
244
  - !ruby/object:Gem::Version
238
245
  version: '0'
239
246
  requirements: []
240
247
  rubyforge_project:
241
- rubygems_version: 1.8.23
248
+ rubygems_version: 2.0.3
242
249
  signing_key:
243
- specification_version: 3
250
+ specification_version: 4
244
251
  summary: A Ruby library for interacting with JIRA's REST API
245
252
  test_files:
246
253
  - spec/avatar_spec.rb