adyen-skinbuilder 0.2.6 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/.gitignore +3 -4
  2. data/.travis.yml +5 -0
  3. data/CHANGELOG.md +22 -0
  4. data/Gemfile.lock +51 -7
  5. data/LICENSE +3 -3
  6. data/README.markdown +83 -24
  7. data/Rakefile +6 -0
  8. data/adyen-skinbuilder.gemspec +12 -11
  9. data/bin/adyen-skinbuilder +28 -3
  10. data/lib/adyen-skinbuilder.rb +1 -4
  11. data/lib/adyen-skinbuilder/helper/adyen.rb +29 -0
  12. data/lib/adyen-skinbuilder/helper/render.rb +32 -0
  13. data/lib/adyen-skinbuilder/server.rb +112 -58
  14. data/lib/adyen-skinbuilder/server/views/_adyen_form.html.erb +37 -0
  15. data/{adyen/main_content.html → lib/adyen-skinbuilder/server/views/_adyen_payment_fields.html.erb} +534 -530
  16. data/lib/adyen-skinbuilder/server/views/css/reset.css +306 -0
  17. data/lib/adyen-skinbuilder/server/views/img/icons/error.png +0 -0
  18. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK1.png +0 -0
  19. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK10.png +0 -0
  20. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK2.png +0 -0
  21. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK3.png +0 -0
  22. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK4.png +0 -0
  23. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK5.png +0 -0
  24. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK6.png +0 -0
  25. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK7.png +0 -0
  26. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK8.png +0 -0
  27. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANK9.png +0 -0
  28. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANKCANCELLED.png +0 -0
  29. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANKPENDING.png +0 -0
  30. data/lib/adyen-skinbuilder/server/views/img/pm/TESTBANKREFUSED.png +0 -0
  31. data/lib/adyen-skinbuilder/server/views/img/pm/amex_small.png +0 -0
  32. data/lib/adyen-skinbuilder/server/views/img/pm/card.png +0 -0
  33. data/lib/adyen-skinbuilder/server/views/img/pm/ideal.png +0 -0
  34. data/lib/adyen-skinbuilder/server/views/img/pm/mc_small.png +0 -0
  35. data/lib/adyen-skinbuilder/server/views/img/pm/unknown_small.png +0 -0
  36. data/lib/adyen-skinbuilder/server/views/img/pm/vias_small.png +0 -0
  37. data/lib/adyen-skinbuilder/server/views/img/pm/visa.png +0 -0
  38. data/lib/adyen-skinbuilder/server/views/img/pm/visa_small.png +0 -0
  39. data/lib/adyen-skinbuilder/server/views/index.html.erb +118 -0
  40. data/lib/adyen-skinbuilder/server/views/js/default.js +385 -0
  41. data/lib/adyen-skinbuilder/server/views/layout.html.erb +33 -0
  42. data/lib/adyen-skinbuilder/server/views/skeleton.html +56 -0
  43. data/lib/adyen-skinbuilder/server/views/skin.html.erb +18 -0
  44. data/lib/adyen-skinbuilder/version.rb +1 -1
  45. data/lib/hash.rb +15 -0
  46. data/spec/fixtures/example.zip +0 -0
  47. data/spec/fixtures/skins/DV3tf95f/inc/order_data.txt +1 -0
  48. data/spec/fixtures/skins/JH0815/css/screen.css +262 -0
  49. data/spec/fixtures/skins/JH0815/skin.html.erb +13 -0
  50. data/spec/lib/adyen-skinbuilder/server_spec.rb +166 -38
  51. data/spec/spec_helper.rb +2 -2
  52. metadata +109 -31
  53. data/adyen/skeleton.html +0 -70
  54. data/lib/adyen-skinbuilder/launcher.rb +0 -40
  55. data/lib/adyen-skinbuilder/railtie.rb +0 -9
  56. data/lib/adyen-skinbuilder/tasks/skin.rake +0 -65
