locomotivecms_wagon 1.5.8 → 2.0.0.pre.alpha

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 (159) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/.rspec +0 -1
  4. data/Gemfile +17 -2
  5. data/README.md +2 -6
  6. data/Rakefile +3 -20
  7. data/lib/locomotive/wagon/cli.rb +34 -39
  8. data/lib/locomotive/wagon/commands/authenticate_command.rb +65 -0
  9. data/lib/locomotive/wagon/commands/concerns/api_concern.rb +57 -0
  10. data/lib/locomotive/wagon/commands/concerns/deploy_file_concern.rb +32 -0
  11. data/lib/locomotive/wagon/commands/concerns/instrumentation_concern.rb +16 -0
  12. data/lib/locomotive/wagon/commands/concerns/netrc_concern.rb +21 -0
  13. data/lib/locomotive/wagon/commands/concerns/steam_concern.rb +24 -0
  14. data/lib/locomotive/wagon/commands/generate_command.rb +29 -0
  15. data/lib/locomotive/wagon/commands/init_command.rb +19 -0
  16. data/lib/locomotive/wagon/commands/loggers/push_logger.rb +59 -0
  17. data/lib/locomotive/wagon/commands/push_command.rb +116 -0
  18. data/lib/locomotive/wagon/commands/push_sub_commands/push_base_command.rb +68 -0
  19. data/lib/locomotive/wagon/commands/push_sub_commands/push_content_assets_command.rb +54 -0
  20. data/lib/locomotive/wagon/commands/push_sub_commands/push_content_entries_command.rb +85 -0
  21. data/lib/locomotive/wagon/commands/push_sub_commands/push_content_types_command.rb +70 -0
  22. data/lib/locomotive/wagon/commands/push_sub_commands/push_pages_command.rb +71 -0
  23. data/lib/locomotive/wagon/commands/push_sub_commands/push_snippets_command.rb +23 -0
  24. data/lib/locomotive/wagon/commands/push_sub_commands/push_theme_assets_command.rb +70 -0
  25. data/lib/locomotive/wagon/commands/push_sub_commands/push_translations_command.rb +23 -0
  26. data/lib/locomotive/wagon/commands/serve_command.rb +131 -0
  27. data/lib/locomotive/wagon/decorators/concerns/persist_assets_concern.rb +20 -0
  28. data/lib/locomotive/wagon/decorators/concerns/to_hash_concern.rb +25 -0
  29. data/lib/locomotive/wagon/decorators/content_asset_decorator.rb +29 -0
  30. data/lib/locomotive/wagon/decorators/content_entry_decorator.rb +100 -0
  31. data/lib/locomotive/wagon/decorators/content_type_decorator.rb +78 -0
  32. data/lib/locomotive/wagon/decorators/content_type_field_decorator.rb +76 -0
  33. data/lib/locomotive/wagon/decorators/editable_element_decorator.rb +32 -0
  34. data/lib/locomotive/wagon/decorators/page_decorator.rb +81 -0
  35. data/lib/locomotive/wagon/decorators/site_decorator.rb +25 -0
  36. data/lib/locomotive/wagon/decorators/snippet_decorator.rb +29 -0
  37. data/lib/locomotive/wagon/decorators/theme_asset_decorator.rb +53 -0
  38. data/lib/locomotive/wagon/decorators/translation_decorator.rb +19 -0
  39. data/lib/locomotive/wagon/exceptions.rb +3 -55
  40. data/lib/locomotive/wagon/generators/site/unzip.rb +2 -2
  41. data/lib/locomotive/wagon/tools/deployment_connection.rb +120 -0
  42. data/lib/locomotive/wagon/tools/hosting_api.rb +117 -0
  43. data/lib/locomotive/wagon/tools/listen.rb +51 -0
  44. data/lib/locomotive/wagon/{misc → tools}/livereload.rb +5 -3
  45. data/lib/locomotive/wagon/{misc → tools}/tcp_port.rb +0 -0
  46. data/lib/locomotive/wagon/{misc → tools}/thor.rb +0 -0
  47. data/lib/locomotive/wagon/version.rb +1 -1
  48. data/lib/locomotive/wagon.rb +34 -162
  49. data/locomotivecms_wagon.gemspec +11 -24
  50. data/spec/fixtures/cassettes/authenticate.yml +425 -0
  51. data/spec/fixtures/cassettes/push.yml +34737 -0
  52. data/spec/fixtures/default/app/views/pages/events.liquid.haml +2 -1
  53. data/spec/fixtures/default/app/views/pages/index.liquid.haml +3 -2
  54. data/spec/fixtures/default/app/views/pages/layouts/simple.liquid.haml +1 -1
  55. data/spec/fixtures/default/app/views/snippets/footer.liquid.haml +1 -1
  56. data/spec/fixtures/default/app/views/snippets/song.liquid +3 -3
  57. data/spec/fixtures/default/config/site.yml +2 -4
  58. data/spec/fixtures/default/data/events.yml +3 -2
  59. data/spec/fixtures/default/data/songs.yml +1 -1
  60. data/spec/integration/cli_spec.rb +35 -12
  61. data/spec/integration/commands/authenticate_command_spec.rb +60 -0
  62. data/spec/integration/commands/push_command_spec.rb +55 -0
  63. data/spec/integration/generators/page_spec.rb +9 -9
  64. data/spec/integration/generators/relationship_spec.rb +6 -6
  65. data/spec/integration/integration_helper.rb +11 -11
  66. data/spec/integration/sites_spec.rb +48 -48
  67. data/spec/spec_helper.rb +3 -4
  68. data/spec/support/api_settings.rb +5 -0
  69. data/spec/support/helpers.rb +6 -19
  70. data/spec/support/pry.rb +4 -0
  71. data/spec/support/thor.rb +12 -0
  72. data/spec/support/vcr.rb +10 -0
  73. data/spec/unit/decorators/site_decorator_spec.rb +36 -0
  74. metadata +88 -309
  75. data/lib/locomotive/wagon/liquid/drops/base.rb +0 -49
  76. data/lib/locomotive/wagon/liquid/drops/content_entry.rb +0 -49
  77. data/lib/locomotive/wagon/liquid/drops/content_types.rb +0 -119
  78. data/lib/locomotive/wagon/liquid/drops/page.rb +0 -84
  79. data/lib/locomotive/wagon/liquid/drops/session_proxy.rb +0 -18
  80. data/lib/locomotive/wagon/liquid/drops/site.rb +0 -26
  81. data/lib/locomotive/wagon/liquid/errors.rb +0 -17
  82. data/lib/locomotive/wagon/liquid/filters/date.rb +0 -136
  83. data/lib/locomotive/wagon/liquid/filters/html.rb +0 -188
  84. data/lib/locomotive/wagon/liquid/filters/misc.rb +0 -49
  85. data/lib/locomotive/wagon/liquid/filters/resize.rb +0 -18
  86. data/lib/locomotive/wagon/liquid/filters/text.rb +0 -55
  87. data/lib/locomotive/wagon/liquid/filters/translate.rb +0 -28
  88. data/lib/locomotive/wagon/liquid/patches.rb +0 -47
  89. data/lib/locomotive/wagon/liquid/scopeable.rb +0 -151
  90. data/lib/locomotive/wagon/liquid/tags/consume.rb +0 -100
  91. data/lib/locomotive/wagon/liquid/tags/csrf.rb +0 -34
  92. data/lib/locomotive/wagon/liquid/tags/editable/base.rb +0 -50
  93. data/lib/locomotive/wagon/liquid/tags/editable/control.rb +0 -19
  94. data/lib/locomotive/wagon/liquid/tags/editable/file.rb +0 -15
  95. data/lib/locomotive/wagon/liquid/tags/editable/long_text.rb +0 -15
  96. data/lib/locomotive/wagon/liquid/tags/editable/short_text.rb +0 -20
  97. data/lib/locomotive/wagon/liquid/tags/editable/text.rb +0 -15
  98. data/lib/locomotive/wagon/liquid/tags/editable.rb +0 -6
  99. data/lib/locomotive/wagon/liquid/tags/extends.rb +0 -25
  100. data/lib/locomotive/wagon/liquid/tags/fetch_page.rb +0 -41
  101. data/lib/locomotive/wagon/liquid/tags/google_analytics.rb +0 -28
  102. data/lib/locomotive/wagon/liquid/tags/hybrid.rb +0 -27
  103. data/lib/locomotive/wagon/liquid/tags/inline_editor.rb +0 -16
  104. data/lib/locomotive/wagon/liquid/tags/link_to.rb +0 -56
  105. data/lib/locomotive/wagon/liquid/tags/locale_switcher.rb +0 -106
  106. data/lib/locomotive/wagon/liquid/tags/model_form.rb +0 -67
  107. data/lib/locomotive/wagon/liquid/tags/nav.rb +0 -287
  108. data/lib/locomotive/wagon/liquid/tags/paginate.rb +0 -105
  109. data/lib/locomotive/wagon/liquid/tags/path_helper.rb +0 -97
  110. data/lib/locomotive/wagon/liquid/tags/path_to.rb +0 -36
  111. data/lib/locomotive/wagon/liquid/tags/seo.rb +0 -74
  112. data/lib/locomotive/wagon/liquid/tags/session_assign.rb +0 -41
  113. data/lib/locomotive/wagon/liquid/tags/snippet.rb +0 -63
  114. data/lib/locomotive/wagon/liquid/tags/with_scope.rb +0 -48
  115. data/lib/locomotive/wagon/liquid.rb +0 -21
  116. data/lib/locomotive/wagon/listen.rb +0 -65
  117. data/lib/locomotive/wagon/logger.rb +0 -58
  118. data/lib/locomotive/wagon/misc/better_errors.rb +0 -70
  119. data/lib/locomotive/wagon/misc/core_ext.rb +0 -62
  120. data/lib/locomotive/wagon/misc/deployment_connection.rb +0 -120
  121. data/lib/locomotive/wagon/misc/dragonfly.rb +0 -78
  122. data/lib/locomotive/wagon/misc/haml.rb +0 -15
  123. data/lib/locomotive/wagon/misc/hosting_api.rb +0 -117
  124. data/lib/locomotive/wagon/misc/httparty.rb +0 -55
  125. data/lib/locomotive/wagon/misc/i18n.rb +0 -2
  126. data/lib/locomotive/wagon/misc/markdown.rb +0 -27
  127. data/lib/locomotive/wagon/misc/mounter.rb +0 -32
  128. data/lib/locomotive/wagon/misc/will_paginate.rb +0 -16
  129. data/lib/locomotive/wagon/misc.rb +0 -9
  130. data/lib/locomotive/wagon/server/dynamic_assets.rb +0 -33
  131. data/lib/locomotive/wagon/server/entry_submission.rb +0 -151
  132. data/lib/locomotive/wagon/server/favicon.rb +0 -17
  133. data/lib/locomotive/wagon/server/locale.rb +0 -42
  134. data/lib/locomotive/wagon/server/logging.rb +0 -32
  135. data/lib/locomotive/wagon/server/middleware.rb +0 -63
  136. data/lib/locomotive/wagon/server/page.rb +0 -67
  137. data/lib/locomotive/wagon/server/path.rb +0 -34
  138. data/lib/locomotive/wagon/server/renderer.rb +0 -118
  139. data/lib/locomotive/wagon/server/templatized_page.rb +0 -32
  140. data/lib/locomotive/wagon/server/timezone.rb +0 -18
  141. data/lib/locomotive/wagon/server.rb +0 -86
  142. data/lib/locomotive/wagon/standalone_server.rb +0 -28
  143. data/locales/de.yml +0 -157
  144. data/locales/en.yml +0 -189
  145. data/locales/es.yml +0 -133
  146. data/locales/et.yml +0 -154
  147. data/locales/fr.yml +0 -148
  148. data/locales/it.yml +0 -155
  149. data/locales/nb.yml +0 -191
  150. data/locales/nl.yml +0 -160
  151. data/locales/pl.yml +0 -203
  152. data/locales/pt-BR.yml +0 -139
  153. data/locales/ru.yml +0 -224
  154. data/spec/integration/server/basic_spec.rb +0 -169
  155. data/spec/integration/server/contact_form_spec.rb +0 -111
  156. data/spec/integration/server/liquid_spec.rb +0 -98
  157. data/spec/integration/server/new_contact_form_spec.rb +0 -67
  158. data/spec/integration/server/with_scope_spec.rb +0 -30
  159. data/spec/unit/locomotive/wagon/liquid/drops/page_spec.rb +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b6d6087af2e72aea37229a0dadf8f995a72d58d9
