jira-ruby-dmg 0.1.20 → 0.1.21

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5091836e1cd94b8d437b8b90ffd30f240cd9075a
4
- data.tar.gz: c2335e7bdc26a6aecdad5494a87587fbf54c1089
3
+ metadata.gz: 18f7433fcfcb7649f1e731d8a1ddbcb4212a0a18
4
+ data.tar.gz: 02b14bcdbcd1b9fb4b5bc1bbcd59fab6e18ecf94
5
5
  SHA512:
6
- metadata.gz: 1b4188f3c85f548a907dfd59e01c282f681ea6fba9d0a0dafbd5776e0afa3de63d1289d711c122ae2fc874a2d411678d0263c246550cc7024a72ac8622e25c33
7
- data.tar.gz: cb4b9f8dea064c7a36abadc57a5477ebdd76fe77618d15b7cddabfb0972f926627ae02445719b527b8f55465818549e26bec4a2648113ee9648ba16099620f88
6
+ metadata.gz: fd2554cc7e779ebb9355e23a34a2ffe9e7f7eece1814f3aad9f55b0ff68d8a9fc835a77a047334808faaa18dd43b8676b514557bb1caf604947cee5bcaa2f713
7
+ data.tar.gz: 1b7b34c9b5e1640b31c659c687bd8d54bc103c0a47fb64cc55247e3d05a60a2ff0a8161a3dd1d956f6e2a17e1b37c2ef9a2d18137c735f0ebed404a9dc09b88e
data/lib/jira/client.rb CHANGED
@@ -50,7 +50,9 @@ module JIRA
50
50
  :rest_base_path => "/rest/api/2",
51
51
  :ssl_verify_mode => OpenSSL::SSL::VERIFY_PEER,
52
52
  :use_ssl => true,
53
- :auth_type => :oauth
53
+ :auth_type => :oauth,
54
+ :enable_caching => false,
55
+ :cache_ttl => 86400000 # 1 day
54
56
  }
55
57
 
56
58
  def initialize(options={})
@@ -66,6 +68,8 @@ module JIRA
66
68
  @request_client = HttpClient.new(@options)
67
69
  end
68
70
 
71
+ @cache = JIRA::RequestCache.new(@options[:cache_ttl])
72
+
69
73
  @options.freeze
70
74
  end
71
75
 
@@ -133,8 +137,8 @@ module JIRA
133
137
  JIRA::Resource::AgileboardFactory.new(self)
134
138
  end
135
139
 
136
- def Velocity # :nodoc:
137
- JIRA::Resource::VelocityFactory.new(self)
140
+ def SprintReport # :nodoc:
141
+ JIRA::Resource::SprintReportFactory.new(self)
138
142
  end
139
143
 
140
144
  # HTTP methods without a body
@@ -143,9 +147,25 @@ module JIRA
143
147
  end
144
148
 
145
149
  def get(path, headers = {})
146
- request(:get, path, nil, merge_default_headers(headers))
150
+ if @options[:enable_caching]
151
+ get_from_cache(path, headers)
152
+ else
153
+ request(:get, path, nil, merge_default_headers(headers))
154
+ end
155
+ end
156
+
157
+ def get_from_cache(path, headers)
158
+ response = @cache.load(path)
159
+
160
+ if response == nil
161
+ response = request(:get, path, nil, merge_default_headers(headers))
162
+ @cache.save(path, response)
163
+ end
164
+
165
+ response
147
166
  end
148
167
 
168
+
149
169
  def head(path, headers = {})
150
170
  request(:head, path, nil, merge_default_headers(headers))
151
171
  end
@@ -0,0 +1,80 @@
1
+ module JIRA
2
+
3
+ class RequestCache
4
+
5
+ def initialize(time_to_live)
6
+ @time_to_live = time_to_live
7
+ end
8
+
9
+ def load(path)
10
+ key = cache_key(path)
11
+ cache_object = cache(path)
12
+ response = verify cache_object[key]
13
+
14
+ if response == :expired
15
+ cache_object.delete(key)
16
+ cache_file(path, 'w+').write(Marshal.dump(cache_object))
17
+ nil
18
+ else
19
+ response
20
+ end
21
+ end
22
+
23
+ def save(path, response)
24
+ now = Time.now.to_i
25
+
26
+ new_cache = cache(path)
27
+ new_cache[cache_key(path)] = {
28
+ 'data' => response,
29
+ 'timestamp' => now
30
+ }
31
+
32
+ cache_file(path, 'w+').write(Marshal.dump(new_cache))
33
+ end
34
+
35
+
36
+ private
37
+
38
+ def verify(cache_value)
39
+ now = Time.now.to_i
40
+ #binding.pry
41
+ if cache_value == nil
42
+ return nil
43
+ elsif cache_value['timestamp'] < (now - @time_to_live)
44
+ :expired
45
+ else
46
+ cache_value['data']
47
+ end
48
+ end
49
+
50
+ def cache(path)
51
+ #binding.pry
52
+ if File.exists? 'cache/' + path
53
+ Marshal.restore(cache_file(path, 'r+').read())
54
+ else
55
+ {}
56
+ end
57
+ end
58
+
59
+ def cache_key(path)
60
+ return "key"
61
+ #Marshal.dump(path)
62
+ end
63
+
64
+ def cache_file(path, mode)
65
+ dir = cache_dir
66
+ File.new(dir + '/' + path, mode)
67
+ end
68
+
69
+ def cache_dir
70
+ dir = 'cache'
71
+
72
+ unless Dir.exists? dir
73
+ FileUtils.mkdir_p(dir)
74
+ end
75
+
76
+ dir
77
+ end
78
+ end
79
+
80
+ end
@@ -47,27 +47,6 @@ module JIRA
47
47
  client.Sprint.build(sprint)
