adyen-admin 0.0.7 → 0.0.8

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 (28) hide show
  1. data/CHANGES.md +3 -1
  2. data/README.md +8 -0
  3. data/VERSION +1 -1
  4. data/lib/adyen-admin/skin.rb +78 -28
  5. data/spec/adyen-admin/skin_spec.rb +121 -30
  6. data/spec/fixtures/cassettes/Adyen_Admin_Client/_get/raises_authenticated_error_when_not_logged_in.yml +9 -9
  7. data/spec/fixtures/cassettes/Adyen_Admin_Client/_login/passes_with_correct_username_password.yml +35 -47
  8. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all/freezes_local_skins.yml +4 -4
  9. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all/returns_the_skins.yml +4 -4
  10. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all_remote/returns_the_skins.yml +4 -4
  11. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_all_remote/sets_local_path.yml +4 -4
  12. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_decompile/new_remote_skin/downloads_and_decompiles_skin.yml +133 -58
  13. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_download/gets_the_file.yml +65 -65
  14. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_download/is_a_zipfile.yml +65 -65
  15. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_find/returns_no_skin.yml +4 -4
  16. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_find/returns_the_skin.yml +4 -4
  17. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/{_version → _remote_version}/returns_live_value.yml +5 -5
  18. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/{_version → _remote_version}/returns_test_value.yml +6 -6
  19. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/{_version → _remote_version}/returns_uploaded_value.yml +7 -7
  20. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_test_url/returns_url_to_test.yml +17 -17
  21. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_update/create_skin_yml_file.yml +814 -0
  22. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_upload/valid_set/increases_version.yml +907 -106
  23. data/spec/fixtures/cassettes/Adyen_Admin_Skin/authenticated/_upload/valid_set/updates_skin_data.yml +6466 -0
  24. data/spec/fixtures/cassettes/login.yml +36 -48
  25. data/spec/fixtures/skins/DV3tf95f/skin.yml +6 -0
  26. metadata +28 -26
  27. data/spec/fixtures/skins/DV3tf95f/metadata.yml +0 -5
  28. data/spec/fixtures/skins/example-7hFAQnmt/metadata.yml +0 -5
data/CHANGES.md CHANGED
@@ -2,11 +2,13 @@
2
2
 
3
3
  ## vx.x.x - ???
4
4
  * update Docu
5
- * parse metafile
6
5
  * parent (instead of base)
7
6
  * add CLI binaries (to compile + upload) -> read from .adyenrc file
8
7
  * make compatible with Live system
9
8
 
9
+ ## v0.0.8 - ???
10
+ * parse metafile
11
+
10
12
  ## v0.0.7
11
13
  * fix download issue
12
14
  * fix name with multiple - issue
data/README.md CHANGED
@@ -29,6 +29,14 @@ zip_file = skin.download # get zip file
29
29
 
30
30
  skin.decompile(zip_file) # unzip file and move to skin path, backup + overwrite existing files
31
31
 