4
- data.tar.gz: 94fc99a5b5a321e6cd6e6558a3a35bec52be9efb
3
+ metadata.gz: 739043b4c31b8face271da2d37048fcc126cc8ca
4
+ data.tar.gz: 5d10493f0944c8d441532881ff2347ff680e7d0a
5
5
  SHA512:
6
- metadata.gz: 91544d852b84ace2828029c5dd365eedf8ccaed0558300e34add75782e69289c84a087bebe491afb1e828b522d6e261771d6c32b9bcf21ddcf395cbbecc12a98
7
- data.tar.gz: 18ff58e922ab4347671519779613511640b0de2d4b5a4fece5a5081917278678aa1fc7b7d38f5b3d83625ed28f772c4b62ba6eda5bb69ebe2ae6438b0a4c0817
6
+ metadata.gz: 124f103b49617bc7f6185945dbe753259bc19ce350d6e9ba5a5bd44436508e4258a2f54739163d2821952d58df623b705f4c3aba1bcaf294ca97245106ab738c
7
+ data.tar.gz: 96f069b17d7d062dd831cc5580a525b53a24e2be3ae40c345989ddd20398a5e04335159a9d90b9fa17916b8bf261557001373f1b1d47488adefb206fc8ce718f
data/.gitignore CHANGED
@@ -2,7 +2,6 @@
2
2
  tests
