locomotivecms_mounter 1.2.7 → 1.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7821d05f00c3bf1b11108d55d65465df1226a4e0
4
- data.tar.gz: e4c71a13f4c029c35ec539c12a487c4a693c96b7
3
+ metadata.gz: a544f668acb9f469e36dbbc2481f94ca5be4e6b2
4
+ data.tar.gz: 2435a7ca2b750f20afbcafe77b5238b31090dbcf
5
5
  SHA512:
6
- metadata.gz: e45de803e79045ad5b23d0656d55005b45ae10ff5deddd974cdc9e0f8c3962a65be612621e3b9faf275bcd6840123f5ad004d756cc9a9ac563d6dd754af77641
7
- data.tar.gz: 6cdf03153e9c1094c064bd9289d4b2cbdfe70ad1d05efdc0dd222a13365ef81d75d9ba3d60a35edad55e91118a3272296035a122dbd15b2db60ce3f6421e069c
6
+ metadata.gz: 5e24cb2022d27e11b981eb7e3b7c2c62786f562fb16fe71a8a5707e4d51e22b02b5c821f048c899727ef91919d495035eea36b55c3ba08b924aa61ab89ca16d7
7
+ data.tar.gz: 0f86671a344ac51f294eae9db59a04fabe5a6d2a0947dde51cb20be3b602dfe1f76d0948ff95dfb5eb24e8faa2b89273ec518c849f68391e1a9cd27b83a8504a
@@ -88,7 +88,7 @@ module Locomotive
88
88
 
89
89
  value = value.values.first if value.size == 1
90
90
 
91
- value = nil if value.empty?
91
+ value = nil if value.respond_to?(:empty?) && value.empty?
92
92
 
93
93
  _attributes[name] = value
94
94
  else
@@ -334,16 +334,16 @@ module Locomotive
334
334
  field = self.content_type.find_field(field)
335
335
  end
336
336
 
337
+ return nil if field.nil?
338
+
337
339
  value = (self.dynamic_attributes || {})[field.name.to_sym]
338
340
 
339
- # puts "[#{field.name.inspect}] #{value.inspect} / #{field.localized.inspect} / #{value.is_a?(Hash).inspect}"
341
+ # DEBUG puts "[#{field.name.inspect}] #{value.inspect} / #{field.localized.inspect} / #{value.is_a?(Hash).inspect}"
340
342
 
341
343
  if !field.is_relationship? && field.localized && value.is_a?(Hash)
342
344
  # get the localized value for the current locale
343
345
  _value = value[Locomotive::Mounter.locale]
344
346
 
345
- # puts "[#{field.name}] _value = #{value.inspect} / current #{Locomotive::Mounter.locale.inspect} / main #{self.main_locale.inspect}"
346
-
347
347
  # no value for the current locale, give a try to the main one
348
348
  if _value.nil? && Locomotive::Mounter.locale != self.main_locale
349
349
  _value = value[self.main_locale]
@@ -352,7 +352,7 @@ module Locomotive
352
352
  value = _value
353
353
  end
354
354
 
355
- value #.tap { |v| puts "[#{field.name}] returning #{v.inspect}" }
355
+ value # DEBUG .tap { |v| puts "[#{field.name}] returning #{v.inspect}" }
356
356
  end
357
357
 
358
358
  end
@@ -53,6 +53,25 @@ module Locomotive
53
53
  %w(belongs_to has_many many_to_many).include?(self.type.to_s)
54
54
  end
55
55
 
56
+ # Tell if the id, the name of the field or other property based on
57
+ # its name (like formatted_<date field>) matches the parameter.
58
+ #
59
+ # @param [ String / Symbol] name_or_id Name or Id of the field
60
+ #
61
+ # @return [ Boolean ] True if the current field matches the parameter
62
+ #
63
+ def matches?(id_or_name)
64
+ default = [self._id, self.name]
65
+
66
+ list = default + (case self.type.to_sym
67
+ when :date, :date_time then ["formatted_#{self.name}"]
68
+ else
69
+ []
70
+ end)
71
+
72
+ list.include?(id_or_name.to_s)
73
+ end
74
+
56
75
  # Return the content type matching the class_name / target attribute
57
76
  #
58
77
  # @return [ Object ] The matching Content Type
@@ -49,6 +49,14 @@ module Locomotive
49
49
  self.find_field(self.group_by_field_name)
50
50
  end
51
51
 
