limelm 0.1.0

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.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/Gemfile +15 -0
  4. data/Gemfile.lock +75 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.md +75 -0
  7. data/Rakefile +50 -0
  8. data/TODO.md +10 -0
  9. data/VERSION +1 -0
  10. data/lib/lime_lm/connection.rb +23 -0
  11. data/lib/lime_lm/exceptions.rb +6 -0
  12. data/lib/lime_lm/feature.rb +62 -0
  13. data/lib/lime_lm/key.rb +83 -0
  14. data/lib/lime_lm/utils.rb +7 -0
  15. data/lib/limelm.rb +30 -0
  16. data/limelm.gemspec +89 -0
  17. data/spec/fixtures/dish_cassettes/all_features.yml +47 -0
  18. data/spec/fixtures/dish_cassettes/create_custom_feature.yml +46 -0
  19. data/spec/fixtures/dish_cassettes/create_detailed_key.yml +46 -0
  20. data/spec/fixtures/dish_cassettes/create_key_default_configuration.yml +46 -0
  21. data/spec/fixtures/dish_cassettes/create_key_new_version.yml +46 -0
  22. data/spec/fixtures/dish_cassettes/create_keys_with_email.yml +46 -0
  23. data/spec/fixtures/dish_cassettes/create_product_default_feature.yml +46 -0
  24. data/spec/fixtures/dish_cassettes/default_search.yml +46 -0
  25. data/spec/fixtures/dish_cassettes/default_search_pagination.yml +46 -0
  26. data/spec/fixtures/dish_cassettes/destroy_feature.yml +46 -0
  27. data/spec/fixtures/dish_cassettes/destroy_key.yml +46 -0
  28. data/spec/fixtures/dish_cassettes/destroy_random_key.yml +47 -0
  29. data/spec/fixtures/dish_cassettes/details_for_a_given_key.yml +46 -0
  30. data/spec/fixtures/dish_cassettes/details_for_a_given_key_with_tags.yml +46 -0
  31. data/spec/fixtures/dish_cassettes/find_keys_by_email.yml +46 -0
  32. data/spec/fixtures/dish_cassettes/id_for_a_given_key.yml +46 -0
  33. data/spec/fixtures/dish_cassettes/remove_tag_for_a_given_key.yml +46 -0
  34. data/spec/fixtures/dish_cassettes/revoke_key.yml +46 -0
  35. data/spec/fixtures/dish_cassettes/set_tags_for_a_given_key.yml +46 -0
  36. data/spec/fixtures/dish_cassettes/unrevoke_key.yml +46 -0
  37. data/spec/fixtures/dish_cassettes/update_custom_feature.yml +46 -0
  38. data/spec/lib/lime_lm/feature_spec.rb +86 -0
  39. data/spec/lib/lime_lm/key_spec.rb +212 -0
  40. data/spec/lib/limelm_spec.rb +37 -0
  41. data/spec/spec_helper.rb +70 -0
  42. metadata +142 -0