32
+ zip_file = skin.compile # unzip file and move to skin path, backup + overwrite existing files
33
+
34
+ skin.upload(zip_file)
35
+
36
+ skin.update # to get latest version
37
+
38
+ skin.test_url # a URL which you can use to 'live' test you skin
39
+
32
40
  ```
33
41
 
34
42
  ### Skins
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.7
1
+ 0.0.8
@@ -1,5 +1,6 @@
1
1
  require 'tempfile'
2
2
  require 'zip/zip'
3
+ require 'yaml'
3
4
 
4
5
  module Adyen
5
6
  module Admin
@@ -81,44 +82,56 @@ module Adyen
81
82
 
82
83
  def path=(new_path)
83
84
  if Skin.is_skin_path?(new_path)
84
- new_code, *new_name = File.basename(new_path).split("-").reverse
85
- self.code ||= new_code
86
- self.name ||= new_name.reverse.join("-")
87
- raise ArgumentError if self.code && self.code != new_code
88
85
  @path = new_path
86
+ if !skin_data.empty?
87
+ self.code = skin_data["code"]
88
+ self.name = skin_data["name"]
89
+ else
90
+ new_code, *new_name = File.basename(new_path).split("-").reverse
91
+ self.code ||= new_code
92
+ self.name ||= new_name.reverse.join("-")
93
+ raise ArgumentError if self.code && self.code != new_code
94
+ end
89
95
  end
90
96
  end
91
97
 
92
- ##################################
98
+ def skin_data(force_update = false)
99
+ update if force_update
100
+ @skin_data ||= YAML.load_file(skin_data_file) rescue {}
101
+ end
93
102
 
94
- def version(scope = :local)
95
- case scope
96
- when :test
97
- page = Adyen::Admin.get(VERSION_TEST % code)
98
- page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
99
- when :live
100
- page = Adyen::Admin.get(VERSION_LIVE % code)
101
- page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
102
- else
103
- page = Adyen::Admin.get(TEST % code)
104
- page.search(".data tr td")[2].content.to_i
105
- end
103
+ def uploaded_at
104
+ skin_data["uploaded_at"]
106
105
  end
107
106
 
108
- def test_url(options = {})
109
- page = Adyen::Admin.get(TEST % code)
110
- page = Adyen::Admin.client.submit(page.form.tap do |form|
111
- #:amount => 199, :currency => :shopper_locale, :country_code, :merchant_reference, :merchant_account, :system, :skip, :one_page
112
- end)
113
- Addressable::URI.parse(page.form.action).tap do |uri|
114
- uri.query_values = page.form.fields.inject({}) { |hash, node|
115
- hash[node.name] = node.value; hash
116
- }
117
- end
107
+ def version
108
+ skin_data["version"]
109
+ end
110
+
111
+ def version_live
112
+ skin_data["version_live"]
113
+ end
114
+
115
+ def version_test
116
+ skin_data["version_test"]
118
117
  end
119
118
 
120
119
  ##########################################
121
120
 
121
+ def update
122
+ @skin_data = {
123
+ :name => name,
124
+ :code => code,
125
+ :uploaded_at => Time.now,
126
+ :version => remote_version,
127
+ :version_live => remote_version(:live),
128
+ :version_test => remote_version(:test),
129
+ }
130
+ File.open(skin_data_file, "w") do |file|
131
+ file.write @skin_data.to_yaml
132
+ end
133
+ end
134
+
122
135
  # http://stackoverflow.com/questions/4360043/using-wwwmechanize-to-download-a-file-to-disk-without-loading-it-all-in-memory
123
136
  # Adyen::Admin.client.pluggable_parser.default = Mechanize::FileSaver
124
137
  def download
@@ -195,6 +208,7 @@ module Adyen
195
208
  end)
196
209
  form = page.form
197
210
  page = form.submit(page.form.button_with(:name => 'submit'))
211
+ update
198
212
  end
199
213
 
200
214
  def publish
@@ -205,6 +219,18 @@ module Adyen
205
219
 
206
220
  #################################
207
221
 
222
+ def test_url(options = {})
223
+ page = Adyen::Admin.get(TEST % code)
224
+ page = Adyen::Admin.client.submit(page.form.tap do |form|
225
+ #:amount => 199, :currency => :shopper_locale, :country_code, :merchant_reference, :merchant_account, :system, :skip, :one_page
226
+ end)
227
+ Addressable::URI.parse(page.form.action).tap do |uri|
228
+ uri.query_values = page.form.fields.inject({}) { |hash, node|
229
+ hash[node.name] = node.value; hash
230
+ }
231
+ end
232
+ end
233
+
208
234
  def to_s
209
235
  self.code
210
236
  end
@@ -222,12 +248,36 @@ module Adyen
222
248
  @name = n
223
249
  end
224
250
 
251
+ def skin_data_file
252
+ File.join(path, 'skin.yml')
253
+ end
254
+
225
255
  def self.is_skin_path?(path)
226
- %w(skin.html.erb inc css js).each do |sub_path|
256
+ %w(skin.html.erb skin.yml inc css js).each do |sub_path|
227
257
  return true if File.exists?(File.join(path.to_s, sub_path))
228
258
  end
229
259
  false
230
260
  end
261
+
262
+ ##################################
263
+
264
+ def remote_version(scope = nil)
265
+ case scope
266
+ when :test
267
+ @version_local ||= begin
268
+ page = Adyen::Admin.get(VERSION_TEST % code)
269
+ page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
270
+ end
271
+ when :live
272
+ page = Adyen::Admin.get(VERSION_LIVE % code)
273
+ page.search("body p").first.content.scan(/Version:(\d+)/).flatten.first.to_i
274
+ else
275
+ page = Adyen::Admin.get(TEST % code)
276
+ page.search(".data tr td")[2].content.to_i
277
+ end
278
+ rescue
279
+ nil
280
+ end
231
281
  end
232
282
  end
233
283
  end
@@ -118,6 +118,74 @@ module Adyen::Admin
118
118
  Skin.new(:path => path).name.should == "example-test"
119
119
  end
120
120
  end
121
+
122
+ context "with skin data file" do
123
+ let(:path) { "#{skin_fixtures}/DV3tf95f" }
124
+ let(:skin) { Skin.new(:path => path) }
125
+
126
+ it "sets name" do
127
+ skin.name.should == "from-file"
128
+ end
129
+
130
+ it "sets code" do
131
+ skin.code.should == "customCode"
132
+ end
133
+
134
+ it "sets version" do
135
+ skin.version.should == 12
136
+ end
137
+
138
+ it "sets version_test" do
139
+ skin.version_test.should == 3
140
+ end
141
+
142
+ it "sets version_live" do
143
+ skin.version_live.should == 2
144
+ end
145
+ end
146
+ end
147
+
148
+ describe "#update" do
149
+ let(:path) { "#{skin_fixtures}/example-7hFAQnmt" }
150
+
151
+ before do
152
+ skin.path = path
153
+ end
154
+
155
+ after do
156
+ `rm -f #{path}/skin.yml`
157
+ end
158
+
159
+ it "create skin.yml file" do
160
+ expect do
161
+ skin.update
162
+ end.to change { File.exists?("#{path}/skin.yml") }
163
+ end
164
+
165
+ context "local skin" do
166
+ it "returns version" do
167
+ skin.version.should be_nil
168
+ end
169
+
170
+ it "returns version" do
171
+ skin.version_live.should be_nil
172
+ end
173
+
174
+ it "returns version" do
175
+ skin.version_test.should be_nil
176
+ end
177
+ end
178
+
179
+ context "remote fails" do
180
+ before do
181
+ Adyen::Admin.stub(:get).and_raise(StandardError)
182
+ end
183
+
184
+ it "returns version" do
185
+ skin.update
186
+ skin.version.should be_nil
187
+ end
188
+ end
121
189
  end