52
+ # Return the order_by field
53
+ #
54
+ # @return [ Object ] The order_by field
55
+ #
56
+ def order_by_field
57
+ self.find_field(self.order_by)
58
+ end
59
+
52
60
  # Build a content entry and add it to the list of entries of the content type.
53
61
  # The content type will be referenced into the newly built entry .
54
62
  #
@@ -68,8 +76,10 @@ module Locomotive
68
76
 
69
77
  if field.nil? && v.is_a?(Hash) # not a dynamic field but localized (permalink ?)
70
78
  entry.send(:"#{k}_translations=", v)
71
- else
79
+ elsif field.nil?
72
80
  entry.send(:"#{k}=", v)
81
+ else
82
+ entry.send(:"#{field.name}=", v)
73
83
  end
74
84
  rescue NoMethodError => e
75
85
  Mounter.logger.error e.backtrace
@@ -117,7 +127,7 @@ module Locomotive
117
127
  # @return [ Object ] The field if it exists or nil
118
128
  #
119
129
  def find_field(name_or_id)
120
- self.fields.detect { |field| field.name.to_s == name_or_id.to_s || field._id == name_or_id }
130
+ self.fields.detect { |field| field.matches?(name_or_id) }
121
131
  end
122
132
 
123
133
  # Find a content entry by its ids (ie: _permalink or _label)
@@ -192,6 +202,10 @@ module Locomotive
192
202
  # group by
193
203
  _attributes['group_by'] = self.group_by_field.name if self.group_by_field
194
204
 
205
+ # order by
206
+ _attributes['order_by'] = self.order_by_field.name if self.order_by_field
207
+ _attributes['order_by'] = 'manually' if self.order_by == '_position'
208
+
195
209
  # custom fields
196
210
  _attributes['fields'] = self.fields
197
211
 
@@ -31,6 +31,9 @@ module Locomotive
31
31
  ## other accessors ##
32
32
  attr_accessor :content_type_id, :content_entry, :parent_id, :children, :templatized_from_parent
33
33
 
34
+ ## path to the file of the template (if mounted from a FS) ##
35
+ attr_accessor :filepath
36
+
34
37
  ## aliases ##
35
38
  alias :listed? :listed
36
39
  alias :published? :published
@@ -150,7 +153,7 @@ module Locomotive
150
153
  self.depth * 100 + (self.position || 100)
151
154
  end
152
155
 
153
- # A layout is a page which the template does
156
+ # A layout is a page whose the template does
154
157
  # not include the extend keyword.
155
158
  # If the template is blank then, it is not considered as a layout
156
159
  #
@@ -317,12 +320,7 @@ module Locomotive
317
320
  if @source[Locomotive::Mounter.locale]
318
321
  @source[Locomotive::Mounter.locale] # memoization
319
322
  elsif self.template
320
- if self.template.is_a?(Exception) # comes from the parsing
321
- # we do not know how to render the page so rethrow the exception
322
- raise self.template
323
- end
324
- source = self.template.need_for_prerendering? ? self.template.render : self.template.data
325
- @source[Locomotive::Mounter.locale] = source
323
+ @source[Locomotive::Mounter.locale] = self.template.source
326
324
  else
327
325
  nil
328
326
  end
@@ -421,12 +419,12 @@ module Locomotive
421
419
  # If a template is invalid, it is not considered as a
422
420
  # blank one.
423
421
  #
424
- # @param [ Object ] template The template to test (Tilt)
422
+ # @param [ PageTemplate ] template The template to test
425
423
  #
426
424
  # @return [ Boolean ] True if the template is strictly blank
427
425
  #
428
426
  def template_blank?(template)
429
- template.nil? || (!template.is_a?(Exception) && template.data.strip.blank?)
427
+ template.nil? || template.raw_source.strip.blank?
430
428
  end
431
429
 
432
430
  end
@@ -13,19 +13,16 @@ module Locomotive
13
13
  ## methods ##
14
14
 
15
15
  # Return the Liquid template based on the template_filepath property
16
- # of the snippet. If the template is HAML or SLIM, then a pre-rendering to Liquid is done.
16
+ # of the snippet. If the template is HAML, then a pre-rendering to Liquid is done.
17
17
  #
18
18
  # @return [ String ] The liquid template
19
19
  #
20
20
  def source
21
21
  @source ||= {}
22
22
 
