locomotivecms_wagon 1.2.2 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/generators/blank/app/views/pages/404.liquid.haml +11 -0
- data/generators/blank/app/views/pages/index.liquid.haml +12 -0
- data/generators/blank/config/site.yml.tt +3 -0
- data/generators/bootstrap/config/site.yml.tt +3 -0
- data/generators/content_type/data/%name%.yml.tt +2 -2
- data/generators/foundation/config/site.yml.tt +3 -0
- data/lib/locomotive/wagon.rb +10 -2
- data/lib/locomotive/wagon/cli.rb +1 -1
- data/lib/locomotive/wagon/exceptions.rb +27 -0
- data/lib/locomotive/wagon/generators/site/blank.rb +10 -1
- data/lib/locomotive/wagon/liquid.rb +1 -1
- data/lib/locomotive/wagon/liquid/drops/content_types.rb +5 -0
- data/lib/locomotive/wagon/liquid/drops/session_proxy.rb +18 -0
- data/lib/locomotive/wagon/liquid/drops/site.rb +4 -0
- data/lib/locomotive/wagon/liquid/errors.rb +10 -0
- data/lib/locomotive/wagon/liquid/filters/date.rb +62 -24
- data/lib/locomotive/wagon/liquid/filters/html.rb +7 -5
- data/lib/locomotive/wagon/liquid/filters/misc.rb +17 -0
- data/lib/locomotive/wagon/liquid/filters/text.rb +8 -2
- data/lib/locomotive/wagon/liquid/patches.rb +1 -1
- data/lib/locomotive/wagon/liquid/scopeable.rb +128 -11
- data/lib/locomotive/wagon/liquid/tags/consume.rb +60 -18
- data/lib/locomotive/wagon/liquid/tags/editable/base.rb +4 -4
- data/lib/locomotive/wagon/liquid/tags/extends.rb +2 -2
- data/lib/locomotive/wagon/liquid/tags/google_analytics.rb +2 -2
- data/lib/locomotive/wagon/liquid/tags/link_to.rb +20 -9
- data/lib/locomotive/wagon/liquid/tags/locale_switcher.rb +7 -7
- data/lib/locomotive/wagon/liquid/tags/nav.rb +22 -22
- data/lib/locomotive/wagon/liquid/tags/paginate.rb +2 -2
- data/lib/locomotive/wagon/liquid/tags/session_assign.rb +41 -0
- data/lib/locomotive/wagon/liquid/tags/snippet.rb +25 -6
- data/lib/locomotive/wagon/liquid/tags/with_scope.rb +9 -8
- data/lib/locomotive/wagon/misc.rb +5 -1
- data/lib/locomotive/wagon/misc/better_errors.rb +70 -0
- data/lib/locomotive/wagon/misc/core_ext.rb +8 -1
- data/lib/locomotive/wagon/misc/haml.rb +15 -0
- data/lib/locomotive/wagon/misc/markdown.rb +27 -0
- data/lib/locomotive/wagon/misc/mounter.rb +32 -0
- data/lib/locomotive/wagon/server.rb +6 -4
- data/lib/locomotive/wagon/server/dynamic_assets.rb +3 -8
- data/lib/locomotive/wagon/server/logging.rb +2 -2
- data/lib/locomotive/wagon/server/renderer.rb +17 -12
- data/lib/locomotive/wagon/server/timezone.rb +18 -0
- data/lib/locomotive/wagon/version.rb +1 -1
- data/locales/en.yml +11 -0
- data/locomotivecms_wagon.gemspec +6 -5
- data/spec/fixtures/default/app/content_types/events.yml +7 -1
- data/spec/fixtures/default/app/views/pages/contest.liquid.haml +18 -0
- data/spec/fixtures/default/app/views/pages/filtered.liquid.haml +10 -0
- data/spec/fixtures/default/app/views/pages/index.liquid.haml +2 -6
- data/spec/fixtures/default/app/views/pages/music.fr.liquid.haml +4 -0
- data/spec/fixtures/default/app/views/pages/songs/template.fr.liquid.haml +16 -0
- data/spec/fixtures/default/app/views/pages/songs/template/band.liquid.haml +16 -0
- data/spec/fixtures/default/app/views/snippets/footer.liquid.haml +6 -0
- data/spec/fixtures/default/app/views/snippets/song.fr.liquid.haml +1 -1
- data/spec/fixtures/default/data/events.yml +4 -0
- data/spec/integration/cassettes/pull.yml +308 -450
- data/spec/integration/cassettes/push.yml +446 -492
- data/spec/integration/cassettes/staging.yml +360 -500
- data/spec/integration/cli_spec.rb +2 -2
- data/spec/integration/server/basic_spec.rb +30 -0
- data/spec/integration/server/liquid_spec.rb +7 -0
- data/spec/integration/server/with_scope_spec.rb +20 -0
- data/spec/integration/sites_spec.rb +8 -7
- data/spec/support/helpers.rb +1 -1
- metadata +65 -78
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: eb39ff86bec9126c980c162d426f7ead8e32e492
|
4
|
+
data.tar.gz: a65b32d9e41c8080aa8d607e5cb5179fff549741
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 41a4b7df5f1d43a0711b49e4da1c289baff7867e3ffd054ae7df5db31fc7d4d6e9b398d998482f3075a926e82f851cea5f29b2fdf12c45d610a13835768b7cf3
|
7
|
+
data.tar.gz: 4499bdf2efbdcfbd628a09a4d4383e97d68f39f5d0828369f97143278ea772503de60d932fd48514293af0aa578735bb612db904faf62d47bbb140c7d354b134
|
data/Gemfile
CHANGED
@@ -4,6 +4,10 @@ source 'https://rubygems.org'
|
|
4
4
|
gemspec
|
5
5
|
|
6
6
|
# Development
|
7
|
+
# gem 'locomotivecms_solid', path: '../gems/solid', require: false
|
7
8
|
# gem 'locomotivecms_mounter', path: '../gems/mounter', require: false
|
8
9
|
|
10
|
+
# gem 'locomotivecms-liquid', path: '../gems/liquid', require: false
|
11
|
+
# gem 'locomotivecms-solid', path: '../gems/solid', require: false
|
12
|
+
|
9
13
|
gem 'rb-fsevent', '~> 0.9.1'
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -39,7 +39,7 @@ namespace :development do
|
|
39
39
|
exit unless Locomotive::Wagon.clone('site', '.', { host: 'sample.example.com:3000', email: 'admin@locomotivecms.com', password: 'locomotive' })
|
40
40
|
end
|
41
41
|
|
42
|
-
Locomotive::Wagon.push('site', {host: 'sample.example.com:3000', email: 'admin@locomotivecms.com', password: 'locomotive'}, force: true,
|
42
|
+
Locomotive::Wagon.push('site', {host: 'sample.example.com:3000', email: 'admin@locomotivecms.com', password: 'locomotive'}, force: true, translations: false, data: true)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
!!!
|
2
|
+
%html{lang: "en"}
|
3
|
+
%head
|
4
|
+
%meta{charset: "utf-8"}
|
5
|
+
%title {{ site.name }}
|
6
|
+
%meta{name: "keywords", value: "{{ site.meta_keywords }}"}
|
7
|
+
%meta{name: "description", value: "{{ site.meta_description }}"}
|
8
|
+
%body
|
9
|
+
%h1 {{ page.title }}
|
10
|
+
{% block 'main' %}
|
11
|
+
%p Lorem ipsum....
|
12
|
+
{% endblock %}
|
@@ -11,7 +11,7 @@
|
|
11
11
|
<% when 'boolean' -%>
|
12
12
|
<%= field.name -%>: true # Or false
|
13
13
|
<% when 'date' -%>
|
14
|
-
<%= field.name -%>: <%= Time.now.strftime('%Y/%
|
14
|
+
<%= field.name -%>: <%= Time.now.strftime('%Y/%m/%d') -%> # YYYY/MM/DD
|
15
15
|
<% when 'file' -%>
|
16
16
|
<%= field.name -%>: null # Path to a file in the public/samples folder or to a remote and external file.
|
17
17
|
<% when 'belongs_to' -%>
|
@@ -21,4 +21,4 @@
|
|
21
21
|
<% end -%>
|
22
22
|
<% end -%>
|
23
23
|
|
24
|
-
<% end -%>
|
24
|
+
<% end -%>
|
data/lib/locomotive/wagon.rb
CHANGED
@@ -24,12 +24,20 @@ module Locomotive
|
|
24
24
|
if reader = self.require_mounter(path, true)
|
25
25
|
Bundler.require 'misc'
|
26
26
|
|
27
|
-
require 'thin'
|
28
27
|
require 'locomotive/wagon/server'
|
28
|
+
app = Locomotive::Wagon::Server.new(reader)
|
29
29
|
|
30
|
-
|
30
|
+
require 'thin'
|
31
|
+
server = Thin::Server.new(options[:host], options[:port], app)
|
31
32
|
server.threaded = true # TODO: make it an option ?
|
32
33
|
server.start
|
34
|
+
|
35
|
+
# require 'unicorn' # TODO: gem 'unicorn'
|
36
|
+
# server = Unicorn::HttpServer.new(app)
|
37
|
+
# server.start
|
38
|
+
|
39
|
+
# require 'rack'
|
40
|
+
# Rack::Handler::WEBrick.run(app, { :'Port' => options[:port], :'Host' => options[:host] })
|
33
41
|
end
|
34
42
|
end
|
35
43
|
|
data/lib/locomotive/wagon/cli.rb
CHANGED
@@ -182,7 +182,7 @@ module Locomotive
|
|
182
182
|
desc 'push ENV [PATH]', 'Push a site to a remote LocomotiveCMS engine'
|
183
183
|
method_option :resources, aliases: '-r', type: 'array', default: nil, desc: 'Only push the resource(s) passed in argument'
|
184
184
|
method_option :force, aliases: '-f', type: 'boolean', default: false, desc: 'Force the push of a resource'
|
185
|
-
method_option :
|
185
|
+
method_option :translations, aliases: '-t', type: 'boolean', default: false, desc: 'Push the local translations (by default, they are not)'
|
186
186
|
method_option :data, aliases: '-d', type: 'boolean', default: false, desc: 'Push the content entries and the editable elements (by default, they are not)'
|
187
187
|
method_option :verbose, aliases: '-v', type: 'boolean', default: false, desc: 'display the full error stack trace if an error occurs'
|
188
188
|
def push(env, path = '.')
|
@@ -20,6 +20,33 @@ module Locomotive
|
|
20
20
|
|
21
21
|
end
|
22
22
|
|
23
|
+
class RendererException < DefaultException
|
24
|
+
|
25
|
+
attr_accessor :name, :template, :liquid_context
|
26
|
+
|
27
|
+
def initialize(exception, name, template, liquid_context)
|
28
|
+
self.name, self.template, self.liquid_context = name, template, liquid_context
|
29
|
+
|
30
|
+
self.log_page_into_backtrace(exception)
|
31
|
+
|
32
|
+
super(exception.message)
|
33
|
+
|
34
|
+
self.set_backtrace(exception.backtrace)
|
35
|
+
end
|
36
|
+
|
37
|
+
def log_page_into_backtrace(exception)
|
38
|
+
line = self.template.line_offset
|
39
|
+
line += (exception.respond_to?(:line) ? exception.line : 0) + 1
|
40
|
+
|
41
|
+
message = "#{self.template.filepath}:#{line}:in `#{self.name}'"
|
42
|
+
|
43
|
+
Locomotive::Wagon::Logger.fatal "[ERROR] #{exception.message} - #{message}\n".red
|
44
|
+
|
45
|
+
exception.backtrace.unshift message
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
23
50
|
class MounterException < DefaultException
|
24
51
|
end
|
25
52
|
|
@@ -11,7 +11,16 @@ module Locomotive
|
|
11
11
|
version: Locomotive::Wagon::VERSION
|
12
12
|
})
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
|
+
def choose_haml_over_html
|
16
|
+
if yes?('Do you prefer HAML templates ?')
|
17
|
+
remove_file File.join(self.destination, 'app/views/pages/index.liquid')
|
18
|
+
remove_file File.join(self.destination, 'app/views/pages/404.liquid')
|
19
|
+
else
|
20
|
+
remove_file File.join(self.destination, 'app/views/pages/index.liquid.haml')
|
21
|
+
remove_file File.join(self.destination, 'app/views/pages/404.liquid.haml')
|
22
|
+
end
|
23
|
+
end
|
15
24
|
end
|
16
25
|
|
17
26
|
Locomotive::Wagon::Generators::Site.register(:blank, Blank, %{
|
@@ -99,6 +99,11 @@ module Locomotive
|
|
99
99
|
def collection
|
100
100
|
return unless @collection.blank?
|
101
101
|
|
102
|
+
# define the default order_by if not set
|
103
|
+
if @context['with_scope'] && !@context['with_scope']['order_by'].blank? && !%w(manually position).include?(@content_type.order_by)
|
104
|
+
@context['with_scope']['order_by'] = @content_type.order_by + '.' + @content_type.order_direction
|
105
|
+
end
|
106
|
+
|
102
107
|
@collection = apply_scope(@content_type.entries)
|
103
108
|
end
|
104
109
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Locomotive
|
2
|
+
module Wagon
|
3
|
+
module Liquid
|
4
|
+
module Drops
|
5
|
+
|
6
|
+
class SessionProxy < ::Liquid::Drop
|
7
|
+
|
8
|
+
def before_method(meth)
|
9
|
+
request = @context.registers[:request]
|
10
|
+
request.session[meth.to_sym]
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -2,6 +2,16 @@ module Locomotive
|
|
2
2
|
module Wagon
|
3
3
|
module Liquid
|
4
4
|
class PageNotFound < ::Liquid::Error; end
|
5
|
+
|
6
|
+
class PageNotTranslated < ::Liquid::Error; end
|
7
|
+
|
8
|
+
class ContentEntryNotTranslated < ::Liquid::Error; end
|
9
|
+
|
10
|
+
class UnknownConditionInScope < ::Liquid::Error; end
|
11
|
+
|
12
|
+
class UnknownConditionInScope < ::Liquid::Error; end
|
13
|
+
|
14
|
+
class ConnectionRefused < ::Liquid::Error; end
|
5
15
|
end
|
6
16
|
end
|
7
17
|
end
|
@@ -4,65 +4,92 @@ module Locomotive
|
|
4
4
|
module Filters
|
5
5
|
module Date
|
6
6
|
|
7
|
+
def parse_date_time(input, format = nil)
|
8
|
+
return '' if input.blank?
|
9
|
+
|
10
|
+
format ||= I18n.t('time.formats.default')
|
11
|
+
date_time = ::DateTime._strptime(input, format)
|
12
|
+
|
13
|
+
if date_time
|
14
|
+
::Time.zone.local(date_time[:year], date_time[:mon], date_time[:mday], date_time[:hour], date_time[:min], date_time[:sec] || 0)
|
15
|
+
else
|
16
|
+
::Time.zone.parse(input) rescue ''
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse_date(input, format)
|
21
|
+
return '' if input.blank?
|
22
|
+
|
23
|
+
format ||= I18n.t('date.formats.default')
|
24
|
+
date = ::Date._strptime(input, format)
|
25
|
+
|
26
|
+
if date
|
27
|
+
::Date.new(date[:year], date[:mon], date[:mday])
|
28
|
+
else
|
29
|
+
::Date.parse(value) rescue ''
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
7
33
|
def localized_date(input, *args)
|
8
34
|
return '' if input.blank?
|
9
35
|
|
10
36
|
format, locale = args
|
11
37
|
|
12
38
|
locale ||= I18n.locale
|
13
|
-
format ||= I18n.t('date.formats.default', :
|
39
|
+
format ||= I18n.t('date.formats.default', locale: locale)
|
14
40
|
|
15
41
|
if input.is_a?(String)
|
16
42
|
begin
|
17
43
|
fragments = ::Date._strptime(input, format)
|
18
44
|
input = ::Date.new(fragments[:year], fragments[:mon], fragments[:mday])
|
19
45
|
rescue
|
20
|
-
input = Time.parse(input)
|
46
|
+
input = Time.zone.parse(input)
|
21
47
|
end
|
22
48
|
end
|
23
49
|
|
24
50
|
return input.to_s unless input.respond_to?(:strftime)
|
25
51
|
|
26
|
-
I18n.l input, :
|
52
|
+
I18n.l input, format: format, locale: locale
|
27
53
|
end
|
28
54
|
|
29
55
|
alias :format_date :localized_date
|
30
56
|
|
31
|
-
def distance_of_time_in_words(input,
|
57
|
+
def distance_of_time_in_words(input, from_time = Time.zone.now, include_seconds = false)
|
32
58
|
return '' if input.blank?
|
33
59
|
|
34
|
-
|
35
|
-
to_time =
|
60
|
+
# make sure we deals with instances of Time
|
61
|
+
to_time = to_time(input)
|
62
|
+
from_time = to_time(from_time)
|
36
63
|
|
37
64
|
from_time = from_time.to_time if from_time.respond_to?(:to_time)
|
38
65
|
to_time = to_time.to_time if to_time.respond_to?(:to_time)
|
39
66
|
distance_in_minutes = (((to_time - from_time).abs)/60).round
|
40
67
|
distance_in_seconds = ((to_time - from_time).abs).round
|
41
68
|
|
42
|
-
::I18n.with_options({ :
|
69
|
+
::I18n.with_options({ scope: :'datetime.distance_in_words' }) do |locale|
|
43
70
|
|
44
71
|
case distance_in_minutes
|
45
72
|
when 0..1
|
46
73
|
return distance_in_minutes == 0 ?
|
47
|
-
locale.t(:less_than_x_minutes, :
|
48
|
-
locale.t(:x_minutes, :
|
74
|
+
locale.t(:less_than_x_minutes, count: 1) :
|
75
|
+
locale.t(:x_minutes, count: distance_in_minutes) unless include_seconds
|
49
76
|
|
50
77
|
case distance_in_seconds
|
51
|
-
when 0..4 then locale.t :less_than_x_seconds, :
|
52
|
-
when 5..9 then locale.t :less_than_x_seconds, :
|
53
|
-
when 10..19 then locale.t :less_than_x_seconds, :
|
78
|
+
when 0..4 then locale.t :less_than_x_seconds, count: 5
|
79
|
+
when 5..9 then locale.t :less_than_x_seconds, count: 10
|
80
|
+
when 10..19 then locale.t :less_than_x_seconds, count: 20
|
54
81
|
when 20..39 then locale.t :half_a_minute
|
55
|
-
when 40..59 then locale.t :less_than_x_minutes, :
|
56
|
-
else locale.t :x_minutes, :
|
82
|
+
when 40..59 then locale.t :less_than_x_minutes, count: 1
|
83
|
+
else locale.t :x_minutes, count: 1
|
57
84
|
end
|
58
85
|
|
59
|
-
when 2..44 then locale.t :x_minutes, :
|
60
|
-
when 45..89 then locale.t :about_x_hours, :
|
61
|
-
when 90..1439 then locale.t :about_x_hours, :
|
62
|
-
when 1440..2519 then locale.t :x_days, :
|
63
|
-
when 2520..43199 then locale.t :x_days, :
|
64
|
-
when 43200..86399 then locale.t :about_x_months, :
|
65
|
-
when 86400..525599 then locale.t :x_months, :
|
86
|
+
when 2..44 then locale.t :x_minutes, count: distance_in_minutes
|
87
|
+
when 45..89 then locale.t :about_x_hours, count: 1
|
88
|
+
when 90..1439 then locale.t :about_x_hours, count: (distance_in_minutes.to_f / 60.0).round
|
89
|
+
when 1440..2519 then locale.t :x_days, count: 1
|
90
|
+
when 2520..43199 then locale.t :x_days, count: (distance_in_minutes.to_f / 1440.0).round
|
91
|
+
when 43200..86399 then locale.t :about_x_months, count: 1
|
92
|
+
when 86400..525599 then locale.t :x_months, count: (distance_in_minutes.to_f / 43200.0).round
|
66
93
|
else
|
67
94
|
fyear = from_time.year
|
68
95
|
fyear += 1 if from_time.month >= 3
|
@@ -79,16 +106,27 @@ module Locomotive
|
|
79
106
|
remainder = (minutes_with_offset % 525600)
|
80
107
|
distance_in_years = (minutes_with_offset / 525600)
|
81
108
|
if remainder < 131400
|
82
|
-
locale.t(:about_x_years, :
|
109
|
+
locale.t(:about_x_years, count: distance_in_years)
|
83
110
|
elsif remainder < 394200
|
84
|
-
locale.t(:over_x_years, :
|
111
|
+
locale.t(:over_x_years, count: distance_in_years)
|
85
112
|
else
|
86
|
-
locale.t(:almost_x_years, :
|
113
|
+
locale.t(:almost_x_years, count: distance_in_years + 1)
|
87
114
|
end
|
88
115
|
end
|
89
116
|
end
|
90
117
|
end
|
91
118
|
|
119
|
+
private
|
120
|
+
|
121
|
+
def to_time(input)
|
122
|
+
case input
|
123
|
+
when Date then input.to_time
|
124
|
+
when String then Time.zone.parse(input)
|
125
|
+
else
|
126
|
+
input
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
92
130
|
end
|
93
131
|
|
94
132
|
::Liquid::Template.register_filter(Date)
|
@@ -23,11 +23,13 @@ module Locomotive
|
|
23
23
|
def stylesheet_url(input)
|
24
24
|
return '' if input.nil?
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
if input =~ /^https?:/
|
27
|
+
input
|
28
|
+
else
|
29
|
+
input = "/stylesheets/#{input}" unless input =~ /^\//
|
30
|
+
input = "#{input}.css" unless input.ends_with?('.css')
|
31
|
+
input
|
32
|
+
end
|
31
33
|
end
|
32
34
|
|
33
35
|
# Write the link to a stylesheet resource
|
@@ -22,6 +22,23 @@ module Locomotive
|
|
22
22
|
rand(input.to_i)
|
23
23
|
end
|
24
24
|
|
25
|
+
# map/collect on a given property (support to_f, to_i)
|
26
|
+
def map(input, property)
|
27
|
+
flatten_if_necessary(input).map do |e|
|
28
|
+
e = e.call if e.is_a?(Proc)
|
29
|
+
|
30
|
+
if property == "to_liquid"
|
31
|
+
e
|
32
|
+
elsif property == "to_f"
|
33
|
+
e.to_f
|
34
|
+
elsif property == "to_i"
|
35
|
+
e.to_i
|
36
|
+
elsif e.respond_to?(:[])
|
37
|
+
e[property]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
25
42
|
end
|
26
43
|
|
27
44
|
::Liquid::Template.register_filter(Misc)
|