122
190
 
123
191
  describe "#download" do
@@ -193,59 +261,70 @@ module Adyen::Admin
193
261
 
194
262
  describe "#compile" do
195
263
  let(:skin_code) { "DV3tf95f" }
196
- let(:skin) { Skin.new(:path => "#{skin_fixtures}/#{skin_code}") }
264
+ let(:path) { "#{skin_fixtures}/#{skin_code}" }
265
+ let(:skin) { Skin.new(:path => path) }
197
266
  let(:zip_filename) { skin.compile }
198
267
 
199
268
  def zip_contains(file)
200
269
  Zip::ZipFile.open(zip_filename) do |zipfile|
201
- return true if zipfile.find_entry(File.join(skin_code, file))
270
+ return true if zipfile.find_entry(File.join(skin.code, file))
202
271
  end
203
272
  false
204
273
  end
205
274
 
206
275
  after do
207
- `rm -f #{skin_code}.zip`
276
+ `rm -f #{skin.code}.zip`
208
277
  end
209
278
 
210
- context "without base" do
279
+ context "no skin.yml" do
211
280
  before do
212
- `mv #{skin_fixtures}/base #{skin_fixtures}/base2`
281
+ `mv #{path}/skin.yml #{path}/skin2.yml`
213
282
  end
214
283
 