data/.gitignore CHANGED
@@ -1,4 +1,3 @@
1
- .DS_Store
2
- pkg/*
3
- *.gem
4
- .bundle
1
+ pkg
2
+ .rvmrc
3
+ .adyenrc
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
data/CHANGELOG.md ADDED
@@ -0,0 +1,22 @@
1
+ # Change Log
2
+
3
+ ## Far Future??
4
+ * multiple user, assets upload, hosted system
5
+
6
+ ## Todo
7
+ * beautify index page, add 'new', 'edit', 'download'
8
+ * add locale support
9
+ * add more functions to binary to get a proper CLI tool (or move to adyen-admin??)
10
+ * more helper e.g. cutom fields
11
+ * auto re-login when session timed out
12
+
13
+ ## v0.3.0
14
+ * read adyen-admin credentials from cfg file
15
+ * show local / remote skins, option to sync
16
+ * add skin upload -> 'adyen-admin'
17
+ * add skin export
18
+ * gemify
19
+ * add custom skin path
20
+ * add order_data
21
+ * allow partials
22
+ * 100% function compatiable with version 0.2.0 (check raketasks)
data/Gemfile.lock CHANGED
@@ -1,33 +1,76 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- adyen-skinbuilder (0.2.5)
5
- rack (>= 1.3)
6
- slop (>= 1.6.0)
4
+ adyen-skinbuilder (0.3.0.rc2)
5
+ adyen-admin
6
+ sinatra
7
+ sinatra-contrib
8
+ vegas
7
9
 
8
10
  GEM
9
11
  remote: http://rubygems.org/
10
12
  specs:
13
+ adyen-admin (0.0.7)
14
+ mechanize
15
+ rubyzip
16
+ backports (2.5.1)
11
17
  diff-lcs (1.1.3)
18
+ domain_name (0.5.3)
19
+ unf (~> 0.0.3)
20
+ eventmachine (0.12.10)
12
21
  ffi (1.0.11)
13
22
  guard (1.0.1)
14
23
  ffi (>= 0.5.0)
15
24
  thor (~> 0.14.6)
16
- guard-rspec (0.6.0)
25
+ guard-rspec (0.7.0)
17
26
  guard (>= 0.10.0)
27
+ mechanize (2.3)
28
+ domain_name (~> 0.5, >= 0.5.1)
29
+ mime-types (~> 1.17, >= 1.17.2)
30
+ net-http-digest_auth (~> 1.1, >= 1.1.1)
31
+ net-http-persistent (~> 2.5, >= 2.5.2)
32
+ nokogiri (~> 1.4)
33
+ ntlm-http (~> 0.1, >= 0.1.1)
34
+ webrobots (~> 0.0, >= 0.0.9)
35
+ mime-types (1.18)
36
+ net-http-digest_auth (1.2)
37
+ net-http-persistent (2.6)
38
+ nokogiri (1.5.2)
39
+ ntlm-http (0.1.1)
18
40
  rack (1.4.1)
41
+ rack-protection (1.2.0)
42
+ rack
19
43
  rack-test (0.6.1)
20
44
  rack (>= 1.0)
45
+ rake (0.9.2.2)
21
46
  rspec (2.9.0)
22
47
  rspec-core (~> 2.9.0)
23
48
  rspec-expectations (~> 2.9.0)
24
49
  rspec-mocks (~> 2.9.0)
25
50
  rspec-core (2.9.0)
26
- rspec-expectations (2.9.0)
51
+ rspec-expectations (2.9.1)
27
52
  diff-lcs (~> 1.1.3)
28
53
  rspec-mocks (2.9.0)
29
- slop (3.0.4)
54
+ rubyzip (0.9.7)
55
+ sinatra (1.3.2)
56
+ rack (~> 1.3, >= 1.3.6)
57
+ rack-protection (~> 1.2)
58
+ tilt (~> 1.3, >= 1.3.3)
59
+ sinatra-contrib (1.3.1)
60
+ backports (>= 2.0)
61
+ eventmachine
62
+ rack-protection
63
+ rack-test
64
+ sinatra (~> 1.3.0)
65
+ tilt (~> 1.3)
30
66
  thor (0.14.6)
67
+ tilt (1.3.3)
68
+ unf (0.0.5)
69
+ unf_ext
70
+ unf_ext (0.0.4)
71
+ vegas (0.1.11)
72
+ rack (>= 1.0.0)
73
+ webrobots (0.0.13)
31
74
 
32
75
  PLATFORMS
33
76
  ruby
@@ -36,4 +79,5 @@ DEPENDENCIES
36
79
  adyen-skinbuilder!
37
80
  guard-rspec
38
81
  rack-test
39
- rspec (>= 2.8)
82
+ rake
83
+ rspec
data/LICENSE CHANGED
@@ -1,5 +1,5 @@
1
- Copyright (c) 2011
2
- Priit Haamer
1
+ Copyright (c) 2012
2
+ Priit Haamer, Tobias Bielohlawek
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining
5
5
  a copy of this software and associated documentation files (the
@@ -18,4 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
18
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
19
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
20
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown CHANGED
@@ -1,33 +1,70 @@
1
- Simple Rack server to make Adyen skin authoring easier. Also includes rake tasks to bundle skin directories into deployable bundles.
1
+ # Adyen Skinbuilder [![Build Status](https://secure.travis-ci.org/priithaamer/adyen-skinbuilder.png?branch=master)](http://travis-ci.org/priithaamer/adyen-skinbuilder)
2
+
3
+ Simple Sinatra server to make Adyen skin authoring easier. It performs the template rendering on your local machine, which is very much similar to the end result generated in Adyen. Given adyen admin credentials provided, it allows to upload and test skins with just one click.
2
4
 
3
5
  ## Install
4
6
 
5
7
  sudo gem install adyen-skinbuilder
6
8
 
9
+
7
10
  ## Usage
8
11
 
9
- Make sure you have directory with basic Adyen skin structure, that looks something like this:
12
+ Adyen Skinbuilder provides a Index page for full overview on all remote and local skins and options to up-/download etc. To load the page, start the server by providing the local path to your skin directory:
10
13
 
11
- +- ~/Documents
12
- +- DV3tf95f
13
- +- css
14
- +- img
15
- +- inc
16
- +- cfooter.txt
17
- +- cheader.txt
18
- +- js
14
+ $ adyen-skinbuilder ~/Documents
15
+
16
+ Alternatively provide the full path to a skin which opens the browser and shows the rendered result directly.
17
+
18
+ $ adyen-skinbuilder ~/Documents/DV3tf95f
19
+
20
+
21
+ See `adyen-skinbuilder --help` for more options to run server on different port or with logging etc. Run `adyen-skinbuilder -k` to shutdown.
22
+
23
+
24
+ ## Skin Strucutre
25
+
26
+ Usually Adyen requires to split up the skin page in up to four different files. But no worries, Skinbuilder does that for you. Yes, you read right: you just put all the html content in one file called `skin.html.erb` - Skinbuilder will auto split, zip and even upload the skin. Within the skin file you can make use of handy helper methods to define the adyen form and payment fields or even to render other partials.
27
+
28
+ A most minimal file would look like:
29
+
30
+ ```html
31
+ <h1> exmaple skin</h1>
32
+
33
+ <% adyen_form_tag do %>
34
+ <h3>header</h3>
35
+ <%= adyen_payment_fields %>
36
+ <% end %>
37
+
38
+ ```
19
39
 
20
- To view something that is very much similar to the end result generated in Adyen, fire up adyen-skinbuilder rack server, that does the template rendering on your local machine:
40
+ ### Code Sharing
21
41
 
22
- $ adyen-skinbuilder ~/Documents/DV3tf95f
42
+ Witha large number of skins it makes sense to reuse code + styling among several skins. This gem supports several ways how to share code in between:
23
43
 
24
- And go to http://localhost:8888 to see the generated page.
44
+ #### Shared Partials
25
45
 
26
- See `adyen-skinbuilder --help` for more options to run server on different port or with logging etc.
46
+ Similar as in rails, Skinbuilder allows to render other files inline, e.g.:
27
47
 
28
- ### Base directory
29
48
 
30
- If you have multiple skin directories, this gem supports base directory that can provide files that will be included in all skins without the need to duplicate them. Let's consider this example:
49
+ ```html
50
+ <h1>Exmaple Skin with partial</h1>
51
+
52
+ <%= render_partial 'header.html' %>
53
+
54
+ <% adyen_form_tag do %>
55
+ <h3>header</h3>
56
+ <%= adyen_payment_fields %>
57
+ <% end %>
58
+
59
+ ```
60
+
61
+ This will load and render `header.html.erb` for your skin root on top of the form.
62
+
63
+ #### Base directory
64
+
65
+ _Deprecated since Version 0.3_
66
+
67
+ Another way is to create a `base` directory to provide fallback files that will be included in all skins without the need to duplicate them. Let's consider this example:
31
68
 
32
69
  +- ~/Documents
33
70
  +- base
@@ -40,21 +77,26 @@ If you have multiple skin directories, this gem supports base directory that can
40
77
 
41
78
  File in specific skin directory takes precedence when building skin zip file. In this example, `cheader.txt` will be bundled from skin directory `DV3tf95f/inc` but `cfooter.txt` comes from `base/inc`.
42
79
 
43
- ## Order Data
80
+ ### Order Data
44
81
 
45
82
  Adyen let's you post order data that will be shown in shopping cart view as part of html. You can put `order_data.txt` file into `inc/` folder in the skin directory. This file will be included automatically in the same place, where adyen would put it.
46
83
 
47
- ## Building skin for upload
84
+ ## Interacting with remote Adyen Admin
48
85
 
49
- There is a convenient Rake task that will create zip file of the skin file. It can be used either by providing directories as rake task arguments:
86
+ To interact with the remote Adyen Admin interface, Skinbuilder makes use of the [adyen-admin](https://github.com/rngtng/adyen-admin) gem. This
87
+ allows to download/upload skins easily. To enable remote admin, provide the Adyen Admin credentials within the `.adyenrc` file, either in you home- or execution root directory. !!We encourage to set up a dedicated useraccount with low rights for that!!
50
88
 
51
- rake adyen:skin:build['/path/to/skin/directory','/path/to/target']
89
+ An example `.adyenrc` file:
52
90
 
53
- Also, providing environment variables will work:
91
+ scope: test
92
+ accountname: <your account>
93
+ username: <your username>
94
+ password: <your password>
54
95
 
55
- rake adyen:skin:build SKIN=/path/to/skin/directory TARGET=/path/to/target
56
96
 
57
- ### More meaningful file naming
97
+ Navigate to the index page `/` and hit `Sync once and you'll find the option to upload the skins. In anycase you always can download the zipped skinfile via the `compile` link. *By now, only adyen test is provided*
98
+
99
+ ## More meaningful file naming
58
100
 
59
101
  Adyen requires the name of root directory within the zip file to exactly match the skincode, e.g. `DV3tf95f`.
60
102
  These skincodes are not very meaningful and hard to remember.
@@ -66,6 +108,23 @@ So in this example, the zip file would be called `BrandX-shop-DV3tf95f.zip`, and
66
108
 
67
109
  If the skin directory does not match this pattern, the zip and root directory within the zip will both be named after the original skin directory name.
68
110
 
69
- ## Contributors
111
+ ## Contributors
70
112
 
71
113
  [See the list of contributiors](https://github.com/priithaamer/adyen-skinbuilder/network/members)
114
+
115
+
116
+ ## Contributing
117
+
118
+ We'll check out your contribution if you:
119
+
120
+ - Provide a comprehensive suite of tests for your fork.
121
+ - Have a clear and documented rationale for your changes.
122
+ - Package these up in a pull request.
123
+
124
+ We'll do our best to help you out with any contribution issues you may have.
125
+
126
+
127
+ ## License
128
+
129
+ The license is included as LICENSE in this directory.
130
+
data/Rakefile CHANGED
@@ -1,2 +1,8 @@
1
1
  require 'bundler'
2
+ require 'rspec/core/rake_task'
3
+
2
4
  Bundler::GemHelper.install_tasks
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task :default => :spec
@@ -5,21 +5,22 @@ Gem::Specification.new do |s|
5
5
  s.name = 'adyen-skinbuilder'
6
6
  s.version = Adyen::Skinbuilder::VERSION
7
7
  s.platform = Gem::Platform::RUBY
8
- s.authors = ['Priit Haamer']
9
- s.email = ['priit@edicy.com']
8
+ s.authors = ['Priit Haamer', 'Tobias Bielohlawek']
9
+ s.email = ['priit@edicy.com', 'tobi@soundcloud.com']
10
10
  s.homepage = 'http://rubygems.org/gems/adyen-skinbuilder'
11
- s.summary = %q{Simple Rack server to make coding Adyen skins easier}
12
- s.description = %q{Provides helpful rake tasks and command line tools to run rack server and bundle adyen skin files}
11
+ s.summary = %q{Simple Sinatra server to make coding Adyen skins easier}
12
+ s.description = %q{Provides helpful command line tools to run sinatra server and bundle adyen skin files}
13
13
 
14
14
  s.files = `git ls-files`.split("\n")
15
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
16
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
17
  s.require_paths = ['lib']
18
-
19
- s.add_dependency 'rack', '>= 1.3'
20
- s.add_dependency 'slop', '>= 1.6.0'
21
-
22
- s.add_development_dependency 'rspec', '>= 2.8'
23
- s.add_development_dependency 'guard-rspec'
24
- s.add_development_dependency 'rack-test'
18
+
19
+ %w(sinatra sinatra-contrib vegas adyen-admin).each do |gem|
20
+ s.add_runtime_dependency *gem.split(' ')
21
+ end
22
+
23
+ %w(rake rspec guard-rspec rack-test).each do |gem|
24
+ s.add_development_dependency *gem.split(' ')
25
+ end
25
26
  end
@@ -1,6 +1,31 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'rubygems'
4
- require 'adyen-skinbuilder'
3
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/adyen-skinbuilder/server")
4
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/hash")
5
+ require 'vegas'
5
6
 
6
- Adyen::SkinBuilder::Launcher.ignition
7
+ opts = {}
8
+
9
+
10
+ if (skins = ARGV.last) && File.directory?(skins)
11
+ opts[:skins_directory] = skins
12
+
13
+ begin
14
+ skin = Adyen::Admin::Skin.new(:path => skins) #auto launch skin
15
+ opts[:launch_path] = "/#{skin.code}"
16
+ rescue ArgumentError
17
+ end
18
+ end
19
+
20
+ adyen_rc_file = ".adyenrc"
21
+
22
+ if !File.exists?(adyen_rc_file)
23
+ adyen_rc_file = File.expand_path("~/#{adyen_rc_file}")
24
+ end
25
+
26
+ begin
27
+ opts[:adyen_admin_cfg] = YAML::load(::File.open(adyen_rc_file)).symbolize_keys!
28
+ rescue
29
+ end
30
+
31
+ Vegas::Runner.new(Adyen::SkinBuilder::Server, 'adyen-skinbuilder', opts)
@@ -1,8 +1,5 @@
1
- require 'adyen-skinbuilder/server'
2
1
  require 'adyen-skinbuilder/version'
3
- require 'adyen-skinbuilder/launcher'
4
-
5
- require 'adyen-skinbuilder/railtie' if defined?(::Rails) && ::Rails::VERSION::MAJOR >= 3
2
+ #require 'adyen-skinbuilder/server'
6
3
 
7
4
  # TODO: skin bundle generator
8
5
  # TODO: Init task to build adyen skins directory structure
@@ -0,0 +1,29 @@
1
+ module Adyen
2
+ module SkinBuilder
3
+ module Helper
4
+ module Adyen
5
+
6
+ # start the adyen form, if no block padded payment fields are auto included
7
+ def adyen_form_tag(&block)
8
+ buffer << render_partial(:adyen_form, :views => settings.views, :block => block)
9
+ end
10
+
11
+ # render the payment fields
12
+ def adyen_payment_fields(&block)
13
+ if block_given?
14
+ capture &block
15
+ else
16
+ render_partial :adyen_payment_fields, :views => settings.views
17
+ end
18
+ end
19
+
20
+ # to be done
21
+ # def adyen_custom_field_tag
22
+ # end
23
+ #
24
+ # def adyen_custom_hidden_tag
25
+ # end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,32 @@
1
+ module Adyen
2
+ module SkinBuilder
3
+ module Helper
4
+ module Render
5
+
6
+ # the output buffer
7
+ def buffer
8
+ @_out_buf || @_buf
9
+ end
10
+
11
+ # capture rednered output to a string
12
+ def capture
13
+ pos = buffer.size
14
+ yield
15
+ buffer.slice!(pos..buffer.size)
16
+ end
17
+
18
+ # renders a file from the inc folder of the skin
19
+ def render_file(file)
20
+ file = skin_path @skin_code, "/inc/#{file}.txt"
21
+ File.read(file) if File.exists?(file)
22
+ end
23
+
24
+ # render an erb partial inline
25
+ def render_partial(file, locals = {})
26
+ views = locals.delete(:views) || skin_path(@skin_code)
27
+ erb "_#{file}.html".to_sym, :layout => false, :views => views, :locals => locals
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,77 +1,131 @@
1
- require 'rack'
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'sinatra/base'
5
+ require 'adyen-skinbuilder/helper/adyen'
6
+ require 'adyen-skinbuilder/helper/render'
7
+
8
+ require 'adyen-admin'
2
9
 
3
10
  module Adyen
4
11
  module SkinBuilder
5
- class SkeletonAdapter
6
-
7
- def initialize(skins_directory)
8
- @skins_directory = File.dirname(skins_directory)
9
- @order_data_file =
10
- @skin = File.basename(skins_directory)
12
+ class Server < Sinatra::Base
13
+ dir = File.dirname(File.expand_path(__FILE__))
14
+
15
+ set :views, "#{dir}/server/views"
16
+
17
+ # method will be overwritten by _vegas_ if skin directory given
18
+ def self.skins_directory
19
+ File.expand_path(".")
11
20
  end
12
-
13
- def call(env)
14
- body = File.read(File.join(File.dirname(__FILE__), '../../adyen/skeleton.html'))
15
- body = body.gsub(/\$skinCode/, @skin)
16
- %w(cheader pmheader pmfooter customfields cfooter).each do |inc|
17
- body = body.gsub(%r{\<!-- ### inc\/#{inc}_\[locale\].txt or inc\/#{inc}.txt \(fallback\) ### --\>}, get_inc(inc))
21
+
22
+ def self.adyen_admin_cfg
23
+ nil
24
+ end
25
+
26
+ def skins_directory
27
+ @@skins_directory ||= begin
28
+ Adyen::Admin::Skin.new(:path => settings.skins_directory)
29
+ File.dirname(settings.skins_directory)
30
+ rescue ArgumentError
31
+ settings.skins_directory
18
32
  end
19
- body = body.gsub(%r{\<!-- Adyen Main Content --\>}, main_content)
20
-
21
- [200, {'Content-Type' => 'text/html'}, [body]]
22
33
  end
23
-
24
- private
25
-
26
- def main_content
27
- File.read(File.join(File.dirname(__FILE__), '../../adyen/main_content.html')).gsub(%r{\<!-- Adyen Order Data --\>}, get_inc('order_data'))
34
+
35
+ def skin_path(*path)
36
+ File.join(skins_directory, *path)
28
37
  end
29
-
30
- # TODO: add locale support so files like inc/cheader_[locale].txt will be included correctly
31
- def get_inc(filename)
32
- if File.exists?(File.join(@skins_directory, @skin, 'inc', "#{filename}.txt"))
33
- File.read(File.join(@skins_directory, @skin, 'inc', "#{filename}.txt"))
34
- elsif File.exists?(File.join(@skins_directory, 'base', 'inc', "#{filename}.txt"))
35
- File.read(File.join(@skins_directory, 'base', 'inc', "#{filename}.txt"))
36
- else
37
- "<!-- == #{filename}.txt IS MISSING == -->"
38
+
39
+ def skin_file(skin_code)
40
+ skin_path(skin_code, "skin.html").tap do |file|
41
+ if !File.exists?("#{file}.erb")
42
+ file.replace File.join(settings.views, "skin.html")
43
+ end
38
44
  end
39
45
  end
40
- end
41
-
42
- class Redirector
43
- def call(env)
44
- [302, {"Location" => "https://test.adyen.com#{env["REQUEST_PATH"]}"}, self]
46
+
47
+ def store(output)
48
+ output.scan(/<!-- ### inc\/([a-z]+) -->(.+?)<!-- ### -->/m) do |name, content|
49
+ file = skin_path @skin_code, "/inc/#{name}.txt"
50
+ `mkdir -p #{File.dirname(file)}`
51
+ File.open(file, "w") do |f|
52
+ f.write content.strip
53
+ end
54
+ end
45
55
  end
46
- def each(&block); end
47
- end
48
-
49
- class Server
50
-
51
- class << self
52
56
 
53
- def run(config)
54
- Rack::Server.start(:app => self.app(config), :Port => config[:port], :AccessLog => [])
57
+ def adyen_login
58
+ if settings.adyen_admin_cfg && !Adyen::Admin.authenticated?
59
+ cfg = settings.adyen_admin_cfg
60
+ Adyen::Admin.login(cfg[:accountname], cfg[:username], cfg[:password])
55
61
  end
56
-
57
- def app(config = {})
58
- Rack::Builder.app do
59
- use Rack::CommonLogger if config[:log]
60
- use Rack::Head
61
-
62
- map("/sf/#{File.basename(config[:skins_directory])}") do
63
- run Rack::Cascade.new([
64
- Rack::File.new(config[:skins_directory]),
65
- Rack::File.new(File.join(File.dirname(config[:skins_directory]), 'base'))
66
- ])
62
+ end
63
+
64
+ helpers Helper::Render, Helper::Adyen
65
+
66
+ get '/sf/:skin_code/*' do |skin_code, path|
67
+ if (file = skin_path(skin_code, path)) && File.exists?(file)
68
+ send_file file
69
+ elsif (file = skin_path("base", path)) && File.exists?(file)
70
+ send_file file
71
+ end
72
+ end
73
+
74
+ get '/hpp/*' do |path|
75
+ send_file File.join(settings.views, path).tap { |file|
76
+ if !File.exists?(file)
77
+ `mkdir -p #{File.dirname(file)}`
78
+ `wget https://test.adyen.com/hpp/#{path} -O #{file}`
79
+ end
80
+ }
81
+ end
82
+
83
+ get '/favicon.ico' do
84
+ end
85
+
86
+ # skin page
87
+ get '/:skin_code' do |skin_code|
88
+ @skin_code = skin_code
89
+
90
+ erb(skin_file(@skin_code).to_sym, {
91
+ :views => '/',
92
+ :layout => File.join(settings.views, "layout.html").to_sym
93
+ }).tap do |output|
94
+ if @skin = Adyen::Admin::Skin.new(:path => skin_path(skin_code))
95
+ if params[:compile]
96
+ store(output)
97
+ send_file(@skin.compile) && return
98
+ elsif params[:upload]
99
+ store(output)
100
+ adyen_login
101
+ @skin.upload
67
102
  end
103
+ end
104
+ end
105
+ end
106
+
107
+ # cache remote skins
108
+ @@skin_cache = nil
68
109
 
69
- # Redirect requests for default assets to Adyen:
70
- map("/hpp") { run Adyen::SkinBuilder::Redirector.new }
71
-
72
- map('/') { run Adyen::SkinBuilder::SkeletonAdapter.new(config[:skins_directory]) }
110
+ # index page
111
+ get '/' do
112
+ Adyen::Admin::Skin.default_path = skin_path
113
+ if params[:sync]
114
+ Adyen::Admin::Skin.purge_cache
115
+ adyen_login
116
+ @@skin_cache = Adyen::Admin::Skin.all
117
+ end
118
+ if params[:download] && (@skin = Adyen::Admin::Skin.find(params[:download]))
119
+ @skin.download.tap do |zip_file|
120
+ @skin.decompile(zip_file)
121
+ `cp #{skin_file(@skin.code)}.erb #{@skin.path}`
122
+ `rm -f #{zip_file}`
73
123
  end
74
124
  end
125
+ @skins = @@skin_cache || Adyen::Admin::Skin.all_local
126
+ @adyen_admin_cfg = settings.adyen_admin_cfg
127
+
128
+ erb 'index.html'.to_sym, :layout => false
75
129
  end
76
130
  end
77
131
  end