23
- source = if self.template.respond_to?(:need_for_prerendering?)
24
- # must be a tilt template with or without prerendering
25
- self.template.need_for_prerendering? ? self.template.render : self.template.data
26
- elsif self.template.is_a?(Exception) # comes from the parsing
27
- # we do not know how to render the page so rethrow the exception
28
- raise self.template
23
+ source = if self.template.respond_to?(:source)
24
+ # liquid or haml file
25
+ self.template.source
29
26
  else
30
27
  # simple string
31
28
  self.template
@@ -24,6 +24,9 @@ module Locomotive
24
24
  end
25
25
  end
26
26
  end
27
+
28
+ # set the time zone for the next Time operations (UTC by default)
29
+ Time.zone = ActiveSupport::TimeZone.new(site.timezone || 'UTC')
27
30
  end
28
31
  end
29
32
 
@@ -28,7 +28,7 @@ module Locomotive
28
28
  page.translated_in.each do |locale|
29
29
  Locomotive::Mounter.with_locale(locale) do
30
30
  unless page.template.blank?
31
- self.add_assets_from_string(page.source)
31
+ self.add_assets_from_string(page.template.raw_source)
32
32
  end
33
33
  end
34
34
  end
@@ -69,16 +69,12 @@ module Locomotive
69
69
 
70
70
  # Record pages found in file system
71
71
  def fetch
72
- folders = []
73
-
74
72
  Dir.glob(File.join(self.root_dir, '**/*')).each do |filepath|