215
284
  after do
216
- `mv #{skin_fixtures}/base2 #{skin_fixtures}/base`
285
+ `mv #{path}/skin2.yml #{path}/skin.yml`
286
+ end
287
+
288
+ context "without base" do
289
+ before do
290
+ `mv #{skin_fixtures}/base #{skin_fixtures}/base2`
291
+ end
292
+
293
+ after do
294
+ `mv #{skin_fixtures}/base2 #{skin_fixtures}/base`
295
+ end
296
+
297
+ it "includes screen file" do
298
+ zip_contains("css/screen.css").should be_true
299
+ end
300
+
301
+ it "excludes print files" do
302
+ zip_contains("css/print.css").should_not be_true
303
+ end
217
304
  end
218
305
 
219
306
  it "includes screen file" do
220
307
  zip_contains("css/screen.css").should be_true
221
308
  end
222
309
 
223
- it "excludes print files" do
224
- zip_contains("css/print.css").should_not be_true
310
+ it "includes print file" do
311
+ zip_contains("css/print.css").should be_true
225
312
  end
226
- end
227
-
228
- it "includes screen file" do
229
- zip_contains("css/screen.css").should be_true
230
- end
231
313
 
232
- it "includes print file" do
233
- zip_contains("css/print.css").should be_true
234
- end
235
-
236
- it "excludes meta file" do
237
- zip_contains("metadata.yml").should_not be_true
238
- end
314
+ it "excludes meta file" do
315
+ zip_contains("skin2.yml").should_not be_true
316
+ end
239
317
 
240
- it "excludes skin file" do
241
- zip_contains("skin.html.erb").should_not be_true
318
+ it "excludes skin file" do
319
+ zip_contains("skin.html.erb").should_not be_true
320
+ end
242
321
  end
243
322
 
244
323
  context "no exlusion" do
245
324
  let(:zip_filename) { skin.compile(nil) }
246
325
 
247
326
  it "excludes meta file" do
248
- zip_contains("metadata.yml").should be_true
327
+ zip_contains("skin.yml").should be_true
249
328
  end
250
329
 
251
330
  it "excludes skin file" do
@@ -255,34 +334,46 @@ module Adyen::Admin
255
334
  end
256
335
 
257
336
  describe "#upload" do
337
+ let(:path) { "#{skin_fixtures}/example-7hFAQnmt" }
338
+
258
339
  after do
259
340
  `rm -f #{skin_code}.zip`
341
+ `rm -f #{path}/skin.yml`
260
342
  end
261
343
 
262
344
  context "valid set" do
263
- it "increases version" do
264
- skin.path = "#{skin_fixtures}/example-7hFAQnmt"
345
+ before do
346
+ skin.path = path
347
+ end
265
348
 
349
+ it "increases version" do
266
350
  expect do
267
351
  skin.upload
268
- end.to change { skin.version }.by(1)
352
+ end.to change { skin.send(:remote_version) }.by(1)
353
+ end
354
+
355
+ it "updates skin data" do
356
+ skin.should_receive(:update)
357
+
358
+ skin.upload
269
359
  end
270
360
  end
271
361
  end
272
362
 
273
- describe "#version" do
363
+ describe "#remote_version" do
274
364
  let(:skin) { Skin.new(:code => "Kx9axnRf", :name => "demo") }
365
+ let(:version) { 15 }
275
366
 
276
367
  it "returns uploaded value" do
277
- skin.version.should == 14
368
+ skin.send(:remote_version).should == version
278
369
  end
279
370
 
