jirasync 0.4.5 → 0.4.6

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
+ SHA256:
3
+ metadata.gz: a03445145f26a7d70ba8b1d604823a9a26d21d00b781453587f77f9dc76fe97d
4
+ data.tar.gz: 5592ecc86a2814a39b8d11cac69f1e11a593d401a59e11239a3a88dab44141f1
5
+ SHA512:
6
+ metadata.gz: 0a320e45f7fde0470f70bf2a904446f0761305480d0a0905fc76f51b049cdf20fa5599ff47d4b415640e358cd9e90d2a460c270dbeec27ef52739b53b868b207
7
+ data.tar.gz: 5ce8f2dd1a3df4cd2c4df655e7e5bbd7bce44ea0a86a2c71eddf2f7412330e2629bdee0d3134e890fa0d832cf8b14f09ca3213690bbf367bb6331342290769fe
data/README.md CHANGED
@@ -1,12 +1,9 @@
1
- # jira-sync
2
-
3
- A suite of utilities to synchronise JIRA projects to the local file system
1
+ [![Gem Version](https://badge.fury.io/rb/jirasync.svg)](http://badge.fury.io/rb/jirasync)
4
2
 
5
3
  ## Installation
6
4
 
7
5
  gem install jirasync
8
6
 
9
-
10
7
  ## Usage
11
8
 
12
9
  ### Initial Fetch
@@ -152,6 +149,11 @@ jira-format-issues \
152
149
 
153
150
  ~~~
154
151
 
152
+ ## Using Cookie-Authentication
153
+
154
+ If a single-sign-on solution is used, `jira-sync` can also use the session
155
+ cookie to authenticate requests to jira.
156
+
155
157
  ## Motivation
156
158
 
157
159
  Having a local, unix-friendly copy of all tickets to avoid JIRA performance issues and
@@ -21,7 +21,7 @@ Usage:
21
21
  jira-sync [options] [command]
22
22
  where command is one of the following
23
23
 
24
- fetch-all: fetches all tickets from the given project
24
+ fetch: fetches all tickets from the given project
25
25
  update: fetches all tickets that have been updated/
26
26
  added since the last run
27
27
 
@@ -31,6 +31,7 @@ EOS
31
31
  opt :project, "Project key", :type => :string
32
32
  opt :user, "User, defaults to the current system user", :type => :string
33
33
  opt :password, "Password, if not specified there, will be an interactive prompt", :type => :string
34
+ opt :cookie, "Session cookie, to use cookie-based authentication instead of username & password (e.g. 'JSESSIONID=ABC123')", :type => :string
34
35
  opt :target, "Target directory, defaults to the project key", :type => :string
35
36
  opt :store_attachments, "Fetch and store attachments"
36
37
  end
@@ -39,8 +40,14 @@ Trollop::die :baseurl, "must be speficied" if !opts[:baseurl]
39
40
  Trollop::die :project, "must be speficied" if !opts[:project]
40
41
 
41
42
 
42
- user = opts[:user] || ENV['USER']
43
- pw = opts[:password] || prompt_for_password
43
+ authentication = begin
44
+ cookie = opts[:cookie]
45
+ if cookie then
46
+ JiraSync::CookieAuthentication.new(cookie)
47
+ else
48
+ JiraSync::UsernamePasswordAuthentication.new(opts[:user] || ENV['USER'], opts[:password] || prompt_for_password)
49
+ end
50
+ end
44
51
  target = opts[:target] || opts[:project].chomp
45
52
  project = opts[:project]
46
53
  store_attachments = opts[:store_attachments]
@@ -52,7 +59,7 @@ if !["fetch", "update"].include?(command)
52
59
  exit 1
53
60
  end
54
61
 
55
- client = JiraSync::JiraClient.new(opts[:baseurl], user, pw)
62
+ client = JiraSync::JiraClient.new(opts[:baseurl], authentication)
56
63
  repo = JiraSync::LocalIssueRepository.new(target)
57
64
  syncer = JiraSync::Syncer.new(client, repo, project, store_attachments)
58
65
 
@@ -61,7 +68,7 @@ if command == "fetch"
61
68
  update_statement=<<-END
62
69
  jira-sync \
63
70
  --baseurl #{opts[:baseurl]} \\
64
- --user #{user} \\
71
+ #{ if authentication.cookie then "--cookie #{cookie}" else "--user #{user}" end} \\
65
72
  --project #{project} \\
66
73
  --target #{target} \\
67
74
  --store-attachments \\
@@ -83,7 +90,7 @@ if command == "update"
83
90
  fetch_statement=<<-END
84
91
  jira-sync \
85
92
  --baseurl #{opts[:baseurl]} \\
86
- --user #{user} \\
93
+ #{ if authentication.cookie then "--cookie #{cookie}" else "--user #{user}" end} \\
87
94
  --project #{project} \\
88
95
  --target #{target} \\
89
96
  --store-attachments \\
@@ -99,4 +106,4 @@ Try to use a statement along the following lines
99
106
  end
100
107
 
101
108
  syncer.update
102
- end
109
+ end
@@ -20,11 +20,48 @@ module JiraSync
20
20
  end
21
21
 
22
22
 
23
- class JiraClient
23
+ class JiraAuthentication
24
+ attr_reader :options
25
+
26
+ def initialize(options)
27
+ @options = options
28
+ end
29
+ end
30
+
24
31
 
25
- def initialize(baseurl, username, password)
32
+ class UsernamePasswordAuthentication < JiraAuthentication
33
+ attr_reader :username
34
+
35
+ def initialize(username, password)
36
+ super({
37
+ :basic_auth => {
38
+ :username => username,
39
+ :password => password,
40
+ },
41
+ })
26
42
  @username = username
27
- @password = password
43
+ end
44
+ end
45
+
46
+
47
+ class CookieAuthentication < JiraAuthentication
48
+ attr_reader :cookie
49
+
50
+ def initialize(cookie)
51
+ super({
52
+ :headers => {
53
+ "Cookie" => cookie,
54
+ },
55
+ })
56
+ @cookie = cookie
57
+ end
58
+ end
59
+
60
+
61
+ class JiraClient
62
+
63
+ def initialize(baseurl, authentication)
64
+ @authentication = authentication
28
65
  @baseurl = baseurl
29
66
  @timeout = 15
30
67
  @first_requets_timeout = 60
@@ -34,8 +71,7 @@ module JiraSync
34
71
 
35
72
  def get(jira_id)
36
73
  url = "#{@baseurl}/rest/api/latest/issue/#{jira_id}"
37
- auth = {:username => @username, :password => @password}
38
- response = HTTParty.get url, {:basic_auth => auth, :timeout => @timeout}
74
+ response = HTTParty.get url, @authentication.options.merge({:timeout => @timeout})
39
75
  if response.code == 200
40
76
  response.parsed_response
41
77
  else
@@ -46,8 +82,7 @@ module JiraSync
46
82
  def attachments_for_issue(issue)
47
83
  attachments = []
48
84
  Parallel.map(issue['fields']['attachment'], :in_threads => 64) do |attachment|
49
- auth = {:username => @username, :password => @password}
50
- response = HTTParty.get attachment['content'], {:basic_auth => auth, :timeout => @timeout}
85
+ response = HTTParty.get attachment['content'], @authentication.options.merge({:timeout => @timeout})
51
86
  if response.code == 200
52
87
  attachments.push({:data => response.body, :attachment => attachment, :issue => issue})
53
88
  else
@@ -60,13 +95,11 @@ module JiraSync
60
95
 
61
96
  def latest_issue_for_project(project_id)
62
97
  url = "#{@baseurl}/rest/api/2/search?"
63
- auth = {:username => @username, :password => @password}
64
98
 
65
- response = HTTParty.get url, {
66
- :basic_auth => auth,
99
+ response = HTTParty.get url, @authentication.options.merge({
67
100
  :query => {:jql => 'project="' + project_id + '" order by created', fields: 'summary,updated', maxResults: '1'},
68
101
  :timeout => @first_requets_timeout
69
- }
102
+ })
70
103
  if response.code == 200
71
104
  response.parsed_response
72
105
  else
@@ -76,14 +109,12 @@ module JiraSync
76
109
 
77
110
  def changed_since(project_id, date)
78
111
  url = "#{@baseurl}/rest/api/2/search?"
79
- auth = {:username => @username, :password => @password}
80
112
  jql = 'project = "' + project_id + '" AND updated > ' + (date.to_time.to_i * 1000).to_s
81
113
  # "' + date.to_s + '"'
82
- response = HTTParty.get url, {
83
- :basic_auth => auth,
114
+ response = HTTParty.get url, @authentication.options.merge({
84
115
  :query => {:jql => jql, fields: 'summary,updated', maxResults: '1000'},
85
116
  :timeout => @timeout
86
- }
117
+ })
87
118
  if response.code == 200
88
119
  response.parsed_response
89
120
  else
@@ -93,12 +124,10 @@ module JiraSync
93
124
 
94
125
  def project_info(project_id)
95
126
  url = "#{@baseurl}/rest/api/2/project/#{project_id}"
96
- auth = {:username => @username, :password => @password}
97
- response = HTTParty.get url, {
98
- :basic_auth => auth,
127
+ response = HTTParty.get url, @authentication.options.merge({
99
128
  :query => {:jql => 'project="' + project_id + '"', fields: 'summary,updated', maxResults: '50'},
100
129
  :timeout => @timeout
101
- }
130
+ })
102
131
  if response.code == 200
103
132
  response.parse_response
104
133
  else
@@ -1,3 +1,3 @@
1
1
  module JiraSync
2
- VERSION = "0.4.5"
2
+ VERSION = "0.4.6"
3
3
  end
metadata CHANGED
@@ -1,84 +1,77 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jirasync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
5
- prerelease:
4
+ version: 0.4.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Felix Leipold
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2015-04-22 00:00:00.000000000 Z
11
+ date: 2019-03-06 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: trollop
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
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
29
26
  version: '0'
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'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: parallel
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: ruby-progressbar
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
- description: ! "jirasync synchronises tickets from a jira project to the local\n file
79
- system. It supports a complete fetch operation as well as\n an
80
- incremental update.\n\n Each ticket is stored in a simple, pretty
81
- printed JSON file."
69
+ description: |-
70
+ jirasync synchronises tickets from a jira project to the local
71
+ file system. It supports a complete fetch operation as well as
72
+ an incremental update.
73
+
74
+ Each ticket is stored in a simple, pretty printed JSON file.
82
75
  email: ''
83
76
  executables:
84
77
  - jira-format-issues
@@ -86,7 +79,7 @@ executables:
86
79
  extensions: []
87
80
  extra_rdoc_files: []
88
81
  files:
89
- - .gitignore
82
+ - ".gitignore"
90
83
  - Gemfile
91
84
  - LICENSE
92
85
  - README.md
@@ -101,26 +94,25 @@ files:
101
94
  - lib/jirasync/version.rb
102
95
  homepage: https://github.com/programmiersportgruppe/jira-sync
103
96
  licenses: []
97
+ metadata: {}
104
98
  post_install_message:
105
99
  rdoc_options: []
106
100
  require_paths:
107
101
  - lib
108
102
  required_ruby_version: !ruby/object:Gem::Requirement
109
- none: false
110
103
  requirements:
111
- - - ! '>='
104
+ - - ">="
112
105
  - !ruby/object:Gem::Version
113
106
  version: '0'
114
107
  required_rubygems_version: !ruby/object:Gem::Requirement
115
- none: false
116
108
  requirements:
117
- - - ! '>='
109
+ - - ">="
118
110
  - !ruby/object:Gem::Version
119
111
  version: '0'
120
112
  requirements: []
121
113
  rubyforge_project:
122
- rubygems_version: 1.8.24
114
+ rubygems_version: 2.7.6
123
115
  signing_key:
124
- specification_version: 3
116
+ specification_version: 4
125
117
  summary: jirasync synchronises jira projects to the local file system
126
118
  test_files: []