@@ -0,0 +1,46 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://wyday.com/limelm/api/rest?api_key=new_key_from_yaml&format=json&method=limelm.pkey.revoke&pkey_id=1&revoke=true
6
+ body:
7
+ encoding: UTF-8
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Mon, 02 Mar 2015 17:17:35 GMT
25
+ Content-Type:
26
+ - application/json
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - PHPSESSID=4cp2glbm9k5eiauq3cjhgj7s25; path=/
33
+ Expires:
34
+ - Thu, 19 Nov 1981 08:52:00 GMT
35
+ Cache-Control:
36
+ - no-store, no-cache, must-revalidate, post-check=0, pre-check=0
37
+ Pragma:
38
+ - no-cache
39
+ X-Frame-Options:
40
+ - SAMEORIGIN
41
+ body:
42
+ encoding: UTF-8
43
+ string: jsonLimeLMApi({"stat":"ok"})
44
+ http_version:
45
+ recorded_at: Mon, 02 Mar 2015 17:17:35 GMT
46
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,46 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://wyday.com/limelm/api/rest?api_key=new_key_from_yaml&format=json&method=limelm.pkey.setTags&pkey_id=1&tag%5B%5D=demo&tag%5B%5D=enterprise
6
+ body:
7
+ encoding: UTF-8
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Fri, 27 Feb 2015 15:13:17 GMT
25
+ Content-Type:
26
+ - application/json
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - PHPSESSID=6tif4d0nffmfevep96tp5m9r71; path=/
33
+ Expires:
34
+ - Thu, 19 Nov 1981 08:52:00 GMT
35
+ Cache-Control:
36
+ - no-store, no-cache, must-revalidate, post-check=0, pre-check=0
37
+ Pragma:
38
+ - no-cache
39
+ X-Frame-Options:
40
+ - SAMEORIGIN
41
+ body:
42
+ encoding: UTF-8
43
+ string: jsonLimeLMApi({"stat":"ok"})
44
+ http_version:
45
+ recorded_at: Fri, 27 Feb 2015 15:13:17 GMT
46
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,46 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://wyday.com/limelm/api/rest?api_key=new_key_from_yaml&format=json&method=limelm.pkey.revoke&pkey_id=1&revoke=false
6
+ body:
7
+ encoding: UTF-8
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Mon, 02 Mar 2015 17:26:17 GMT
25
+ Content-Type:
26
+ - application/json
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - PHPSESSID=qe3dcp1vg20ev73mn249ci0d02; path=/
33
+ Expires:
34
+ - Thu, 19 Nov 1981 08:52:00 GMT
35
+ Cache-Control:
36
+ - no-store, no-cache, must-revalidate, post-check=0, pre-check=0
37
+ Pragma:
38
+ - no-cache
39
+ X-Frame-Options:
40
+ - SAMEORIGIN
41
+ body:
42
+ encoding: UTF-8
43
+ string: jsonLimeLMApi({"stat":"ok"})
44
+ http_version:
45
+ recorded_at: Mon, 02 Mar 2015 17:26:17 GMT
46
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,46 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://wyday.com/limelm/api/rest?api_key=new_key_from_yaml&description=updated_description&feature_id=3&format=json&method=limelm.feature.edit&name=updated_name&required=true&ta_readable=false
6
+ body:
7
+ encoding: UTF-8
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Tue, 03 Mar 2015 20:45:39 GMT
25
+ Content-Type:
26
+ - application/json
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - PHPSESSID=91fqd0ks6jjcp7ohq7lem5vr45; path=/
33
+ Expires:
34
+ - Thu, 19 Nov 1981 08:52:00 GMT
35
+ Cache-Control:
36
+ - no-store, no-cache, must-revalidate, post-check=0, pre-check=0
37
+ Pragma:
38
+ - no-cache
39
+ X-Frame-Options:
40
+ - SAMEORIGIN
41
+ body:
42
+ encoding: UTF-8
43
+ string: jsonLimeLMApi({"stat":"ok"})
44
+ http_version:
45
+ recorded_at: Tue, 03 Mar 2015 20:45:39 GMT
46
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe LimeLm::Feature do
4
+ describe '#initialize' do
5
+ it 'sets default object attributes' do
6
+ feature = LimeLm::Feature.new({
7
+ 'id' => '1',
8
+ 'name' => 'updates_expires',
9
+ 'type' => 'date_time',
10
+ 'ta_readable' => 'true',
11
+ 'required' => 'false',
12
+ 'description' => "Date when the license key expires."
13
+ })
14
+ assert_equal '1', feature.id
15
+ assert_equal 'updates_expires', feature.name
16
+ assert_equal 'date_time', feature.type
17
+ assert feature.ta_readable
18
+ assert !feature.required
19
+ assert !feature.description.empty?
20
+ end
21
+ end
22
+
23
+ describe '.all' do
24
+ it 'returns all the custom license fields for a given product version' do
25
+ VCR.use_cassette("all_features", match_requests_on: [:path]) do
26
+ result = LimeLm::Feature.all(version_id: '2')
27
+ assert_equal 1, result.count
28
+ feature = result.first
29
+ assert_instance_of LimeLm::Feature, feature
30
+ end
31
+ end
32
+ end
33
+
34
+ describe '.create' do
35
+ it 'creates a new product custom license field with a name by default' do
36
+ VCR.use_cassette("create_product_default_feature", match_requests_on: [:path]) do
37
+ new_feature_name = 'plan'
38
+ result = LimeLm::Feature.create(name: new_feature_name)
39
+ assert_instance_of LimeLm::Feature, result
40
+ assert_equal '2', result.id
41
+ assert_equal 'string', result.type
42
+ assert result.required, 'required by default'
43
+ assert result.ta_readable, 'readable by default'
44
+ end
45
+ end
46
+
47
+ it 'accepts more specified options' do
48
+ VCR.use_cassette("create_custom_feature", match_requests_on: [:path]) do
49
+ result = LimeLm::Feature.create(name: 'customized_plan', type: 'int', required: 'false',
50
+ ta_readable: 'false', description: 'new customized field')
51
+ assert_equal '3', result.id
52
+ assert_equal 'customized_plan', result.name
53
+ assert_equal 'int', result.type
54
+ assert_equal 'new customized field', result.description
55
+ assert !result.required
56
+ assert !result.ta_readable
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#update!' do
62
+ it 'updates features properties and returns true in case of success' do
63
+ VCR.use_cassette("update_custom_feature", match_requests_on: [:path]) do
64
+ feature = LimeLm::Feature.new(id: '3')
65
+ result = feature.update!(name: 'updated_name', required: 'true',
66
+ ta_readable: 'false', description: 'updated_description')
67
+
68
+ assert feature, 'Returns true if update succeed'
69
+ assert_equal '3', feature.id
70
+ assert_equal 'updated_name', feature.name
71
+ assert_equal 'updated_description', feature.description
72
+ assert feature.required
73
+ assert !feature.ta_readable
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '#destroy!' do
79
+ it 'returns true if the feature has been destroyed' do
80
+ VCR.use_cassette("destroy_feature", match_requests_on: [:path]) do
81
+ feature = LimeLm::Feature.new(id: '3')
82
+ assert feature.destroy!, 'Destroy should work'
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,212 @@
1
+ require 'spec_helper'
2
+
3
+ describe LimeLm::Key do
4
+ describe '#initialize' do
5
+ it 'raises an error if no id and no product key specified during Object creation' do
6
+ assert_raises(LimeLm::InvalidObject) { LimeLm::Key.new({}) }
7
+ LimeLm::Key.new({ 'id' => '1' })
8
+ LimeLm::Key.new({ 'key' => 'AAAA-BBBB' })
9
+ end
10
+
11
+ it 'sets default object attributes' do
12
+ key = LimeLm::Key.new({ 'id' => '1', 'key' => 'AAA-BBB', 'version_id' => '1',
13
+ 'email' => 'imberdis.damien@gmail.com' })
14
+ assert_equal 'imberdis.damien@gmail.com', key.email
15
+ assert_equal 'AAA-BBB', key.key
16
+ assert_equal '1', key.version_id
17
+ assert !key.revoked, 'A key is not revoked by default'
18
+ end
19
+ end
20
+
21
+ describe '#details' do
22
+ it 'assigns properties of a key and returns them' do
23
+ VCR.use_cassette("details_for_a_given_key", match_requests_on: [:path]) do
24
+ key = LimeLm::Key.new({ 'id' => '1' })
25
+ result = key.details
26
+ assert !key.key.empty?, 'Details about a key should reassign the key property'
27
+ assert !key.email.empty?, 'Details about a key should reassign the email property'
28
+ assert result.is_a?(Hash), 'All the properties should be returned'
29
+ end
30
+ end
31
+
32
+ it 'including all custom license fields and tags' do
33
+ VCR.use_cassette("details_for_a_given_key_with_tags", match_requests_on: [:path]) do
34
+ key = LimeLm::Key.new({ 'id' => '1' })
35
+ result = key.details
36
+ assert_equal [{"name"=>"enterprise"}, {"name"=>"demo"}], result['tags']['tag']
37
+ end
38
+ end
39
+ end
40
+
41
+ describe '#id' do
42
+ it 'returns the id property if already present in the object' do
43
+ key = LimeLm::Key.new({ 'id' => '1' })
44
+ assert_equal '1', key.id
45
+ end
46
+
47
+ it 'calls the API, save the id property and returns it if only the product key is present' do
48
+ VCR.use_cassette("id_for_a_given_key", match_requests_on: [:path]) do
49
+ key = LimeLm::Key.new({ 'key' => 'AAAA-BBBB' })
50
+ assert_equal '1', key.id
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#tag' do
56
+ it 'sets a key tags providing an Array' do
57
+ VCR.use_cassette("set_tags_for_a_given_key", match_requests_on: [:path]) do
58
+ key = LimeLm::Key.new({ 'id' => '1' })
59
+ tags = ['demo', 'enterprise']
60
+ assert key.tag(tags), 'returns true if success'
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#remove_tag' do
66
+ it 'removes the specialized tag' do
67
+ VCR.use_cassette("remove_tag_for_a_given_key", match_requests_on: [:path]) do
68
+ key = LimeLm::Key.new({ 'id' => '1' })
69
+ assert key.remove_tag('demo'), 'returns true if success'
70
+ end
71
+ end
72
+ end
73
+
74
+ describe '#update' do
75
+ #TODO: https://wyday.com/limelm/help/api/limelm.pkey.setDetails/
76
+ end
77
+
78
+ describe '#toggle_revoke!' do
79
+ it 'calls the API and set revoked to true in case of success for a non revoked key' do
80
+ VCR.use_cassette("revoke_key", match_requests_on: [:path]) do
81
+ key = LimeLm::Key.new({ 'id' => '1' })
82
+ assert !key.revoked, 'By default a key is not revoked after its initialization'
83
+ key.toggle_revoke!
84
+ assert key.revoked, 'The key is revoked if succeed'
85
+ end
86
+ end
87
+
88
+ it 'calls the API and unrevoke the key' do
89
+ VCR.use_cassette("unrevoke_key", match_requests_on: [:path]) do
90
+ key = LimeLm::Key.new({ 'id' => '1', 'revoked' => true })
91
+ assert key.revoked, 'the key should be revoked'
92
+ key.toggle_revoke!
93
+ assert !key.revoked, 'Unrevoke the key'
94
+ end
95
+ end
96
+ end
97
+
98
+ describe '.create' do
99
+ it 'creates a new default product key' do
100
+ VCR.use_cassette("create_key_default_configuration", match_requests_on: [:path]) do
101
+ result = LimeLm::Key.create
102
+ assert_equal 1, result.count, 'Should build an uniq key by default'
103
+ new_key = result.first
104
+ assert_instance_of LimeLm::Key, new_key
105
+ assert_equal '9', new_key.id
106
+ assert_equal 'CCCC-BBBB', new_key.key
107
+ assert new_key.version_id, 'version_id is set to the default configuration'
108
+ end
109
+ end
110
+
111
+ it 'associates keys to an email and can generate more than a key' do
112
+ VCR.use_cassette("create_keys_with_email", match_requests_on: [:path]) do
113
+ email = 'imberdis.damien@gmail.com'
114
+
115
+ result = LimeLm::Key.create(email: email, num_keys: 2)
116
+ assert_equal 2, result.count
117
+
118
+ first_key, second_key = result.first, result.last
119
+ assert_instance_of LimeLm::Key, first_key
120
+ assert_instance_of LimeLm::Key, second_key
121
+
122
+ assert_equal email, first_key.email
123
+ assert_equal email, second_key.email
124
+ end
125
+ end
126
+
127
+ it 'accept more detailed configuration about the limitation of activations/deactivations' do
128
+ VCR.use_cassette("create_detailed_key", match_requests_on: [:path]) do
129
+ email = 'imberdis.damien@gmail.com'
130
+
131
+ result = LimeLm::Key.create(email: email, num_acts: 5, deact_limit: 2)
132
+ assert '9', result.first.id
133
+ assert 'CCCC-EEEE', result.first.key
134
+ end
135
+ end
136
+
137
+ it 'accepts the creation of a new key, specifying a product version_id (not using the default configuration)' do
138
+ VCR.use_cassette("create_key_new_version", match_requests_on: [:path]) do
139
+ result = LimeLm::Key.create(version_id: '2')
140
+ assert_equal '2', result.first.version_id
141
+ end
142
+ end
143
+ end
144
+
145
+ describe '#destroy!' do
146
+ it 'deletes a key' do
147
+ VCR.use_cassette("destroy_key", match_requests_on: [:path]) do
148
+ key_to_destroy = LimeLm::Key.new({ 'id' => '1' })
149
+ assert key_to_destroy.destroy!, 'Should return true if key deleted'
150
+ end
151
+ end
152
+
153
+ it 'raises error if try to delete a key out of my version_id' do
154
+ VCR.use_cassette("destroy_random_key", match_requests_on: [:path]) do
155
+ key_to_destroy = LimeLm::Key.new({ 'id' => '3' })
156
+ assert_raises(LimeLm::ApiError) { key_to_destroy.destroy! }
157
+ end
158
+ end
159
+ end
160
+
161
+ describe '.find' do
162
+ it 'returns a list of keys associated with an email' do
163
+ email = 'imberdis.damien@gmail.com'
164
+ VCR.use_cassette("find_keys_by_email", match_requests_on: [:path]) do
165
+ keys = LimeLm::Key.find(email)
166
+ assert_equal 2, keys.count
167
+ key = keys.first
168
+ assert key.is_a?(LimeLm::Key)
169
+
170
+ assert key.properties.is_a?(Hash) && !key.properties.empty?, 'All data are stored as a Hash under properties'
171
+ assert !key.id.empty?, 'A key should contains the id information'
172
+ assert !key.key.empty?, 'A key should contains the key information'
173
+ assert !key.version_id.empty?, 'A key as a link to its product version'
174
+ assert !key.email.empty?, 'A key as a link to the user email provided'
175
+ assert !key.properties['acts'].empty?, 'A key should contains the total of activations information'
176
+ assert !key.properties['acts_used'].empty?, 'A key should contains the used activations information'
177
+ end
178
+ end
179
+ end
180
+
181
+ describe '.search' do
182
+ it 'returns by default 20 keys of all products and versions' do
183
+ VCR.use_cassette("default_search", match_requests_on: [:path]) do
184
+ result = LimeLm::Key.search
185
+
186
+ # NOTE: the next values are only set for the purpose of a test
187
+ assert_equal 2, result.count
188
+ first_key, last_key = result.first, result.last
189
+
190
+ assert_instance_of LimeLm::Key, first_key
191
+ assert_equal '1', first_key.id
192
+ assert_equal '1', first_key.version_id
193
+
194
+ assert_instance_of LimeLm::Key, last_key
195
+ assert_equal '2', last_key.id
196
+ assert_equal '4', last_key.version_id
197
+ end
198
+ end
199
+
200
+ it 'paginates the result returned' do
201
+ VCR.use_cassette("default_search_pagination", match_requests_on: [:path]) do
202
+ result = LimeLm::Key.search(num: 2, page: 3)
203
+ assert_equal 2, result.count
204
+
205
+ first_key = result.first
206
+ assert_instance_of LimeLm::Key, first_key
207
+ assert_equal '10', first_key.id
208
+ assert_equal '2', first_key.version_id
209
+ end
210
+ end
211
+ end
212
+ end