3
3
  .sass-cache
4
4
  .rbenv-gemsets
5
- dragonfly.log
6
5
  /site
7
6
  *.gem
8
7
  *.rbc
@@ -27,3 +26,7 @@ spec/fixtures/default/log
27
26
  /.sass-cache/
28
27
 
29
28
  /tests
29
+
30
+ /deprecated
31
+
32
+ dragonfly.log
data/.rspec CHANGED
@@ -1,2 +1 @@
1
1
  --colour
2
- --backtrace
data/Gemfile CHANGED
@@ -13,7 +13,22 @@ gem 'rb-fsevent', '~> 0.9.1'
13
13
 
14
14
  gem 'therubyracer'
15
15
 
16
+ # gem 'locomotivecms_steam', github: 'locomotivecms/steam', ref: 'b2de77e', require: false
17
+ # gem 'locomotivecms_coal', github: 'locomotivecms/coal', ref: '32b2844', require: false
18
+ # gem 'locomotivecms_common', github: 'locomotivecms/common', ref: '3046b79893', require: false
19
+
20
+ # gem 'locomotivecms_coal', path: '../in_progress/coal', require: false
21
+ # gem 'locomotivecms_steam', path: '../in_progress/steam', require: false
22
+ # gem 'locomotivecms_common', path: '../in_progress/common', require: false
23
+
16
24
  group :test do