48
48
  end
49
49
  end
50
-
51
- # get velocities of agile board
52
- def velocities
53
- search_url = client.options[:site] +
54
- '/rest/greenhopper/1.0/rapid/charts/velocity.json?rapidViewId=' + id.to_s
55
-
56
- begin
57
- response = client.get(search_url)
58
- rescue
59
- return []
60
- end
61
-
62
- json = self.class.parse_json(response.body)
63
- json['velocityStatEntries'].map do |velocity|
64
- client.Velocity.build({
65
- "sprint_id" => velocity[0],
66
- "estimated" => velocity[1]['estimated']['value'],
67
- "completed" => velocity[1]['completed']['value']
68
- })
69
- end
70
- end
71
50
 
72
51
  end
73
52
  end
@@ -30,52 +30,20 @@ module JIRA
30
30
  end
31
31
  end
32
32
 
33
- def velocity=(velocity)
34
- @attrs["velocity"] = velocity
35
- end
36
-
37
- def velocity
38
- unless attrs.keys.include? "velocity"
39
- @attrs["velocity"] = get_velocity
40
- end
41
-
42
- @attrs["velocity"]
43
- end
44
-
45
- private
46
- def get_velocity
47
- search_url = client.options[:site] +
48
- '/rest/greenhopper/1.0/rapid/charts/velocity.json?rapidViewId=' + agileboard_id.to_s
49
- begin
50
- response = client.get(search_url).body
51
- rescue
52
- return empty_velocity
33
+ def sprint_report
34
+ if @sprint_report
35
+ return @sprint_report
53
36
  end
54
37
 
55
- json = self.class.parse_json(response)
56
- resultVelocity = json['velocityStatEntries'].select do |sprint_id|
57
- sprint_id.to_i == id.to_i
58
- end
59
-
60
- if resultVelocity.length == 0
61
- return empty_velocity
62
- end
38
+ search_url = client.options[:site] + "/rest/greenhopper/1.0/rapid/charts/sprintreport?rapidViewId=" +
39
+ agileboard_id.to_s + "&sprintId=" + id.to_s
63
40
 
64
- client.Velocity.build({
65
- "sprint_id" => id,
66
- "estimated" => resultVelocity[id.to_s]['estimated']['value'],
67
- "completed" => resultVelocity[id.to_s]['completed']['value']
68
- })
69
- end
41
+ response = client.get(search_url)
42
+ json = self.class.parse_json(response.body)
70
43
 
71
- def empty_velocity
72
- client.Velocity.build({
73
- "sprint_id" => id,
74
- "estimated" => 0,
75
- "completed" => 0
76
- })
44
+ client.SprintReport.build(json['contents'])
77
45
  end
78
46
 
79
47
  end
80
48
  end
81
- end
49
+ end
@@ -0,0 +1,10 @@
1
+ module JIRA
2
+ module Resource
3
+
4
+ class SprintReportFactory < JIRA::BaseFactory # :nodoc:
5
+ end
6
+
7
+ class SprintReport < JIRA::Base ; end
8
+
9
+ end
10
+ end
data/lib/jira/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module JIRA
2
- VERSION = "0.1.20"
2
+ VERSION = "0.1.21"
3
3
  end
data/lib/jira.rb CHANGED
@@ -18,7 +18,7 @@ require 'jira/resource/version'
18
18
  require 'jira/resource/status'
19
19
  require 'jira/resource/transition'
20
20
  require 'jira/resource/filter'
21
- require 'jira/resource/velocity'
21
+ require 'jira/resource/sprint_report'
22
22
  require 'jira/resource/sprint'
23
23
  require 'jira/resource/project'
24
24
  require 'jira/resource/priority'
@@ -28,6 +28,7 @@ require 'jira/resource/issue'
28
28
  require 'jira/resource/field'
29
29
  require 'jira/resource/agileboard'
30
30
 
31
+ require 'jira/request_cache'
31
32
  require 'jira/request_client'
32
33
  require 'jira/oauth_client'
