jiralicious 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/README.md +3 -0
  2. data/jiralicious.gemspec +0 -2
  3. data/lib/jiralicious.rb +4 -0
  4. data/lib/jiralicious/avatar.rb +101 -0
  5. data/lib/jiralicious/base.rb +53 -15
  6. data/lib/jiralicious/configuration.rb +30 -4
  7. data/lib/jiralicious/custom_field_option.rb +7 -3
  8. data/lib/jiralicious/errors.rb +10 -0
  9. data/lib/jiralicious/field.rb +23 -12
  10. data/lib/jiralicious/issue.rb +69 -11
  11. data/lib/jiralicious/issue/comment.rb +54 -12
  12. data/lib/jiralicious/issue/fields.rb +44 -3
  13. data/lib/jiralicious/issue/transitions.rb +42 -11
  14. data/lib/jiralicious/issue/watchers.rb +19 -2
  15. data/lib/jiralicious/parsers/field_parser.rb +12 -0
  16. data/lib/jiralicious/project.rb +7 -1
  17. data/lib/jiralicious/project/avatar.rb +126 -0
  18. data/lib/jiralicious/search.rb +9 -0
  19. data/lib/jiralicious/search_result.rb +15 -7
  20. data/lib/jiralicious/session.rb +5 -0
  21. data/lib/jiralicious/user.rb +154 -0
  22. data/lib/jiralicious/user/avatar.rb +130 -0
  23. data/lib/jiralicious/version.rb +1 -1
  24. data/spec/avatar_spec.rb +50 -0
  25. data/spec/basic_session_spec.rb +4 -0
  26. data/spec/comment_spec.rb +2 -2
  27. data/spec/fixtures/avatar.json +7 -0
  28. data/spec/fixtures/avatar_custom.json +16 -0
  29. data/spec/fixtures/avatar_list.json +16 -0
  30. data/spec/fixtures/avatar_temp.json +7 -0
  31. data/spec/fixtures/avatar_test.png +0 -0
  32. data/spec/fixtures/user.json +27 -0
  33. data/spec/fixtures/user_array.json +26 -0
  34. data/spec/fixtures/user_picker.json +18 -0
  35. data/spec/issue_spec.rb +10 -9
  36. data/spec/project_avatar_spec.rb +66 -0
  37. data/spec/project_spec.rb +2 -2
  38. data/spec/search_spec.rb +2 -1
  39. data/spec/support/http.rb +24 -0
  40. data/spec/user_avatar_spec.rb +66 -0
  41. data/spec/user_spec.rb +79 -0
  42. data/spec/watchers_spec.rb +2 -2
  43. metadata +30 -18
@@ -0,0 +1,130 @@
1
+ # encoding: utf-8
2
+ module Jiralicious
3
+ class User
4
+ ##
5
+ # Avatars in the Project class.
6
+ #
7
+ class Avatar < Jiralicious::Base
8
+
9
+ ##
10
+ # Initialization Method
11
+ #
12
+ # [Arguments]
13
+ # :decoded_json (optional) decoded json object
14
+ #
15
+ def initialize(decoded_json = nil)
16
+ @loaded = false
17
+ if !decoded_json.nil?
18
+ if decoded_json.is_a? Hash
19
+ decoded_json = properties_from_hash(decoded_json)
20
+ super(decoded_json)
21
+ parse!(decoded_json)
22
+ self.each do |k, v|
23
+ if v.is_a? Hash
24
+ self[k] = self.class.new(v)
25
+ elsif v.is_a? Array
26
+ v.each_index do |i|
27
+ if v[i].is_a? Hash
28
+ v[i] = self.class.new(v[i])
29
+ end
30
+ end
31
+ self[k] = v
32
+ end
33
+ end
34
+ @loaded = true
35
+ else
36
+ i = 0;
37
+ decoded_json.each do |list|
38
+ if !list['id'].nil?
39
+ if numeric? list['id']
40
+ id = :"id_#{list['id']}"
41
+ else
42
+ id = :"#{list['id']}"
43
+ end
44
+ else
45
+ id = :"_#{i}"
46
+ i += 1
47
+ end
48
+ self.class.property id
49
+ self[id] = self.class.new(list)
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ class << self
56
+ ##
57
+ # Converts the temporary avatar to a real avatar
58
+ #
59
+ # [Arguments]
60
+ # :username (required) username to change
61
+ #
62
+ # :cropperWidth (optional) width of the avatar
63
+ #
64
+ # :cropperOffsetX (optional) X offset on image
65
+ #
66
+ # :cropperOffsetY (optional) Y offset on image
67
+ #
68
+ # :needsCropping (optional) boolean if it needs cropping
69
+ #
70
+ def post(username, options = {})
71
+ options.merge!({:username => username})
72
+ response = fetch({:method => :post, :parent_uri => "#{parent_name}/", :body => options})
73
+ end
74
+
75
+ ##
76
+ # Update Avatar information
77
+ #
78
+ # [Arguments]
79
+ # :username (required) project key
80
+ #
81
+ # :options (optional) not documented
82
+ #
83
+ def put(username, options = {})
84
+ options.merge!({:username => username})
85
+ response = fetch({:method => :put, :parent_uri => "#{parent_name}/", :body => options})
86
+ end
87
+
88
+ ##
89
+ # Creates temporary avatar
90
+ #
91
+ # [Arguments]
92
+ # :username (required) project key
93
+ #
94
+ # :filename (optional) file to upload
95
+ #
96
+ # :size (optional) size of the file
97
+ #
98
+ def temporary(username, options = {})
99
+ options.merge!({:username => username})
100
+ response = fetch({:method => :post, :parent_uri => "#{parent_name}/", :key => 'temporary', :body => options})
101
+ return self.new(response.parsed_response)
102
+ end
103
+
104
+ ##
105
+ # Deletes or removes the avatar from the project
106
+ #
107
+ # [Arguments]
108
+ # :username (required) project key
109
+ #
110
+ # :id (required) avatar id
111
+ #
112
+ def remove(username, id)
113
+ response = fetch({:method => :delete, :body_to_params => true, :parent_uri => "#{parent_name}/", :key => "#{id}", :body => {:username => username}})
114
+ end
115
+
116
+ ##
117
+ # Gets a list of avatars
118
+ #
119
+ # [Arguments]
120
+ # :username (required) user name
121
+ #
122
+ def avatars(username, options = {})
123
+ options.merge!({:username => username})
124
+ response = fetch({:method => :get, :body_to_params => true, :url => "#{Jiralicious.rest_path}/#{parent_name}/#{endpoint_name}s", :body => options})
125
+ return self.new(response.parsed_response)
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -1,4 +1,4 @@
1
1
  module Jiralicious
