jira-ruby 2.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.travis.yml +9 -0
  4. data/Gemfile +14 -0
  5. data/Guardfile +14 -0
  6. data/LICENSE +19 -0
  7. data/README.md +427 -0
  8. data/Rakefile +31 -0
  9. data/example.rb +224 -0
  10. data/http-basic-example.rb +113 -0
  11. data/jira-ruby.gemspec +35 -0
  12. data/lib/jira-ruby.rb +49 -0
  13. data/lib/jira/base.rb +525 -0
  14. data/lib/jira/base_factory.rb +46 -0
  15. data/lib/jira/client.rb +308 -0
  16. data/lib/jira/has_many_proxy.rb +42 -0
  17. data/lib/jira/http_client.rb +112 -0
  18. data/lib/jira/http_error.rb +14 -0
  19. data/lib/jira/jwt_client.rb +67 -0
  20. data/lib/jira/oauth_client.rb +114 -0
  21. data/lib/jira/railtie.rb +10 -0
  22. data/lib/jira/request_client.rb +31 -0
  23. data/lib/jira/resource/agile.rb +79 -0
  24. data/lib/jira/resource/applinks.rb +39 -0
  25. data/lib/jira/resource/attachment.rb +50 -0
  26. data/lib/jira/resource/board.rb +91 -0
  27. data/lib/jira/resource/board_configuration.rb +9 -0
  28. data/lib/jira/resource/comment.rb +12 -0
  29. data/lib/jira/resource/component.rb +8 -0
  30. data/lib/jira/resource/createmeta.rb +44 -0
  31. data/lib/jira/resource/field.rb +83 -0
  32. data/lib/jira/resource/filter.rb +15 -0
  33. data/lib/jira/resource/issue.rb +141 -0
  34. data/lib/jira/resource/issuelink.rb +20 -0
  35. data/lib/jira/resource/issuelinktype.rb +14 -0
  36. data/lib/jira/resource/issuetype.rb +8 -0
  37. data/lib/jira/resource/priority.rb +8 -0
  38. data/lib/jira/resource/project.rb +41 -0
  39. data/lib/jira/resource/rapidview.rb +67 -0
  40. data/lib/jira/resource/remotelink.rb +26 -0
  41. data/lib/jira/resource/resolution.rb +8 -0
  42. data/lib/jira/resource/serverinfo.rb +18 -0
  43. data/lib/jira/resource/sprint.rb +105 -0
  44. data/lib/jira/resource/sprint_report.rb +8 -0
  45. data/lib/jira/resource/status.rb +8 -0
  46. data/lib/jira/resource/transition.rb +29 -0
  47. data/lib/jira/resource/user.rb +30 -0
  48. data/lib/jira/resource/version.rb +8 -0
  49. data/lib/jira/resource/watcher.rb +35 -0
  50. data/lib/jira/resource/webhook.rb +37 -0
  51. data/lib/jira/resource/worklog.rb +14 -0
  52. data/lib/jira/tasks.rb +0 -0
  53. data/lib/jira/version.rb +3 -0
  54. data/lib/tasks/generate.rake +18 -0
  55. data/spec/integration/attachment_spec.rb +32 -0
  56. data/spec/integration/comment_spec.rb +52 -0
  57. data/spec/integration/component_spec.rb +39 -0
  58. data/spec/integration/field_spec.rb +32 -0
  59. data/spec/integration/issue_spec.rb +93 -0
  60. data/spec/integration/issuelinktype_spec.rb +26 -0
  61. data/spec/integration/issuetype_spec.rb +24 -0
  62. data/spec/integration/priority_spec.rb +24 -0
  63. data/spec/integration/project_spec.rb +49 -0
  64. data/spec/integration/rapidview_spec.rb +74 -0
  65. data/spec/integration/resolution_spec.rb +26 -0
  66. data/spec/integration/status_spec.rb +24 -0
  67. data/spec/integration/transition_spec.rb +49 -0
  68. data/spec/integration/user_spec.rb +41 -0
  69. data/spec/integration/version_spec.rb +39 -0
  70. data/spec/integration/watcher_spec.rb +62 -0
  71. data/spec/integration/webhook.rb +25 -0
  72. data/spec/integration/worklog_spec.rb +51 -0
  73. data/spec/jira/base_factory_spec.rb +45 -0
  74. data/spec/jira/base_spec.rb +598 -0
  75. data/spec/jira/client_spec.rb +291 -0
  76. data/spec/jira/has_many_proxy_spec.rb +46 -0
  77. data/spec/jira/http_client_spec.rb +328 -0
  78. data/spec/jira/http_error_spec.rb +24 -0
  79. data/spec/jira/jwt_uri_builder_spec.rb +59 -0
  80. data/spec/jira/oauth_client_spec.rb +162 -0
  81. data/spec/jira/request_client_spec.rb +41 -0
  82. data/spec/jira/resource/agile_spec.rb +135 -0
  83. data/spec/jira/resource/attachment_spec.rb +138 -0
  84. data/spec/jira/resource/board_spec.rb +224 -0
  85. data/spec/jira/resource/createmeta_spec.rb +258 -0
  86. data/spec/jira/resource/field_spec.rb +85 -0
  87. data/spec/jira/resource/filter_spec.rb +97 -0
  88. data/spec/jira/resource/issue_spec.rb +227 -0
  89. data/spec/jira/resource/issuelink_spec.rb +14 -0
  90. data/spec/jira/resource/project_factory_spec.rb +11 -0
  91. data/spec/jira/resource/project_spec.rb +123 -0
  92. data/spec/jira/resource/sprint_spec.rb +90 -0
  93. data/spec/jira/resource/user_factory_spec.rb +31 -0
  94. data/spec/jira/resource/worklog_spec.rb +22 -0
  95. data/spec/mock_responses/board/1.json +33 -0
  96. data/spec/mock_responses/board/1_issues.json +62 -0
  97. data/spec/mock_responses/component.post.json +28 -0
  98. data/spec/mock_responses/component/10000.invalid.put.json +5 -0
  99. data/spec/mock_responses/component/10000.json +39 -0
  100. data/spec/mock_responses/component/10000.put.json +39 -0
  101. data/spec/mock_responses/empty_issues.json +8 -0
  102. data/spec/mock_responses/field.json +32 -0
  103. data/spec/mock_responses/field/1.json +15 -0
  104. data/spec/mock_responses/issue.json +1108 -0
  105. data/spec/mock_responses/issue.post.json +5 -0
  106. data/spec/mock_responses/issue/10002.invalid.put.json +6 -0
  107. data/spec/mock_responses/issue/10002.json +126 -0
  108. data/spec/mock_responses/issue/10002.put.missing_field_update.json +6 -0
  109. data/spec/mock_responses/issue/10002/attachments/10000.json +20 -0
  110. data/spec/mock_responses/issue/10002/comment.json +65 -0
  111. data/spec/mock_responses/issue/10002/comment.post.json +29 -0
  112. data/spec/mock_responses/issue/10002/comment/10000.json +29 -0
  113. data/spec/mock_responses/issue/10002/comment/10000.put.json +29 -0
  114. data/spec/mock_responses/issue/10002/transitions.json +49 -0
  115. data/spec/mock_responses/issue/10002/transitions.post.json +1 -0
  116. data/spec/mock_responses/issue/10002/watchers.json +13 -0
  117. data/spec/mock_responses/issue/10002/worklog.json +98 -0
  118. data/spec/mock_responses/issue/10002/worklog.post.json +30 -0
  119. data/spec/mock_responses/issue/10002/worklog/10000.json +31 -0
  120. data/spec/mock_responses/issue/10002/worklog/10000.put.json +30 -0
  121. data/spec/mock_responses/issueLinkType.json +25 -0
  122. data/spec/mock_responses/issueLinkType/10000.json +7 -0
  123. data/spec/mock_responses/issuetype.json +42 -0
  124. data/spec/mock_responses/issuetype/5.json +8 -0
  125. data/spec/mock_responses/jira/rest/webhooks/1.0/webhook.json +11 -0
  126. data/spec/mock_responses/jira/rest/webhooks/1.0/webhook/2.json +11 -0
  127. data/spec/mock_responses/priority.json +42 -0
  128. data/spec/mock_responses/priority/1.json +8 -0
  129. data/spec/mock_responses/project.json +12 -0
  130. data/spec/mock_responses/project/SAMPLEPROJECT.issues.json +1108 -0
  131. data/spec/mock_responses/project/SAMPLEPROJECT.json +84 -0
  132. data/spec/mock_responses/rapidview.json +10 -0
  133. data/spec/mock_responses/rapidview/SAMPLEPROJECT.issues.full.json +276 -0
  134. data/spec/mock_responses/rapidview/SAMPLEPROJECT.issues.json +111 -0
  135. data/spec/mock_responses/rapidview/SAMPLEPROJECT.json +6 -0
  136. data/spec/mock_responses/resolution.json +15 -0
  137. data/spec/mock_responses/resolution/1.json +7 -0
  138. data/spec/mock_responses/sprint/1_issues.json +125 -0
  139. data/spec/mock_responses/status.json +37 -0
  140. data/spec/mock_responses/status/1.json +7 -0
  141. data/spec/mock_responses/user_username=admin.json +17 -0
  142. data/spec/mock_responses/version.post.json +7 -0
  143. data/spec/mock_responses/version/10000.invalid.put.json +5 -0
  144. data/spec/mock_responses/version/10000.json +11 -0
  145. data/spec/mock_responses/version/10000.put.json +7 -0
  146. data/spec/mock_responses/webhook.json +11 -0
  147. data/spec/mock_responses/webhook/webhook.json +11 -0
  148. data/spec/spec_helper.rb +21 -0
  149. data/spec/support/clients_helper.rb +16 -0
  150. data/spec/support/matchers/have_attributes.rb +11 -0
  151. data/spec/support/matchers/have_many.rb +9 -0
  152. data/spec/support/matchers/have_one.rb +5 -0
  153. data/spec/support/shared_examples/integration.rb +177 -0
  154. metadata +491 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3167a32cb87f89e17ad016fa13bac784a689c9c39ac800e70137a9944b00b550