33
34
  require 'jira/http_client'
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::RequestCache do
4
+
5
+ subject {
6
+ JIRA::RequestCache.new(86400000)
7
+ }
8
+
9
+ let(:now) { Time.now.to_i }
10
+ let(:response) { {"key" => {"data" => "foo", "timestamp" => now}} }
11
+ let(:test_file) { double("test_file", :read => Marshal.dump(response), :write => nil) }
12
+
13
+ before(:each) do
14
+ File.stub(:exists?) { true }
15
+ Dir.stub(:exists?) { true }
16
+ end
17
+
18
+ describe 'load' do
19
+
20
+ context "existing cache file" do
21
+
22
+ before(:each) do
23
+ File.should_receive(:new).with('cache/test_path', 'r+').and_return(test_file)
24
+ end
25
+
26
+ it "should create cache dir if not exists" do
27
+ Dir.stub(:exists?) { false }
28
+ FileUtils.should_receive(:mkdir_p).at_least(1).times.with('cache')
29
+ subject.load('test_path')
30
+ end
31
+
32
+ it "should load from correct path" do
33
+ subject.load('test_path')
34
+ end
35
+
36
+ it "should return the correct result" do
37
+ subject.load('test_path').should == 'foo'
38
+ end
39
+
40
+ it "should delete expired entries" do
41
+ Time.should_receive(:now).and_return(double('now', { :to_i => 572349597437239075456456 }))
42
+ File.should_receive(:new).with('cache/test_path', 'w+').and_return(test_file)
43
+ test_file.should_receive(:write).with(Marshal.dump({}))
44
+
45
+ subject.load('test_path')
46
+ end
47
+ end
48
+
49
+ context "without existing cache file" do
50
+
51
+ it "should not try to load file if not exists" do
52
+ File.stub(:exists?) { false }
53
+ File.should_receive(:new).exactly(0).times
54
+ subject.load('test_path')
55
+ end
56
+
57
+ end
58
+ end
59
+
60
+ describe 'save' do
61
+
62
+ before(:each) do
63
+ Time.stub(:now) { double({:to_i => 42}) }
64
+ File.should_receive(:new).with('cache/test_path', 'r+').and_return(test_file)
65
+ File.should_receive(:new).with('cache/test_path', 'w+').and_return(test_file)
66
+ end
67
+
68
+ let(:test_response) { 'bar' }
69
+
70
+ it "should load from correct path" do
71
+ subject.save('test_path', test_response)
72
+ end
73
+
74
+ it "should save the correct response" do
75
+ expected_cache = {"key" => {"data" => test_response, "timestamp" => 42}}
76
+ test_file.should_receive(:write).with(Marshal.dump(expected_cache))
77
+
78
+ subject.save('test_path', test_response)
79
+ end
80
+ end
81
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jira-ruby-dmg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.20
4
+ version: 0.1.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - ThisIs! DMG
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-26 00:00:00.000000000 Z
11
+ date: 2014-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -118,6 +118,7 @@ files:
118
118
  - lib/jira/http_error.rb
119
119
  - lib/jira/oauth_client.rb
120
120
  - lib/jira/railtie.rb
121
+ - lib/jira/request_cache.rb
121
122
  - lib/jira/request_client.rb
122
123
  - lib/jira/resource/agileboard.rb
123
124
  - lib/jira/resource/attachment.rb
@@ -130,10 +131,10 @@ files:
130
131
  - lib/jira/resource/priority.rb
131
132
  - lib/jira/resource/project.rb
132
133
  - lib/jira/resource/sprint.rb
134
+ - lib/jira/resource/sprint_report.rb
133
135
  - lib/jira/resource/status.rb
134
136
  - lib/jira/resource/transition.rb
135
137
  - lib/jira/resource/user.rb
136
- - lib/jira/resource/velocity.rb
137
138
  - lib/jira/resource/version.rb
138
139
  - lib/jira/resource/worklog.rb
139
140
  - lib/jira/tasks.rb
@@ -159,6 +160,7 @@ files:
159
160
  - spec/jira/http_client_spec.rb
160
161
  - spec/jira/http_error_spec.rb
161
162
  - spec/jira/oauth_client_spec.rb
163
+ - spec/jira/request_cache_spec.rb
162
164
  - spec/jira/request_client_spec.rb
163
165
  - spec/jira/resource/attachment_spec.rb
164
166
  - spec/jira/resource/filter_spec.rb
@@ -254,6 +256,7 @@ test_files:
254
256
  - spec/jira/http_client_spec.rb
255
257
  - spec/jira/http_error_spec.rb
256
258
  - spec/jira/oauth_client_spec.rb
259
+ - spec/jira/request_cache_spec.rb
257
260
  - spec/jira/request_client_spec.rb
258
261
  - spec/jira/resource/attachment_spec.rb
259
262
  - spec/jira/resource/filter_spec.rb
@@ -1,11 +0,0 @@
1
- module JIRA
2
- module Resource
3
-
4
- class VelocityFactory < JIRA::BaseFactory # :nodoc:
5
- end
6
-
7
- class Velocity < JIRA::Base
8
- end
9
-
10
- end
11
- end