2
2
  # Current Jiralicious Version
3
- VERSION = "0.3.0"
3
+ VERSION = "0.4.0"
4
4
  end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe Jiralicious, "avatar" do
5
+
6
+ before :each do
7
+ Jiralicious.configure do |config|
8
+ config.username = "jstewart"
9
+ config.password = "topsecret"
10
+ config.uri = "http://jstewart:topsecret@localhost"
11
+ config.auth_type = :basic
12
+ config.api_version = "latest"
13
+ end
14
+
15
+ FakeWeb.register_uri(:get,
16
+ "#{Jiralicious.rest_path}/avatar/user/system",
17
+ :status => "200",
18
+ :body => avatar_list_json)
19
+ FakeWeb.register_uri(:post,
20
+ "#{Jiralicious.rest_path}/avatar/user/temporary",
21
+ :status => "200",
22
+ :body => avatar_temp_json)
23
+ FakeWeb.register_uri(:post,
24
+ "#{Jiralicious.rest_path}/avatar/user/temporaryCrop",
25
+ :status => "200")
26
+ end
27
+
28
+ it "obtain system avatar list" do
29
+ avatar = Jiralicious::Avatar.system('user')
30
+ avatar.should be_instance_of(Jiralicious::Avatar)
31
+ avatar.system.count.should == 2
32
+ avatar.system[0].id.should == '10100'
33
+ avatar.system[1].isSystemAvatar.should == true
34
+ end
35
+
36
+ it "sends new avatar" do
37
+ file = "#{File.dirname(__FILE__)}/fixtures/avatar_test.png"
38
+ avatar = Jiralicious::Avatar.temporary('user', {:filename => file, :size => 4035})
39
+ avatar.needsCropping.should == true
40
+ end
41
+
42
+ it "crops the current avatar" do
43
+ response = Jiralicious::Avatar.temporary_crop('user', {:cropperWidth => 120,
44
+ :cropperOffsetX => 50,
45
+ :cropperOffsety => 50,
46
+ :needsCropping => false})
47
+ response.response.class.should == Net::HTTPOK
48
+ end
49
+
50
+ end
@@ -3,6 +3,10 @@ require "spec_helper"
3
3
 
4
4
  describe "performing a request" do
5
5
  before :each do
6
+ Jiralicious.configure do |config|
7
+ config.uri = "http://jstewart:topsecret@localhost"
8
+ end
9
+
6
10
  FakeWeb.register_uri(:get,
7
11
  Jiralicious.uri + '/ok',
8
12
  :status => "200")
@@ -7,8 +7,8 @@ describe Jiralicious, "search" do
7
7
  Jiralicious.configure do |config|