280
371
  it "returns test value" do
281
- skin.version(:test).should == 14
372
+ skin.send(:remote_version, :test).should == version
282
373
  end
283
374
 
284
375
  it "returns live value" do
285
- skin.version(:live).should == 0
376
+ skin.send(:remote_version, :live).should == 0
286
377
  end
287
378
  end
288
379
 
@@ -29,13 +29,13 @@ http_interactions:
29
29
  message: Moved Temporarily
30
30
  headers:
31
31
  Date:
32
- - Thu, 12 Apr 2012 15:59:55 GMT
32
+ - Thu, 19 Apr 2012 17:35:02 GMT
33
33
  Server:
34
34
  - Apache
35
35
  Set-Cookie:
36
- - JSESSIONID=84F73E1B4FA287BC6827EC39280ADAF8.test5e; Path=/ca/; Secure; HttpOnly
36
+ - JSESSIONID=E9721CF1DF5254FC2788EDBE60AD5D5C.test5e; Path=/ca/; Secure; HttpOnly
37
37
  Location:
38
- - https://ca-test.adyen.com/ca/ca/login.shtml;jsessionid=84F73E1B4FA287BC6827EC39280ADAF8.test5e
38
+ - https://ca-test.adyen.com/ca/ca/login.shtml;jsessionid=E9721CF1DF5254FC2788EDBE60AD5D5C.test5e
39
39
  Content-Length:
40
40
  - "0"
41
41
  Keep-Alive:
@@ -48,10 +48,10 @@ http_interactions:
48
48
  encoding: US-ASCII
49
49
  string: ""
50
50
  http_version:
51
- recorded_at: Thu, 12 Apr 2012 15:59:55 GMT
51
+ recorded_at: Thu, 19 Apr 2012 17:35:02 GMT
52
52
  - request:
53
53
  method: get
54
- uri: https://ca-test.adyen.com/ca/ca/login.shtml;jsessionid=84F73E1B4FA287BC6827EC39280ADAF8.test5e
54
+ uri: https://ca-test.adyen.com/ca/ca/login.shtml;jsessionid=E9721CF1DF5254FC2788EDBE60AD5D5C.test5e
55
55
  body:
56
56
  encoding: US-ASCII
57
57
  string: ""
@@ -67,7 +67,7 @@ http_interactions:
67
67
  Accept-Language:
68
68
  - en-us,en;q=0.5
69
69
  Cookie:
70
- - JSESSIONID=84F73E1B4FA287BC6827EC39280ADAF8.test5e
70
+ - JSESSIONID=E9721CF1DF5254FC2788EDBE60AD5D5C.test5e
71
71
  Host:
72
72
  - ca-test.adyen.com
73
73
  Connection:
@@ -80,7 +80,7 @@ http_interactions:
80
80
  message: OK
81
81
  headers:
82
82
  Date:
83
- - Thu, 12 Apr 2012 15:59:56 GMT
83
+ - Thu, 19 Apr 2012 17:35:02 GMT
84
84
  Server:
85
85
  - Apache
86
86
  Cache-Control:
@@ -242,7 +242,7 @@ http_interactions:
242
242
 
243
243
  <tr>
244
244
  <td colspan="2"><br />
245
- <input type="hidden" name="j_formHash" value="994jn5V6LNqMGPZwB9TZTQnwIKRgsw=" />
245
+ <input type="hidden" name="j_formHash" value="964GlK7lxwq1iYLRIK2WHfvux9CXBM=" />
246
246
  <input type="submit" class="button" value="Submit" /></td>
247
247
  </tr>
248
248
  </table>
@@ -267,5 +267,5 @@ http_interactions:
267
267
  </html>
268
268
 
269
269
  http_version:
270
- recorded_at: Thu, 12 Apr 2012 15:59:55 GMT
270
+ recorded_at: Thu, 19 Apr 2012 17:35:02 GMT
271
271
  recorded_with: VCR 2.0.1