75
- fullpath = self.filepath_to_fullpath(filepath)
76
-
77
- folders.push(fullpath) && next if File.directory?(filepath)
73
+ next unless File.directory?(filepath) || filepath =~ /\.(#{Locomotive::Mounter::TEMPLATE_EXTENSIONS.join('|')})$/
78
74
 
79
- next unless filepath =~ /\.(#{Locomotive::Mounter::TEMPLATE_EXTENSIONS.join('|')})$/
75
+ page = self.add(filepath)
80
76
 
81
- page = self.add(fullpath)
77
+ next if File.directory?(filepath) || page.nil?
82
78
 
83
79
  if locale = self.filepath_locale(filepath)
84
80
  Locomotive::Mounter.with_locale(locale) do
@@ -88,28 +84,26 @@ module Locomotive
88
84
  Locomotive::Mounter.logger.warn "Unknown locale in the '#{File.basename(filepath)}' file."
89
85
  end
90
86
  end
91
-
92
- folders.each do |fullpath|
93
- next if self.pages.key?(fullpath)
94
- self.add(fullpath)
95
- end
96
87
  end
97
88
 
98
89
  # Add a new page in the global hash of pages.
99
- # If the page exists, then do nothing.
90
+ # If the page exists, override it.
100
91
  #
101
- # @param [ String ] fullpath The fullpath used as the key for the hash
92
+ # @param [ String ] filepath The path of the template
102
93
  # @param [ Hash ] attributes The attributes of the new page
103
94
  #
104
95
  # @return [ Object ] A newly created page or the existing one
105
96
  #
106
- def add(fullpath, attributes = {})
97
+ def add(filepath, attributes = {})
98
+ fullpath = self.filepath_to_fullpath(filepath)
99
+
107
100
  unless self.pages.key?(fullpath)
108
101
  attributes[:title] = File.basename(fullpath).humanize
109
102
  attributes[:fullpath] = fullpath
110
103
 
111
104
  page = Locomotive::Mounter::Models::Page.new(attributes)
112
105
  page.mounting_point = self.mounting_point
106
+ page.filepath = File.expand_path(filepath)
113
107
 
114
108
  self.pages[fullpath] = page
115
109
  end
@@ -125,16 +119,9 @@ module Locomotive
125
119
  # @param [ String ] filepath The path of the template
126
120
  #
127
121
  def set_attributes_from_header(page, filepath)
128
- begin
129
- template = Tilt.new(filepath)
130
- rescue Haml::SyntaxError => e
131
- Locomotive::Mounter.logger.warn "Invalid page template (#{filepath}): #{e.message}"
132
- template = e
133
- end
134
-
135
- if template.respond_to?(:attributes)
136
- return if template.attributes.blank?
122
+ template = Locomotive::Mounter::Utils::YAMLFrontMattersTemplate.new(filepath)
137
123
 
124
+ if template.attributes
138
125
  attributes = template.attributes.clone
139
126
 
140
127
  # set the editable elements
@@ -201,7 +188,7 @@ module Locomotive
201
188
  def to_s(page = nil)
202
189
  page ||= self.pages['index']
203
190
 
204
- puts "#{" " * (page.try(:depth) + 1)} #{page.fullpath.inspect} (#{page.title}, position=#{page.position})"
191
+ puts "#{" " * (page.try(:depth) + 1)} #{page.fullpath.inspect} (#{page.title}, position=#{page.position}, template=#{page.template_translations.keys.inspect})"
205
192
 
206
193
  (page.children || []).each { |child| self.to_s(child) }
207
194
  end
@@ -13,7 +13,10 @@ module Locomotive
13
13
  # set the default locale first
14
14
  Locomotive::Mounter.locale = site['locales'].first.to_sym rescue Locomotive::Mounter.locale
15
15
 
16
- Locomotive::Mounter::Models::Site.new(site)
16
+ Locomotive::Mounter::Models::Site.new(site).tap do |_site|
17
+ # set the time zone for the next Time operations (UTC by default)
18
+ Time.zone = ActiveSupport::TimeZone.new(_site.timezone || 'UTC')
19
+ end
17
20
  end
18
21
 
19
22
  end
@@ -40,7 +40,7 @@ module Locomotive
40
40
  self.items.values.each do |snippet|
41
41
  default_template = snippet.template
42
42
 
43
- next if !default_template.is_a?(Exception) && default_template.blank?
43
+ next if default_template.blank?
44
44
 
45
45
  self.locales.map(&:to_sym).each do |locale|
46
46
  next if locale == self.default_locale
@@ -104,11 +104,7 @@ module Locomotive
104
104
  # @return [ Object ] The Tilt template or the exception itself if the template is invalid
105
105
  #
106
106
  def fetch_template(filepath)
107
- begin
108
- Tilt.new(filepath)
109
- rescue Haml::SyntaxError => e
110
- e
111
- end
107
+ Locomotive::Mounter::Utils::YAMLFrontMattersTemplate.new(filepath)
112
108
  end
113
109
 
114
110
  end
@@ -39,8 +39,11 @@ module Locomotive
39
39
  def list
40
40
  return @list unless @list.nil?
41
41
 
42
+ # Follows symlinks and makes sure subdirectories are handled
43
+ glob_pattern = '**/*/**/*'
44
+
42
45
  @list = [].tap do |list|
43
- Dir.glob(File.join(self.root_dir, '**/*')).each do |file|
46
+ Dir.glob(File.join(self.root_dir, glob_pattern)).each do |file|
44
47
  next if self.exclude?(file)
45
48
 
46
49
  folder = File.dirname(file.gsub("#{self.root_dir}/", ''))
@@ -0,0 +1,45 @@
1
+ module Locomotive
2
+ module Mounter
3
+ module Utils
4
+
5
+ # YAML Front-matters for HAML/Liquid templates
6
+ class YAMLFrontMattersTemplate
7
+
8
+ attr_accessor :filepath, :attributes, :raw_source, :line_offset
9
+
10
+ def initialize(filepath)
11
+ self.filepath = filepath
12
+ self.line_offset = 0
13
+
14
+ self.fetch_attributes_and_raw_source(File.read(self.filepath))
15
+ end
16
+
17
+ def source
18
+ return @source if @source
19
+
20
+ @source = if self.filepath.ends_with?('.haml')
21
+ Haml::Engine.new(self.raw_source).render
22
+ else
23
+ self.raw_source
24
+ end
25
+ end
26
+
27
+ protected
28
+
29
+ def fetch_attributes_and_raw_source(data)
30
+ if data =~ /^(---\s*\n.*?\n?)^(---\s*$\n?)(.*)/m
31
+ self.line_offset = $1.count("\n") + 1
32
+ self.attributes = YAML.load($1)
33
+ self.raw_source = $3
34
+ else
35
+ self.attributes = nil
36
+ self.raw_source = data
37
+ end
38
+
39
+ self.raw_source = self.raw_source.force_encoding('utf-8')
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
@@ -2,7 +2,7 @@
2
2
  module Locomotive
3
3
  module Mounter #:nodoc
4
4
 
5
- VERSION = '1.2.7'
5
+ VERSION = '1.3.0'
6
6
 
7
7
  end
8
8
  end
@@ -27,6 +27,7 @@ require 'locomotive/mounter/utils/hash'
27
27
  require 'locomotive/mounter/utils/yaml'
28
28
  require 'locomotive/mounter/utils/string'
29
29
  require 'locomotive/mounter/utils/output'
30
+ require 'locomotive/mounter/utils/yaml_front_matters_template'
30
31
 
31
32
  # Main
32
33
  require 'locomotive/mounter/version'
@@ -40,10 +41,7 @@ require 'locomotive/mounter/engine_api'
40
41
  require 'locomotive/mounter/extensions/httmultiparty'
41
42
  require 'locomotive/mounter/extensions/sprockets'
42
43
  require 'locomotive/mounter/extensions/compass'
43
- require 'locomotive/mounter/extensions/tilt/template'
44
44
  require 'locomotive/mounter/extensions/tilt/css'
45
- require 'locomotive/mounter/extensions/tilt/haml'
46
- require 'locomotive/mounter/extensions/tilt/liquid'
47
45
 
48
46
  # Models
49
47
  require 'locomotive/mounter/models/base'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: locomotivecms_mounter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.7
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Didier Lafforgue
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-17 00:00:00.000000000 Z
11
+ date: 2013-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tilt
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ~>
137
137
  - !ruby/object:Gem::Version
138
138
  version: 4.2.3
139
+ - !ruby/object:Gem::Dependency
140
+ name: tzinfo
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: 1.0.1
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: 1.0.1
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: chronic
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -417,9 +431,6 @@ files:
417
431
  - lib/locomotive/mounter/extensions/httmultiparty.rb
418
432
  - lib/locomotive/mounter/extensions/sprockets.rb
419
433
  - lib/locomotive/mounter/extensions/tilt/css.rb
420
- - lib/locomotive/mounter/extensions/tilt/haml.rb
421
- - lib/locomotive/mounter/extensions/tilt/liquid.rb
422
- - lib/locomotive/mounter/extensions/tilt/template.rb
423
434
  - lib/locomotive/mounter/fields.rb
424
435
  - lib/locomotive/mounter/models/base.rb
425
436
  - lib/locomotive/mounter/models/content_asset.rb
@@ -459,6 +470,7 @@ files:
459
470
  - lib/locomotive/mounter/utils/output.rb
460
471
  - lib/locomotive/mounter/utils/string.rb
461
472
  - lib/locomotive/mounter/utils/yaml.rb
473
+ - lib/locomotive/mounter/utils/yaml_front_matters_template.rb
462
474
  - lib/locomotive/mounter/version.rb
463
475
  - lib/locomotive/mounter/writer/api/base.rb
464
476
  - lib/locomotive/mounter/writer/api/content_assets_writer.rb
@@ -1,37 +0,0 @@
1
- module Tilt
2
-
3
- # YAML Front-matters for HAML templates
4
- class YamlFrontMattersHamlTemplate < HamlTemplate
5
-
6
- # Attributes from YAML Front-matters header
7
- attr_reader :attributes
8
-
9
- def need_for_prerendering?
10
- true
11
- end
12
-
13
- def prepare
14
- if data =~ /^(---\s*\n.*?\n?)^(---\s*$\n?)(.*)/m
15
- @attributes = YAML.load($1)
16
- @data = $3
17
- end
18
- @data = @data.force_encoding('utf-8')
19
- begin
20
- super
21
- rescue Haml::SyntaxError => e
22
- # invalid haml so re-throw the exception but with keeping track of the attributes
23
- e.attributes = @attributes
24
- raise e
25
- end
26
- end
27
-
28
- end
29
-
30
- Tilt.register 'haml', YamlFrontMattersHamlTemplate
31
- Tilt.prefer YamlFrontMattersHamlTemplate
32
-
33
- end
34
-
35
- class ::Haml::SyntaxError
36
- attr_accessor :attributes
37
- end
@@ -1,23 +0,0 @@
1
- module Tilt
2
-
3
- # YAML Front-matters for Liquid templates
4
- class YamlFrontMattersLiquidTemplate < Template
5
-
6
- # Attributes from YAML Front-matters header
7
- attr_reader :attributes
8
-
9
- def prepare
10
- if data =~ /^(---\s*\n.*?\n?)^(---\s*$\n?)(.*)/m
11
- @attributes = YAML.load($1)
12
- @data = $3
13
- end
14
- @data = @data.force_encoding('utf-8')
15
- # Note: do not call 'super' because we are going to use a different parse mechanism
16
- end
17
-
18
- end
19
-
20
- Tilt.register 'liquid', YamlFrontMattersLiquidTemplate
21
- Tilt.prefer YamlFrontMattersLiquidTemplate
22
-
23
- end
@@ -1,11 +0,0 @@
1
- module Tilt
2
-
3
- class Template
4
-
5
- def need_for_prerendering?
6
- false
7
- end
8
-
9
- end
10
-
11
- end