8
8
  config.username = "jstewart"
9
9
  config.password = "topsecret"
10
- config.uri = "http://localhost"
11
- config.auth_type = :cookie
10
+ config.uri = "http://jstewart:topsecret@localhost"
11
+ config.auth_type = :basic
12
12
  config.api_version = "latest"
13
13
  end
14
14
 
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "10100",
3
+ "owner": "fred",
4
+ "isSystemAvatar": true,
5
+ "isSelected": true,
6
+ "selected": true
7
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "system": [
3
+ {
4
+ "id": "10100",
5
+ "isSystemAvatar": false,
6
+ "isSelected": false,
7
+ "selected": false
8
+ },
9
+ {
10
+ "id": "10101",
11
+ "isSystemAvatar": true,
12
+ "isSelected": false,
13
+ "selected": false
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "system": [
3
+ {
4
+ "id": "10100",
5
+ "isSystemAvatar": false,
6
+ "isSelected": false,
7
+ "selected": false
8
+ },
9
+ {
10
+ "id": "10101",
11
+ "isSystemAvatar": true,
12
+ "isSelected": false,
13
+ "selected": false
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "cropperWidth": 120,
3
+ "cropperOffsetX": 50,
4
+ "cropperOffsetY": 50,
5
+ "url": "http://example.com/jira/secure/temporaryavatar?cropped=true",
6
+ "needsCropping": true
7
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "self": "http://www.example.com/jira/rest/api/2/user?username=test_user",
3
+ "name": "test",
4
+ "emailAddress": "test_user@example.com",
5
+ "avatarUrls": {
6
+ "16x16": "http://www.example.com/jira/secure/useravatar?size=small&ownerId=test_user",
7
+ "48x48": "http://www.example.com/jira/secure/useravatar?size=large&ownerId=test_user"
8
+ },
9
+ "displayName": "Test User",
10
+ "active": true,
11
+ "timeZone": "Australia/Sydney",
12
+ "groups": {
13
+ "size": 3,
14
+ "items": [
15
+ {
16
+ "name": "jira-user"
17
+ },
18
+ {
19
+ "name": "jira-admin"
20
+ },
21
+ {
22
+ "name": "important"
23
+ }
24
+ ]
25
+ },
26
+ "expand": "groups"
27
+ }
@@ -0,0 +1,26 @@
1
+ [
2
+ {
3
+ "self": "http://www.example.com/jira/rest/api/2/user?username=test_user",
4
+ "name": "test_user",
5
+ "emailAddress": "test_user@example.com",
6
+ "avatarUrls": {
7
+ "16x16": "http://www.example.com/jira/secure/useravatar?size=small&ownerId=test_user",
8
+ "48x48": "http://www.example.com/jira/secure/useravatar?size=large&ownerId=test_user"
9
+ },
10
+ "displayName": "Test User",
11
+ "active": false,
12
+ "timeZone": "America/Chicago"
13
+ },
14
+ {
15
+ "self": "http://www.example.com/jira/rest/api/2/user?username=simple_user",
16
+ "name": "simple_user",
17
+ "emailAddress": "simple_user@example.com",
18
+ "avatarUrls": {
19
+ "16x16": "http://www.example.com/jira/secure/useravatar?size=small&ownerId=simple_user",
20
+ "48x48": "http://www.example.com/jira/secure/useravatar?size=large&ownerId=simple_user"
21
+ },
22
+ "displayName": "Simple User",
23
+ "active": false,
24
+ "timeZone": "America/Chicago"
25
+ }
26
+ ]
@@ -0,0 +1,18 @@
1
+ {
2
+ "users": [
3
+ {
4
+ "name": "test_user",
5
+ "html": "test_user@example.com",
6
+ "displayName": "Test User",
7
+ "avatarUrl": "http://www.example.com/jira/secure/useravatar?size=small&ownerId=test_user"
8
+ },
9
+ {
10
+ "name": "simple_user",
11
+ "html": "simple_user@example.com",
12
+ "displayName": "Simple User",
13
+ "avatarURL": "http://www.example.com/jira/secure/useravatar?size=small&ownerId=simple_user"
14
+ }
15
+ ],
16
+ "total": 2,
17
+ "header": "Showing 2 of 25 matching groups"
18
+ }
@@ -7,8 +7,8 @@ describe Jiralicious::Issue, "finding" do
7
7
  Jiralicious.configure do |config|
8
8
  config.username = "jstewart"
9
9
  config.password = "topsecret"
10
- config.uri = "http://localhost"
11
- config.auth_type = :cookie
10
+ config.uri = "http://jstewart:topsecret@localhost"
11
+ config.auth_type = :basic
12
12
  config.api_version = "latest"
13
13
  end
14
14
 
@@ -56,8 +56,8 @@ describe Jiralicious::Issue, "Managing Issues" do
56
56
  Jiralicious.configure do |config|
57
57
  config.username = "jstewart"
58
58
  config.password = "topsecret"
59
- config.uri = "http://localhost"
60
- config.auth_type = :cookie
59
+ config.uri = "http://jstewart:topsecret@localhost"
60
+ config.auth_type = :basic
61
61
  config.api_version = "latest"
62
62
  end
63
63
 
@@ -159,8 +159,8 @@ describe Jiralicious::Issue, "Managing Issues" do
159
159
  Jiralicious.configure do |config|
160
160
  config.username = "jstewart"
161
161
  config.password = "topsecret"
162
- config.uri = "http://localhost"
163
- config.auth_type = :cookie
162
+ config.uri = "http://jstewart:topsecret@localhost"
163
+ config.auth_type = :basic
164
164
  config.api_version = "latest"
165
165
  end
166
166
 
@@ -215,8 +215,8 @@ describe Jiralicious::Issue, "Issue Information and Field Class" do
215
215
  Jiralicious.configure do |config|
216
216
  config.username = "jstewart"
217
217
  config.password = "topsecret"
218
- config.uri = "http://localhost"
219
- config.auth_type = :cookie
218
+ config.uri = "http://jstewart:topsecret@localhost"
219
+ config.auth_type = :basic
220
220
  config.api_version = "latest"
221
221
  end
222
222
 
@@ -281,7 +281,8 @@ describe Jiralicious::Issue, "transitions" do
281
281
  Jiralicious.configure do |config|
282
282
  config.username = "jstewart"
283
283
  config.password = "topsecret"
284
- config.uri = "http://localhost"
284
+ config.uri = "http://jstewart:topsecret@localhost"
285
+ config.auth_type = :basic
285
286
  config.api_version = "latest"
286
287
  end
287
288
 
@@ -0,0 +1,66 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe Jiralicious, "Project Avatar" do
5
+
6
+ before :each do
7
+ Jiralicious.configure do |config|
8
+ config.username = "jstewart"
9
+ config.password = "topsecret"
10
+ config.uri = "http://jstewart:topsecret@localhost"
11
+ config.auth_type = :basic
12
+ config.api_version = "latest"
13
+ end
14
+
15
+ FakeWeb.register_uri(:put,
16
+ "#{Jiralicious.rest_path}/project/EX/avatar/",
17
+ :status => "204")
18
+ FakeWeb.register_uri(:post,
19
+ "#{Jiralicious.rest_path}/project/EX/avatar/",
20
+ :status => "200")
21
+ FakeWeb.register_uri(:delete,
22
+ "#{Jiralicious.rest_path}/project/EX/avatar/10100",
23
+ :status => "200")
24
+ FakeWeb.register_uri(:get,
25
+ "#{Jiralicious.rest_path}/project/EX/avatars/",
26
+ :status => "200",
27
+ :body => avatar_list_json)
28
+ FakeWeb.register_uri(:post,
29
+ "#{Jiralicious.rest_path}/project/EX/avatar/temporary",
30
+ :status => "200",
31
+ :body => avatar_temp_json)
32
+ end
33
+
34
+ it "obtain project avatar list" do
35
+ avatar = Jiralicious::Project::Avatar.avatars('EX')
36
+ avatar.should be_instance_of(Jiralicious::Project::Avatar)
37
+ avatar.system.count.should == 2
38
+ avatar.system[0].id.should == '10100'
39
+ avatar.system[1].isSystemAvatar.should == true
40
+ end
41
+
42
+ it "sends new project avatar" do
43
+ file = "#{File.dirname(__FILE__)}/fixtures/avatar_test.png"
44
+ avatar = Jiralicious::Project::Avatar.temporary('EX', {:filename => file, :size => 4035})
45
+ avatar.needsCropping.should == true
46
+ end
47
+
48
+ it "crops the current project avatar" do
49
+ response = Jiralicious::Project::Avatar.post('EX', {:cropperWidth => 120,
50
+ :cropperOffsetX => 50,
51
+ :cropperOffsety => 50,
52
+ :needsCropping => false})
53
+ response.response.class.should == Net::HTTPOK
54
+ end
55
+
56
+ it "updates current project avatar" do
57
+ response = Jiralicious::Project::Avatar.put('EX')
58
+ response.response.class.should == Net::HTTPNoContent
59
+ end
60
+
61
+ it "updates current project avatar" do
62
+ response = Jiralicious::Project::Avatar.remove('EX', 10100)
63
+ response.response.class.should == Net::HTTPOK
64
+ end
65
+
66
+ end