17
- gem 'pry'
18
- gem 'coveralls', require: false
25
+ gem 'rspec', '~> 3.2.0'
26
+ gem 'json_spec', '~> 1.1.4'
27
+
28
+ gem 'pry-byebug', '~> 3.1.0'
29
+
30
+ gem 'webmock'
31
+ gem 'vcr'
32
+
33
+ gem 'coveralls', '~> 0.7.11', require: false
19
34
  end
data/README.md CHANGED
@@ -1,10 +1,6 @@
1
1
  # LocomotiveCMS::Wagon
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/locomotivecms_wagon.svg)](http://badge.fury.io/rb/locomotivecms_wagon)
4
- [![Code Climate](https://codeclimate.com/github/locomotivecms/wagon.png)](https://codeclimate.com/github/locomotivecms/wagon)
5
- [![Dependency Status](https://gemnasium.com/locomotivecms/wagon.png)](https://gemnasium.com/locomotivecms/wagon)
6
- [![Build Status](https://travis-ci.org/locomotivecms/wagon.svg?branch=master)](https://travis-ci.org/locomotivecms/wagon)
7
- [![Coverage Status](https://coveralls.io/repos/locomotivecms/wagon/badge.png)](https://coveralls.io/r/locomotivecms/wagon)
3
+ [![Gem Version](https://badge.fury.io/rb/locomotivecms_wagon.svg)](http://badge.fury.io/rb/locomotivecms_wagon) [![Code Climate](https://codeclimate.com/github/locomotivecms/wagon/badges/gpa.svg)](https://codeclimate.com/github/locomotivecms/wagon) [![Dependency Status](https://gemnasium.com/locomotivecms/wagon.png)](https://gemnasium.com/locomotivecms/wagon) [![Build Status](https://travis-ci.org/locomotivecms/wagon.svg?branch=master)](https://travis-ci.org/locomotivecms/wagon) [![Coverage Status](https://coveralls.io/repos/locomotivecms/wagon/badge.svg?branch=master)](https://coveralls.io/r/locomotivecms/wagon?branch=master)
8
4
 
9
5
  Wagon is the official site generator for the LocomotiveCMS engine powered by all the efficient and modern HTML development tools (Haml, SASS, Compass, Less).
10
6
 
@@ -37,7 +33,7 @@ Please, visit the documentation website of LocomotiveCMS.
37
33
 
38
34
  #### Run the server with a default site
39
35
 
40
- $ bundle exec bin/wagon serve <path to the mounter gem>/spec/fixtures/default
36
+ $ bundle exec bin/wagon serve spec/fixtures/default
41
37
 
42
38
  #### Push a site
43
39
 
data/Rakefile CHANGED
@@ -25,23 +25,8 @@ task release: :gem do
25
25
  sh "gem push pkg/locomotivecms_wagon-#{gemspec.version}.gem"
26
26
  end
27
27
 
28
- namespace :development do
29
- desc 'create vcr cassettes'
30
- task :bootstrap do
31
- VCR.configure do |c|
32
- c.cassette_library_dir = File.expand_path(File.dirname(__FILE__) + '/spec/integration/cassettes')
33
- c.hook_into :webmock # or :fakeweb
34
- c.allow_http_connections_when_no_cassette = true
35
- end
36
-
37
- FileUtils.rm_rf(File.join(File.dirname(__FILE__), 'site'))
38
- VCR.use_cassette('pull') do
39
- exit unless Locomotive::Wagon.clone('site', '.', { host: 'sample.example.com:3000', email: 'admin@locomotivecms.com', password: 'locomotive' })
40
- end
41
-
42
- Locomotive::Wagon.push('site', {host: 'sample.example.com:3000', email: 'admin@locomotivecms.com', password: 'locomotive'}, force: true, translations: false, data: true)
43
- end
44
- end
28
+ require 'rspec/core/rake_task'
29
+ RSpec::Core::RakeTask.new('spec')
45
30
 
46
31
  RSpec::Core::RakeTask.new('spec:unit') do |spec|
47
32
  spec.pattern = 'spec/unit/**/*_spec.rb'
@@ -52,6 +37,4 @@ RSpec::Core::RakeTask.new('spec:integration') do |spec|
52
37
  spec.pattern = 'spec/integration/**/*_spec.rb'
53
38
  end
54
39
 
55
- task spec: ['spec:integration']
56
-
57
- task default: :spec
40
+ task default: :spec
@@ -177,14 +177,16 @@ module Locomotive
177
177
  say Locomotive::Wagon::VERSION
178
178
  end
179
179
 
180
- desc 'auth [EMAIL] [PASSWORD]', 'Log into the LocomotiveHosting platform'
181
- def auth(email = nil, password = nil)
182
- say "LocomotiveHosting Sign in/up\n\n", :bold
180
+ desc 'auth [EMAIL] [PASSWORD] [PLATFORM_URL]', 'Log into your Locomotive platform'
181
+ def auth(email = nil, password = nil, platform_url = nil)
182
+ say "Locomotive Sign in/up\n\n", :bold
183
183
 
184
- email ||= ask('Enter your e-mail?')
185
- password ||= ask('Enter your password?')
184
+ platform_url ||= ask("Enter the URL of your platform? (default: #{Locomotive::Wagon::DEFAULT_PLATFORM_URL})")
185
+ platform_url = Locomotive::Wagon::DEFAULT_PLATFORM_URL if platform_url.strip == ''
186
+ while email.to_s.strip == ''; email = ask('Enter your e-mail?'); end
187
+ while password.to_s.strip == ''; password = ask('Enter your password?', echo: false); end
186
188
 
187
- Locomotive::Wagon.authenticate(email, password, shell)
189
+ Locomotive::Wagon.authenticate(platform_url, email, password, shell)
188
190
  end
189
191
 
190
192
  desc 'init NAME [PATH] [GENERATOR_OPTIONS]', 'Create a brand new site'
@@ -297,24 +299,17 @@ module Locomotive
297
299
 
298
300
  desc 'push ENV [PATH]', 'Push a site to a remote LocomotiveCMS Engine'
299
301
  method_option :resources, aliases: '-r', type: 'array', default: nil, desc: 'Only push the resource(s) passed in argument'
300
- method_option :force, aliases: '-f', type: 'boolean', default: false, desc: 'Force the push of a resource'
301
- method_option :translations, aliases: '-t', type: 'boolean', default: false, desc: 'Push the local translations (by default, they are not)'
302
302
  method_option :data, aliases: '-d', type: 'boolean', default: false, desc: 'Push the content entries and the editable elements (by default, they are not)'
303
- method_option :only_resource, aliases: '-o', type: 'array', default: [], desc: 'Push only the resources whose slug / fullpath matches the list of strings passed in argument'
304
303
  method_option :shell, type: 'boolean', default: true, desc: 'Use shell to ask for missing connection information like the subdomain (in this case, take a random one)'
305
304
  method_option :verbose, aliases: '-v', type: 'boolean', default: false, desc: 'display the full error stack trace if an error occurs'
306
305
  def push(env, path = '.')
307
306
  force_color_if_asked(options)
308
307
 
309
308
  if check_path!(path)
310
- if connection_info = self.retrieve_connection_info(env, path, options[:shell])
311
- begin
312
- Locomotive::Wagon.push(path, connection_info, options)
313
- rescue Exception => e
314
- self.print_exception(e, options[:verbose])
315
- exit(1)
316
- end
317
- else
309
+ begin
310
+ Locomotive::Wagon.push(env, path, options)
311
+ rescue Exception => e
312
+ self.print_exception(e, options[:verbose])
318
313
  exit(1)
319
314
  end
320
315
  end
@@ -381,28 +376,28 @@ module Locomotive
381
376
  end
382
377
  end
383
378
 
384
- # From a site specified by a path, retrieve the information of the connection
385
- # for a environment located in the config/deploy.yml file of the site.
386
- #
387
- # @param [ String ] env The environment (development, staging, production, ...etc)
388
- # @param [ String ] path The path of the local site
389
- # @param [ Boolean ] use_shell True by default, use it to ask for missing information (subdomain for instance)
390
- #
391
- # @return [ Hash ] The information of the connection or nil if errors
392
- #
393
- def retrieve_connection_info(env, path, use_shell = true)
394
- require 'locomotive/wagon/misc/deployment_connection'
395
-
396
- begin
397
- service = Locomotive::Wagon::DeploymentConnection.new(path, use_shell ? shell : nil)
398
-
399
- service.get_information(env)
400
-
401
- rescue Exception => e
402
- self.print_exception(e, options[:verbose])
403
- nil
404
- end
405
- end
379
+ # # From a site specified by a path, retrieve the information of the connection
380
+ # # for a environment located in the config/deploy.yml file of the site.
381
+ # #
382
+ # # @param [ String ] env The environment (development, staging, production, ...etc)
383
+ # # @param [ String ] path The path of the local site
384
+ # # @param [ Boolean ] use_shell True by default, use it to ask for missing information (subdomain for instance)
385
+ # #
386
+ # # @return [ Hash ] The information of the connection or nil if errors
387
+ # #
388
+ # def retrieve_connection_info(env, path, use_shell = true)
389
+ # require 'locomotive/wagon/misc/deployment_connection'
390
+
391
+ # begin
392
+ # service = Locomotive::Wagon::DeploymentConnection.new(path, use_shell ? shell : nil)
393
+
394
+ # service.get_information(env)
395
+
396
+ # rescue Exception => e
397
+ # self.print_exception(e, options[:verbose])
398
+ # nil
399
+ # end
400
+ # end
406
401
 
407
402
  end
408
403
 
@@ -0,0 +1,65 @@
1
+ require_relative 'concerns/api_concern'
2
+ require_relative 'concerns/netrc_concern'
3
+
4
+ module Locomotive::Wagon
5
+
6
+ class AuthenticateCommand < Struct.new(:platform_url, :email, :password, :shell)
7
+
8
+ include ApiConcern
9
+ include NetrcConcern
10
+
11
+ def self.authenticate(platform_url, email, password, shell)
12
+ self.new(platform_url, email, password, shell).authenticate
13
+ end
14
+
15
+ def authenticate
16
+ if api_key = fetch_api_key
17
+ write_credentials_to_netrc(api_host, email, api_key)
18
+ else
19
+ shell.say "Sorry, we were unable to authenticate you on \"#{platform_url}\"", :red
20
+ end
21
+
22
+ !api_key.nil?
23
+ end
24
+
25
+ def fetch_api_key
26
+ if my_account
27
+ my_account.api_key
28
+ else
29
+ shell.say "No account found for #{email} or invalid credentials", :yellow
30
+
31
+ # shall we create a new account?
32
+ if shell.yes?('Do you want to create a new account? [Y/N]')
33
+ create_account
34
+ else
35
+ false
36
+ end
37
+ end
38
+ end
39
+
40
+ def create_account
41
+ name = shell.ask 'What is your name?'
42
+
43
+ begin
44
+ account = api_client.my_account.create(name: name, email: email, password: password)
45
+ shell.say "Your account has been successfully created.", :green
46
+ account.api_key
47
+ rescue Locomotive::Coal::Error => e
48
+ shell.say "We were unable to create your account, reason(s): #{e.message}", :red
49
+ false
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def my_account
56
+ begin
57
+ api_client.my_account.get
58
+ rescue Locomotive::Coal::UnauthorizedError
59
+ nil
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+ end
@@ -0,0 +1,57 @@
1
+ require 'locomotive/coal'
2
+
3
+ module Locomotive::Wagon
4
+
5
+ module ApiConcern
6
+
7
+ # Instance of the API client to request an account or his/her list of sites.
8
+ def api_client
9
+ @api_client ||= Locomotive::Coal::Client.new(api_uri, api_credentials)
10
+ end
11
+
12
+ # Instance of the API client to request resources of a site: pages, theme_assets, ...etc.
13
+ def api_site_client(connection)
14
+ return @api_site_client if @api_site_client
15
+
16
+ _host, _credentials = connection['host'], connection.slice('email', 'api_key', 'password')
17
+ _options = connection.slice('ssl', 'handle')
18
+
19
+ @api_site_client = Locomotive::Coal::Client.new(_host, _credentials, _options)
20
+ end
21
+
22
+ # Host (+ port) extracted from the platform_url instance variable.
23
+ # If port equals 80, do not add it to the host.
24
+ #
25
+ # Examples:
26
+ #
27
+ # www.myengine.com
28
+ # localhost:3000
29
+ #
30
+ def api_host
31
+ uri = api_uri
32
+ host, port = uri.host, uri.port
33
+
34
+ port == 80 ? uri.host : "#{uri.host}:#{uri.port}"
35
+ end
36
+
37
+ def api_credentials
38
+ if respond_to?(:email)
39
+ { email: email, password: password }
40
+ elsif respond_to?(:credentials)
41
+ credentials
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def api_uri
48
+ if (self.platform_url =~ /^https?:\/\//).nil?
49
+ self.platform_url = 'http://' + self.platform_url
50
+ end
51
+
52
+ URI(platform_url)
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,32 @@
1
+ require 'locomotive/coal'
2
+
3
+ module Locomotive::Wagon
4
+
5
+ module DeployFileConcern
6
+
7
+ def write_deploy_setings(env, path, settings)
8
+ File.open(deploy_file(path), 'a+') do |f|
9
+ f.write({ env => settings }.to_yaml.sub(/^---/, ''))
10
+ end
11
+
12
+ settings
13
+ end
14
+
15
+ def read_deploy_settings(env, path)
16
+ # pre-processing: erb code to parse and render?
17
+ parsed_deploy_file = ERB.new(File.open(deploy_file(path)).read).result
18
+
19
+ # finally, get the hash from the YAML file
20
+ environments = YAML::load(parsed_deploy_file)
21
+ (environments.is_a?(Hash) ? environments : {})[env.to_s]
22
+ rescue Exception => e
23
+ raise "Unable to read the config/deploy.yml file (#{e.message})"
24
+ end
25
+
26
+ def deploy_file(path)
27
+ File.join(path, 'config', 'deploy.yml')
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,16 @@
1
+ module Locomotive::Wagon
2
+
3
+ module InstrumentationConcern
4
+
5
+ def instrument(action, payload = {})
6
+ ActiveSupport::Notifications.instrument(instrument_scope_name(action), payload)
7
+ end
8
+
9
+ def instrument_scope_name(action)
10
+ name = self.class.name[/::(\w+)Command$/, 1].underscore
11
+ ['wagon', name, action.to_s].compact.join('.')
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,21 @@
1
+ require 'netrc'
2
+
3
+ module Locomotive::Wagon
4
+
5
+ module NetrcConcern
6
+
7
+ def write_credentials_to_netrc(host, email, api_key)
8
+ netrc = Netrc.read
9
+ netrc[host] = email, api_key
10
+ netrc.save
11
+ end
12
+
13
+ def read_credentials_from_netrc(host)
14
+ if entry = Netrc.read[host]
15
+ { email: entry.login, api_key: entry.password }
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,24 @@
1
+ require 'locomotive/coal'
2
+
3
+ module Locomotive::Wagon
4
+
5
+ module SteamConcern
6
+
7
+ def steam_services
8
+ return @steam_services if @steam_services
9
+
10
+ Locomotive::Steam.configure do |config|
11
+ config.mode = :test
12
+ config.adapter = { name: :filesystem, path: path }
13
+ config.asset_path = File.expand_path(File.join(path, 'public'))
14
+ end
15
+
16
+ @steam_services = Locomotive::Steam::Services.build_instance.tap do |services|
17
+ repositories = services.repositories
18
+ services.set_site(repositories.site.all.first)
19
+ services.locale = services.current_site.default_locale
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ module Locomotive::Wagon
2
+
3
+ class GenerateCommand < Struct.new(:name, :args, :options)
4
+
5
+ def self.generate(name, args, options)
6
+ new(name, args, options).generate
7
+ end
8
+
9
+ def generate
10
+ Bundler.require 'misc'
11
+
12
+ generator = generator_klass.new(args, options, { behavior: :skip })
13
+ generator.destination_root = args.last
14
+ generator.force_color_if_asked(options)
15
+ generator.invoke_all
16
+ end
17
+
18
+ private
19
+
20
+ def generator_klass
21
+ lib = "locomotive/wagon/generators/#{name}"
22
+ require lib
23
+
24
+ lib.camelize.constantize
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,19 @@
1
+ module Locomotive::Wagon
2
+
3
+ class InitCommand < Struct.new(:generator_klass, :args, :options)
4
+
5
+ def self.generate(klass, args, options)
6
+ new(klass, args, options).generate
7
+ end
8
+
9
+ def generate
10
+ args, opts = Thor::Options.split(self.args)
11
+
12
+ generator = generator_klass.new(args, opts, {})
13
+ generator.force_color_if_asked(options)
14
+ generator.invoke_all
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,59 @@
1
+ module Locomotive::Wagon
2
+
3
+ class PushLogger
4
+
5
+ def initialize
6
+ subscribe 'site_created' do |event|
7
+ log "We created your site with the following handle: #{event.payload[:site].handle}", { mode: :bold }
8
+ end
9
+
10
+ subscribe :start do |event|
11
+ log "\n"
12
+ log "Pushing #{event.payload[:name].camelcase}", { color: :black, background: :white }
13
+ end
14
+
15
+ subscribe :persist do |event|
16
+ log "persisting #{event.payload[:label]}", :white, 2, true
17
+ end
18
+
19
+ subscribe :skip_persisting do |event|
20
+ log ' [' + 'skip'.colorize(:yellow) + ']'
21
+ end
22
+
23
+ subscribe :persist_with_success do |event|
24
+ log ' [' + 'done'.colorize(:green) + ']'
25
+ end
26
+
27
+ subscribe :persist_with_error do |event|
28
+ log ' [' + 'failed'.colorize(:red) + ']'
29
+ log event.payload[:message], :red, 4
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def log(message, color = nil, ident = nil, print = false)
36
+ ident = ' ' * (ident || 0)
37
+
38
+ message = "#{ident}#{message.gsub("\n", "\n" + ident)}"
39
+ message = message.colorize(color) if color
40
+
41
+ if print
42
+ print message
43
+ else
44
+ puts message
45
+ end
46
+ end
47
+
48
+ def subscribe(action = nil, &block)
49
+ name = ['wagon', 'push', [*action]].flatten.compact.join('.')
50
+
51
+ ActiveSupport::Notifications.subscribe(name) do |*args|
52
+ event = ActiveSupport::Notifications::Event.new *args
53
+ yield(event)
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,116 @@
1
+ require 'locomotive/steam'
2
+
3
+ require_relative 'loggers/push_logger'
4
+
5
+ require_relative_all 'concerns'
6
+ require_relative_all '../decorators/concerns'
7
+ require_relative_all '../decorators'
8
+ require_relative_all 'push_sub_commands'
9
+
10
+ module Locomotive::Wagon
11
+
12
+ class PushCommand < Struct.new(:env, :path, :options)
13
+
14
+ RESOURCES = %w(content_types content_entries pages snippets theme_assets translations).freeze
15
+
16
+ RESOURCES_WITH_CONTENT = %w(content_entries translations).freeze
17
+
18
+ include ApiConcern
19
+ include NetrcConcern
20
+ include DeployFileConcern
21
+ include SteamConcern
22
+ include InstrumentationConcern
23
+
24
+ attr_accessor :platform_url, :credentials
25
+
26
+ def self.push(env, path, options)
27
+ self.new(env, path, options).push
28
+ end
29
+
30
+ def push
31
+ PushLogger.new if options[:verbose]
32
+
33
+ api_client = api_site_client(connection_information)
34
+
35
+ content_assets_pusher = Locomotive::Wagon::PushContentAssetsCommand.new(api_client, steam_services)
36
+
37
+ each_resource do |klass|
38
+ klass.push(api_client, steam_services, content_assets_pusher)
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def each_resource
45
+ RESOURCES.each do |name|
46
+ next if !options[:resources].blank? && !options[:resources].include?(name)
47
+
48
+ next if RESOURCES_WITH_CONTENT.include?(name) && !options[:data]
49
+
50
+ klass = "Locomotive::Wagon::Push#{name.camelcase}Command".constantize
51
+
52
+ yield klass
53
+ end
54
+ end
55
+
56
+ def connection_information
57
+ if information = read_deploy_settings(self.env, self.path)
58
+ # the deployment env exists and contains all the information we need to move on
59
+ information
60
+ else
61
+ # mandatory to sign in
62
+ load_credentials_from_netrc
63
+
64
+ # create the remote site on the platform
65
+ site = create_remote_site
66
+
67
+ # update the deploy.yml by adding the new env since we've got all the information
68
+ write_deploy_setings(self.env, self.path, {
69
+ 'host' => api_host,
70
+ 'handle' => site.handle,
71
+ 'email' => credentials[:email],
72
+ 'api_key' => credentials[:api_key]
73
+ })
74
+ end
75
+ end
76
+
77
+ def create_remote_site
78
+ # get an instance of the Steam services in order to load the information about the site (SiteRepository)
79
+ steam_services.current_site.tap do |site|
80
+ # ask for a handle if not found (blank: random one)
81
+ site[:handle] ||= shell.ask "What is the handle of your site?"
82
+
83
+ # create the site
84
+ attributes = SiteDecorator.new(site).to_hash
85
+ _site = api_client.sites.create(attributes)
86
+ site[:handle] = _site.handle
87
+
88
+ instrument :site_created, site: site
89
+ end
90
+ end
91
+
92
+ def load_credentials_from_netrc
93
+ # ask for the platform URL (or LOCOMOTIVE_PLATFORM_URL env variable)
94
+ ask_for_platform_url
95
+
96
+ # retrieve email + api_key. If no entry present in the .netrc, raise an error
97
+ self.credentials = read_credentials_from_netrc(self.api_host)
98
+
99
+ raise 'You need to run wagon authenticate before going further' if self.credentials.nil?
100
+ end
101
+
102
+ def ask_for_platform_url
103
+ default = ENV['LOCOMOTIVE_PLATFORM_URL'] || DEFAULT_PLATFORM_URL
104
+
105
+ url = shell.ask "What is the URL of your platform? (default: #{default})"
106
+
107
+ self.platform_url = url.blank? ? default : url
108
+ end
109
+
110
+ def shell
111
+ options[:shell]
112
+ end
113
+
114
+ end
115
+
116
+ end