4
+ data.tar.gz: 28c6dd444429802a94c58d13a3786647de6bfe37164251fc043761a70ef9d20f
5
+ SHA512:
6
+ metadata.gz: f35ac632b07ffd50c4bc58c810bc10e8ed54ffdd212b9d172e3ce2080ee3e947754e5b9afd521bbc655e69064fd658bb29dda880833afc7327d089c8eea3d31c
7
+ data.tar.gz: 361f3be9096ca1eed2383c4dcd4c388806b6f56e1b44305e802c7bb206a79b1216a4e6c8104ee26472a4f81c59b9b1c533c4d18d140b7e5928e6d3d581e571bc
@@ -0,0 +1,13 @@
1
+ .idea
2
+ *.gem
3
+ .bundle
4
+ Gemfile.lock
5
+ pkg/*
6
+ .rvmrc
7
+ .rspec
8
+ *.pem
9
+ .DS_STORE
10
+ doc
11
+ .ruby-version
12
+
13
+ .rakeTasks
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.4
4
+ - 2.5
5
+ - 2.6
6
+ - 2.7
7
+ before_script:
8
+ - rake jira:generate_public_cert
9
+ script: bundle exec rake spec
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'http://rubygems.org'
2
+
3
+ group :development do
4
+ gem 'guard'
5
+ gem 'guard-rspec'
6
+ gem 'wdm', '>= 0.1.0' if Gem.win_platform?
7
+ end
8
+
9
+ group :development, :test do
10
+ gem 'pry' # this was in the original Gemfile - but only needed in development & test
11
+ end
12
+
13
+ # Specify your gem's dependencies in jira_api.gemspec
14
+ gemspec
@@ -0,0 +1,14 @@
1
+ gem 'wdm', '>= 0.1.0' if Gem.win_platform?
2
+ gem 'rspec', '~> 3.0.0'
3
+
4
+ guard 'rspec', cmd: 'bundle exec rspec --color --format doc' do
5
+ # watch /lib/ files
6
+ watch(%r{^lib/(.+).rb$}) do |m|
7
+ "spec/#{m[1]}_spec.rb"
8
+ end
9
+
10
+ # watch /spec/ files
11
+ watch(%r{^spec/(.+).rb$}) do |m|
12
+ "spec/#{m[1]}.rb"
13
+ end
14
+ end
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2015-2016 SUMO Heavy Industries, LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,427 @@
1
+ # JIRA API Gem
2
+
3
+ [![Code Climate](https://codeclimate.com/github/sumoheavy/jira-ruby.svg)](https://codeclimate.com/github/sumoheavy/jira-ruby)
4
+ [![Build Status](https://travis-ci.org/sumoheavy/jira-ruby.svg?branch=master)](https://travis-ci.org/sumoheavy/jira-ruby)
5
+
6
+ This gem provides access to the Atlassian JIRA REST API.
7
+
8
+ ## Slack
9
+
10
+ Join our Slack channel! You can find us [here](https://jira-ruby-slackin.herokuapp.com/)
11
+
12
+ ## Example usage
13
+
14
+ ```ruby
15
+ require 'rubygems'
16
+ require 'jira-ruby'
17
+
18
+ options = {
19
+ :username => 'username',
20
+ :password => 'pass1234',
21
+ :site => 'http://mydomain.atlassian.net:443/',
22
+ :context_path => '',
23
+ :auth_type => :basic
24
+ }
25
+
26
+ client = JIRA::Client.new(options)
27
+
28
+ project = client.Project.find('SAMPLEPROJECT')
29
+
30
+ project.issues.each do |issue|
31
+ puts "#{issue.id} - #{issue.summary}"
32
+ end
33
+ ```
34
+
35
+ ## Links to JIRA REST API documentation
36
+
37
+ * [Overview](https://developer.atlassian.com/display/JIRADEV/JIRA+REST+APIs)
38
+
39
+ * [Reference](http://docs.atlassian.com/jira/REST/latest/)
40
+
41
+ ## Running tests
42
+
43
+ Before running tests, you will need a public certificate generated.
44
+
45
+ ```shell
46
+ rake jira:generate_public_cert
47
+ ```
48
+
49
+ ## Setting up the JIRA SDK
50
+
51
+ On Mac OS,
52
+
53
+ * Follow the instructions under "Mac OSX Installer" here: https://developer.atlassian.com/server/framework/atlassian-sdk/install-the-atlassian-sdk-on-a-linux-or-mac-system
54
+ * From within the archive directory, run:
55
+
56
+ ```shell
57
+ ./bin/atlas-run-standalone --product jira
58
+ ```
59
+
60
+ Once this is running, you should be able to connect to
61
+ http://localhost:2990/ and login to the JIRA admin system using `admin:admin`
62
+
63
+ You'll need to create a dummy project and probably some issues to test using
64
+ this library.
65
+
66
+ ## Configuring JIRA to use OAuth
67
+
68
+ From the JIRA API tutorial
69
+
70
+ > The first step is to register a new consumer in JIRA. This is done through
71
+ > the Application Links administration screens in JIRA. Create a new
72
+ > Application Link.
73
+ > [Administration/Plugins/Application Links](http://localhost:2990/jira/plugins/servlet/applinks/listApplicationLinks)
74
+ >
75
+ > When creating the Application Link use a placeholder URL or the correct URL
76
+ > to your client (e.g. `http://localhost:3000`), if your client can be reached
77
+ > via HTTP and choose the Generic Application type. After this Application Link
78
+ > has been created, edit the configuration and go to the incoming
79
+ > authentication configuration screen and select OAuth. Enter in this the
80
+ > public key and the consumer key which your client will use when making
81
+ > requests to JIRA.
82
+
83
+ This public key and consumer key will need to be generated by the Gem user, using OpenSSL
84
+ or similar to generate the public key and the provided rake task to generate the consumer
85
+ key.
86
+
87
+ > After you have entered all the information click OK and ensure OAuth authentication is
88
+ > enabled.
89
+
90
+ For 2 legged oauth in server mode only, not in cloud based JIRA, make sure to `Allow 2-Legged OAuth`
91
+
92
+ ## Configuring JIRA to use HTTP Basic Auth
93
+
94
+ Follow the same steps described above to set up a new Application Link in JIRA,
95
+ however there is no need to set up any "incoming authentication" as this
96
+ defaults to HTTP Basic Auth.
97
+
98
+ ## Configuring JIRA to use Cookie-Based Auth
99
+
100
+ Jira supports cookie based authentication whereby user credentials are passed
101
+ to JIRA via a JIRA REST API call. This call returns a session cookie which must
102
+ then be sent to all following JIRA REST API calls.
103
+
104
+ To enable cookie based authentication, set `:auth_type` to `:cookie`,
105
+ set `:use_cookies` to `true` and set `:username` and `:password` accordingly.
106
+
107
+ ```ruby
108
+ require 'jira-ruby'
109
+
110
+ options = {
111
+ :username => 'username',
112
+ :password => 'pass1234',
113
+ :site => 'http://mydomain.atlassian.net:443/',
114
+ :context_path => '',
115
+ :auth_type => :cookie, # Set cookie based authentication
116
+ :use_cookies => true, # Send cookies with each request
117
+ :additional_cookies => ['AUTH=vV7uzixt0SScJKg7'] # Optional cookies to send
118
+ # with each request
119
+ }
120
+
121
+ client = JIRA::Client.new(options)
122
+
123
+ project = client.Project.find('SAMPLEPROJECT')
124
+
125
+ project.issues.each do |issue|
126
+ puts "#{issue.id} - #{issue.summary}"
127
+ end
128
+ ```
129
+
130
+ Some authentication schemes might require additional cookies to be sent with
131
+ each request. Cookies added to the `:additional_cookies` option will be added
132
+ to each request. This option should be an array of strings representing each
133
+ cookie to add to the request.
134
+
135
+ Some authentication schemes that require additional cookies ignore the username
136
+ and password sent in the JIRA REST API call. For those use cases, `:username`
137
+ and `:password` may be omitted from `options`.
138
+
139
+ ## Using the API Gem in a command line application
140
+
141
+ Using HTTP Basic Authentication, configure and connect a client to your instance
142
+ of JIRA.
143
+
144
+ Note: If your Jira install is hosted on [atlassian.net](atlassian.net), it will have no context
145
+ path by default. If you're having issues connecting, try setting context_path
146
+ to an empty string in the options hash.
147
+
148
+ ```ruby
149
+ require 'rubygems'
150
+ require 'pp'
151
+ require 'jira-ruby'
152
+
153
+ # Consider the use of :use_ssl and :ssl_verify_mode options if running locally
154
+ # for tests.
155
+
156
+ # NOTE basic auth no longer works with Jira, you must generate an API token, to do so you must have jira instance access rights. You can generate a token here: https://id.atlassian.com/manage/api-tokens
157
+
158
+ # You will see JIRA::HTTPError (JIRA::HTTPError) if you attempt to use basic auth with your user's password
159
+
160
+ username = "myremoteuser"
161
+ api_token = "myApiToken"
162
+
163
+ options = {
164
+ :username => username,
165
+ :password => api_token,
166
+ :site => 'http://localhost:8080/', # or 'https://<your_subdomain>.atlassian.net/'
167
+ :context_path => '/myjira', # often blank
168
+ :auth_type => :basic,
169
+ :read_timeout => 120
170
+ }
171
+
172
+ client = JIRA::Client.new(options)
173
+
174
+ # Show all projects
175
+ projects = client.Project.all
176
+
177
+ projects.each do |project|
178
+ puts "Project -> key: #{project.key}, name: #{project.name}"
179
+ end
180
+ ```
181
+
182
+ ## Using the API Gem in your Rails application
183
+
184
+ Using oauth, the gem requires the consumer key and public certificate file (which
185
+ are generated in their respective rake tasks) to initialize an access token for
186
+ using the JIRA API.
187
+
188
+ Note that currently the rake task which generates the public certificate
189
+ requires OpenSSL to be installed on the machine.
190
+
191
+ Below is an example for setting up a rails application for OAuth authorization.
192
+
193
+ Ensure the JIRA gem is loaded correctly
194
+
195
+ ```ruby
196
+ # Gemfile
197
+ ...
198
+ gem 'jira-ruby', :require => 'jira-ruby'
199
+ ...
200
+ ```
201
+
202
+ Add common methods to your application controller and ensure access token
203
+ errors are handled gracefully
204
+
205
+ ```ruby
206
+ # app/controllers/application_controller.rb
207
+ class ApplicationController < ActionController::Base
208
+ protect_from_forgery
209
+
210
+ rescue_from JIRA::OauthClient::UninitializedAccessTokenError do
211
+ redirect_to new_jira_session_url
212
+ end
213
+
214
+ private
215
+
216
+ def get_jira_client
217
+
218
+ # add any extra configuration options for your instance of JIRA,
219
+ # e.g. :use_ssl, :ssl_verify_mode, :context_path, :site
220
+ options = {
221
+ :private_key_file => "rsakey.pem",
222
+ :consumer_key => 'test'
223
+ }
224
+
225
+ @jira_client = JIRA::Client.new(options)
226
+
227
+ # Add AccessToken if authorised previously.
228
+ if session[:jira_auth]
229
+ @jira_client.set_access_token(
230
+ session[:jira_auth]['access_token'],
231
+ session[:jira_auth]['access_key']
232
+ )
233
+ end
234
+ end
235
+ end
236
+ ```
237
+
238
+ Create a controller for handling the OAuth conversation.
239
+
240
+ ```ruby
241
+ # app/controllers/jira_sessions_controller.rb
242
+ class JiraSessionsController < ApplicationController
243
+
244
+ before_filter :get_jira_client
245
+
246
+ def new
247
+ callback_url = 'http://callback'
248
+ request_token = @jira_client.request_token(oauth_callback: callback_url)
249
+ session[:request_token] = request_token.token
250
+ session[:request_secret] = request_token.secret
251
+
252
+ redirect_to request_token.authorize_url
253
+ end
254
+
255
+ def authorize
256
+ request_token = @jira_client.set_request_token(
257
+ session[:request_token], session[:request_secret]
258
+ )
259
+ access_token = @jira_client.init_access_token(
260
+ :oauth_verifier => params[:oauth_verifier]
261
+ )
262
+
263
+ session[:jira_auth] = {
264
+ :access_token => access_token.token,
265
+ :access_key => access_token.secret
266
+ }
267
+
268
+ session.delete(:request_token)
269
+ session.delete(:request_secret)
270
+
271
+ redirect_to projects_path
272
+ end
273
+
274
+ def destroy
275
+ session.data.delete(:jira_auth)
276
+ end
277
+ end
278
+ ```
279
+
280
+ Create your own controllers for the JIRA resources you wish to access.
281
+
282
+ ```ruby
283
+ # app/controllers/issues_controller.rb
284
+ class IssuesController < ApplicationController
285
+ before_filter :get_jira_client
286
+ def index
287
+ @issues = @jira_client.Issue.all
288
+ end
289
+
290
+ def show
291
+ @issue = @jira_client.Issue.find(params[:id])
292
+ end
293
+ end
294
+ ```
295
+
296
+ ## Using the API Gem in your Sinatra application
297
+
298
+ Here's the same example as a Sinatra application:
299
+
300
+ ```ruby
301
+ require 'jira-ruby'
302
+ class App < Sinatra::Base
303
+ enable :sessions
304
+
305
+ # This section gets called before every request. Here, we set up the
306
+ # OAuth consumer details including the consumer key, private key,
307
+ # site uri, and the request token, access token, and authorize paths
308
+ before do
309
+ options = {
310
+ :site => 'http://localhost:2990/',
311
+ :context_path => '/jira',
312
+ :signature_method => 'RSA-SHA1',
313
+ :request_token_path => "/plugins/servlet/oauth/request-token",
314
+ :authorize_path => "/plugins/servlet/oauth/authorize",
315
+ :access_token_path => "/plugins/servlet/oauth/access-token",
316
+ :private_key_file => "rsakey.pem",
317
+ :rest_base_path => "/rest/api/2",
318
+ :consumer_key => "jira-ruby-example"
319
+ }
320
+
321
+ @jira_client = JIRA::Client.new(options)
322
+ @jira_client.consumer.http.set_debug_output($stderr)
323
+
324
+ # Add AccessToken if authorised previously.
325
+ if session[:jira_auth]
326
+ @jira_client.set_access_token(
327
+ session[:jira_auth][:access_token],
328
+ session[:jira_auth][:access_key]
329
+ )
330
+ end
331
+ end
332
+
333
+
334
+ # Starting point: http://<yourserver>/
335
+ # This will serve up a login link if you're not logged in. If you are, it'll show some user info and a
336
+ # signout link
337
+ get '/' do
338
+ if !session[:jira_auth]
339
+ # not logged in
340
+ <<-eos
341
+ <h1>jira-ruby (JIRA 5 Ruby Gem) demo </h1>You're not signed in. Why don't you
342
+ <a href=/signin>sign in</a> first.
343
+ eos
344
+ else
345
+ #logged in
346
+ @issues = @jira_client.Issue.all
347
+
348
+ # HTTP response inlined with bind data below...
349
+ <<-eos
350
+ You're now signed in. There #{@issues.count == 1 ? "is" : "are"} #{@issues.count}
351
+ issue#{@issues.count == 1 ? "" : "s"} in this JIRA instance. <a href='/signout'>Signout</a>
352
+ eos
353
+ end
354
+ end
355
+
356
+ # http://<yourserver>/signin
357
+ # Initiates the OAuth dance by first requesting a token then redirecting to
358
+ # http://<yourserver>/auth to get the @access_token
359
+ get '/signin' do
360
+ callback_url = "#{request.base_url}/callback"
361
+ request_token = @jira_client.request_token(oauth_callback: callback_url)
362
+ session[:request_token] = request_token.token
363
+ session[:request_secret] = request_token.secret
364
+
365
+ redirect request_token.authorize_url
366
+ end
367
+
368
+ # http://<yourserver>/callback
369
+ # Retrieves the @access_token then stores it inside a session cookie. In a real app,
370
+ # you'll want to persist the token in a datastore associated with the user.
371
+ get "/callback" do
372
+ request_token = @jira_client.set_request_token(
373
+ session[:request_token], session[:request_secret]
374
+ )
375
+ access_token = @jira_client.init_access_token(
376
+ :oauth_verifier => params[:oauth_verifier]
377
+ )
378
+
379
+ session[:jira_auth] = {
380
+ :access_token => access_token.token,
381
+ :access_key => access_token.secret
382
+ }
383
+
384
+ session.delete(:request_token)
385
+ session.delete(:request_secret)
386
+
387
+ redirect "/"
388
+ end
389
+
390
+ # http://<yourserver>/signout
391
+ # Expires the session
392
+ get "/signout" do
393
+ session.delete(:jira_auth)
394
+ redirect "/"
395
+ end
396
+ end
397
+ ```
398
+
399
+ ## Using the API Gem in a 2 legged context
400
+
401
+ Here's an example on how to use 2 legged OAuth:
402
+ ```ruby
403
+ require 'rubygems'
404
+ require 'pp'
405
+ require 'jira-ruby'
406
+
407
+ options = {
408
+ :site => 'http://localhost:2990/',
409
+ :context_path => '/jira',
410
+ :signature_method => 'RSA-SHA1',
411
+ :private_key_file => "rsakey.pem",
412
+ :rest_base_path => "/rest/api/2",
413
+ :auth_type => :oauth_2legged,
414
+ :consumer_key => "jira-ruby-example"
415
+ }
416
+
417
+ client = JIRA::Client.new(options)
418
+
419
+ client.set_access_token("","")
420
+
421
+ # Show all projects
422
+ projects = client.Project.all
423
+
424
+ projects.each do |project|
425
+ puts "Project -> key: #{project.key}, name: #{project.name}"
426
+ end
427
+ ```