locomotivecms_mounter 1.0.4 → 1.1.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 +15 -0
- data/lib/locomotive/mounter/engine_api.rb +20 -8
- data/lib/locomotive/mounter/models/content_entry.rb +11 -6
- data/lib/locomotive/mounter/models/content_field.rb +39 -10
- data/lib/locomotive/mounter/models/content_type.rb +29 -2
- data/lib/locomotive/mounter/models/page.rb +8 -5
- data/lib/locomotive/mounter/models/translation.rb +1 -1
- data/lib/locomotive/mounter/reader/api/base.rb +54 -33
- data/lib/locomotive/mounter/reader/api/content_assets_reader.rb +3 -3
- data/lib/locomotive/mounter/reader/api/content_entries_reader.rb +24 -3
- data/lib/locomotive/mounter/reader/api/content_types_reader.rb +1 -1
- data/lib/locomotive/mounter/reader/api/pages_reader.rb +7 -2
- data/lib/locomotive/mounter/reader/api/theme_assets_reader.rb +2 -2
- data/lib/locomotive/mounter/reader/api/translations_reader.rb +2 -2
- data/lib/locomotive/mounter/reader/api.rb +12 -9
- data/lib/locomotive/mounter/reader/file_system/content_assets_reader.rb +2 -2
- data/lib/locomotive/mounter/version.rb +1 -1
- data/lib/locomotive/mounter/writer/api/base.rb +10 -2
- data/lib/locomotive/mounter/writer/api/theme_assets_writer.rb +29 -24
- data/lib/locomotive/mounter/writer/api/translations_writer.rb +6 -1
- data/lib/locomotive/mounter/writer/api.rb +3 -8
- data/lib/locomotive/mounter/writer/file_system/content_assets_writer.rb +2 -2
- data/lib/locomotive/mounter/writer/file_system/content_entries_writer.rb +0 -1
- data/lib/locomotive/mounter/writer/file_system/translations_writer.rb +2 -2
- data/lib/locomotive/mounter/writer/file_system.rb +1 -1
- metadata +9 -64
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
M2M1YjM0MTBkNjA5MmRiZmIyNzUyMTEyNjY1ZDE2M2MwMzg1NDk5OQ==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
ZDA2MzhmMzA3NTdjZDIxNTk3ZmVmNDIzN2M1ZTAwNzNlMmVkNDI2ZQ==
|
|
7
|
+
!binary "U0hBNTEy":
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
ZTRjOGE0OTBiNWEyYzM4Yjg2OGFkMjg2YjZmNGY0MDQ2ZGUxMmM5ZmFmODIz
|
|
10
|
+
MzFiMDU2MzExODE2OGE2NmYyZGMyYjU3MmM4NzhkNjMxODFjOGRkN2FjZmJl
|
|
11
|
+
NjdiNzllNWQzNzBkMDkzNzU4OGZkNjk4NjY5YzE5MDg4YTc4YjM=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
M2UzZjczZWIxYjMxYmM0OTA1ZDAwYWYxNzVhMDFmYTYwZWQxMDNlMzA0M2M3
|
|
14
|
+
MGVmZDAzMDI4MmRmYTgzZTY0OWNmNjU2NWZkMzI3YTVkOGIxOTkzZWU2ZmZl
|
|
15
|
+
OTQyZjkxYzNlM2RmYTkxMDQyODA1NzQ2ZDhiNWQ0OWUzNTVkNWE=
|
|
@@ -11,20 +11,16 @@ module Locomotive
|
|
|
11
11
|
# this class. It raises an exception if the operation fails.
|
|
12
12
|
# Example of the base uri: locomotivecms.com, nocoffee.fr.
|
|
13
13
|
#
|
|
14
|
-
# @param [ Hash / Array ] *args A hash or parameters in that order: uri, email, password
|
|
14
|
+
# @param [ Hash / Array ] *args A hash or parameters in that order: uri, email, password or uri, api_key
|
|
15
15
|
#
|
|
16
16
|
# @return [ String ] The new token
|
|
17
17
|
#
|
|
18
18
|
def self.set_token(*args)
|
|
19
|
-
|
|
20
|
-
[args.first[:uri], args.first[:email], args.first[:password]]
|
|
21
|
-
else
|
|
22
|
-
[*args]
|
|
23
|
-
end)
|
|
19
|
+
_credentials = self.credentials(args)
|
|
24
20
|
|
|
25
|
-
self.base_uri uri
|
|
21
|
+
self.base_uri _credentials.delete(:uri)
|
|
26
22
|
|
|
27
|
-
response = post('/tokens.json', body: { email: email, password: password })
|
|
23
|
+
response = post('/tokens.json', body: _credentials) #{ email: email, password: password })
|
|
28
24
|
|
|
29
25
|
if response.code < 400
|
|
30
26
|
self.default_params auth_token: response['token']
|
|
@@ -39,6 +35,22 @@ module Locomotive
|
|
|
39
35
|
Locomotive::Mounter::EngineApi.default_options[:default_params] = {}
|
|
40
36
|
end
|
|
41
37
|
|
|
38
|
+
protected
|
|
39
|
+
|
|
40
|
+
def self.credentials(args)
|
|
41
|
+
if args.first.is_a?(Hash)
|
|
42
|
+
args.first
|
|
43
|
+
elsif args.size == 3
|
|
44
|
+
# uri, email, password
|
|
45
|
+
{ uri: args[0], email: args[1], password: args[2] }
|
|
46
|
+
elsif args.size == 2
|
|
47
|
+
# uri, api_key
|
|
48
|
+
{ uri: args[0], api_key: args[1] }
|
|
49
|
+
else
|
|
50
|
+
{}
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
42
54
|
end
|
|
43
55
|
|
|
44
56
|
end
|
|
@@ -117,8 +117,6 @@ module Locomotive
|
|
|
117
117
|
value = self.localized_dynamic_attribute_value(field)
|
|
118
118
|
|
|
119
119
|
case field.type
|
|
120
|
-
when :string, :text, :select, :boolean, :category
|
|
121
|
-
value
|
|
122
120
|
when :date
|
|
123
121
|
value.is_a?(String) ? Date.parse(value) : value
|
|
124
122
|
when :file
|
|
@@ -129,6 +127,9 @@ module Locomotive
|
|
|
129
127
|
field.klass.find_entries_by(field.inverse_of, [self._label, self._permalink])
|
|
130
128
|
when :many_to_many
|
|
131
129
|
field.klass.find_entries_among(value)
|
|
130
|
+
else
|
|
131
|
+
# :string, :text, :select, :boolean, :email, :integer, :float, :tags
|
|
132
|
+
value
|
|
132
133
|
end
|
|
133
134
|
end
|
|
134
135
|
|
|
@@ -172,7 +173,7 @@ module Locomotive
|
|
|
172
173
|
end
|
|
173
174
|
end
|
|
174
175
|
|
|
175
|
-
#
|
|
176
|
+
# Return a hash with the label_field value as the key and the other fields as the value
|
|
176
177
|
#
|
|
177
178
|
# @param [ Boolean ] nested True to have a hash of hash (whose key is the label)
|
|
178
179
|
#
|
|
@@ -191,10 +192,14 @@ module Locomotive
|
|
|
191
192
|
# no need of the translation of the field name in the current locale
|
|
192
193
|
label_field = self.content_type.label_field
|
|
193
194
|
|
|
194
|
-
if label_field.localized
|
|
195
|
-
hash[label_field.name].
|
|
195
|
+
if label_field.localized
|
|
196
|
+
if !hash[label_field.name].empty?
|
|
197
|
+
hash[label_field.name].delete(Locomotive::Mounter.locale.to_s)
|
|
196
198
|
|
|
197
|
-
|
|
199
|
+
hash.delete(label_field.name) if hash[label_field.name].empty?
|
|
200
|
+
end
|
|
201
|
+
else
|
|
202
|
+
hash.delete(label_field.name)
|
|
198
203
|
end
|
|
199
204
|
|
|
200
205
|
nested ? { self._label => hash } : hash
|
|
@@ -75,16 +75,6 @@ module Locomotive
|
|
|
75
75
|
self.select_options.detect { |option| option.name.to_s == name_or_id.to_s || option._id == name_or_id }
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
-
# Instead of returning a simple hash, it returns a hash with name as the key and
|
|
79
|
-
# the remaining attributes as the value.
|
|
80
|
-
#
|
|
81
|
-
# @return [ Hash ] A hash of hash
|
|
82
|
-
#
|
|
83
|
-
def to_hash
|
|
84
|
-
hash = super.delete_if { |k, v| %w(name position).include?(k) }
|
|
85
|
-
{ self.name => hash }
|
|
86
|
-
end
|
|
87
|
-
|
|
88
78
|
# Return the params used for the API.
|
|
89
79
|
#
|
|
90
80
|
# @return [ Hash ] The params
|
|
@@ -112,6 +102,28 @@ module Locomotive
|
|
|
112
102
|
params
|
|
113
103
|
end
|
|
114
104
|
|
|
105
|
+
# Instead of returning a simple hash, it returns a hash with name as the key and
|
|
106
|
+
# the remaining attributes as the value.
|
|
107
|
+
#
|
|
108
|
+
# @return [ Hash ] A hash of hash
|
|
109
|
+
#
|
|
110
|
+
def to_hash
|
|
111
|
+
hash = super.delete_if { |k, v| %w(name position).include?(k) }
|
|
112
|
+
|
|
113
|
+
# class_name is chosen over class_slug
|
|
114
|
+
if self.is_relationship?
|
|
115
|
+
hash['class_name'] ||= hash['class_slug']
|
|
116
|
+
hash.delete('class_slug')
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# select options
|
|
120
|
+
if self.type == :select
|
|
121
|
+
hash['select_options'] = self.select_options_to_hash
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
{ self.name => hash }
|
|
125
|
+
end
|
|
126
|
+
|
|
115
127
|
protected
|
|
116
128
|
|
|
117
129
|
# Clean up useless properties depending on its type
|
|
@@ -123,6 +135,23 @@ module Locomotive
|
|
|
123
135
|
self.text_formatting = nil unless self.type == :text
|
|
124
136
|
end
|
|
125
137
|
|
|
138
|
+
def select_options_to_hash
|
|
139
|
+
locales = self.select_options.map { |option| option.translated_in }.flatten.uniq
|
|
140
|
+
options = self.select_options.sort { |a, b| a.position <=> b.position }
|
|
141
|
+
|
|
142
|
+
if locales.size > 1
|
|
143
|
+
{}.tap do |by_locales|
|
|
144
|
+
locales.each do |locale|
|
|
145
|
+
options.each do |option|
|
|
146
|
+
(by_locales[locale.to_s] ||= []) << option.name_translations[locale]
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
else
|
|
151
|
+
options.map(&:name)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
126
155
|
end
|
|
127
156
|
|
|
128
157
|
end
|
|
@@ -46,7 +46,7 @@ module Locomotive
|
|
|
46
46
|
# @return [ Object ] The group_by field
|
|
47
47
|
#
|
|
48
48
|
def group_by_field
|
|
49
|
-
self.
|
|
49
|
+
self.find_field(self.group_by_field_name)
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
# Build a content entry and add it to the list of entries of the content type.
|
|
@@ -102,6 +102,14 @@ module Locomotive
|
|
|
102
102
|
self.fields.select { |field| !field.is_relationship? }
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
+
# Return the list of file fields.
|
|
106
|
+
#
|
|
107
|
+
# @return [ Array ] The list of file fields.
|
|
108
|
+
#
|
|
109
|
+
def file_fields
|
|
110
|
+
self.fields.select { |field| field.type == :file }
|
|
111
|
+
end
|
|
112
|
+
|
|
105
113
|
# Find a field by its name (string or symbol) or its id (API)
|
|
106
114
|
#
|
|
107
115
|
# @param [ String / Symbol] name_or_id Name or Id of the field
|
|
@@ -171,6 +179,25 @@ module Locomotive
|
|
|
171
179
|
params
|
|
172
180
|
end
|
|
173
181
|
|
|
182
|
+
# Return a hash with sanitized attributes. It will be used to generate
|
|
183
|
+
# the corresponding yaml file.
|
|
184
|
+
#
|
|
185
|
+
# @return [ Hash ] A hash used by the to_yaml method
|
|
186
|
+
#
|
|
187
|
+
def to_hash
|
|
188
|
+
fields = %w(name slug description label_field_name order_by order_by_direction public_submission_enabled public_submission_accounts raw_item_template)
|
|
189
|
+
|
|
190
|
+
_attributes = self.attributes.delete_if { |k, v| !fields.include?(k.to_s) || v.blank? }.deep_stringify_keys
|
|
191
|
+
|
|
192
|
+
# group by
|
|
193
|
+
_attributes['group_by'] = self.group_by_field.name if self.group_by_field
|
|
194
|
+
|
|
195
|
+
# custom fields
|
|
196
|
+
_attributes['fields'] = self.fields
|
|
197
|
+
|
|
198
|
+
_attributes
|
|
199
|
+
end
|
|
200
|
+
|
|
174
201
|
def to_s
|
|
175
202
|
self.name
|
|
176
203
|
end
|
|
@@ -205,7 +232,7 @@ module Locomotive
|
|
|
205
232
|
end
|
|
206
233
|
|
|
207
234
|
# define group_by_field from group_by_field_id
|
|
208
|
-
if self.group_by_field_id
|
|
235
|
+
if self.group_by_field_name.blank? && self.group_by_field_id.present?
|
|
209
236
|
self.group_by_field_name = self.find_field(self.group_by_field_id)
|
|
210
237
|
end
|
|
211
238
|
|
|
@@ -14,8 +14,8 @@ module Locomotive
|
|
|
14
14
|
field :redirect_type, default: 301
|
|
15
15
|
field :template, localized: true
|
|
16
16
|
field :handle
|
|
17
|
-
field :listed
|
|
18
|
-
field :templatized
|
|
17
|
+
field :listed, default: false
|
|
18
|
+
field :templatized, default: false
|
|
19
19
|
field :content_type
|
|
20
20
|
field :published, default: true
|
|
21
21
|
field :cache_strategy
|
|
@@ -318,7 +318,7 @@ module Locomotive
|
|
|
318
318
|
# @return [ String ] The YAML version of the page
|
|
319
319
|
#
|
|
320
320
|
def to_yaml
|
|
321
|
-
fields = %w(title slug redirect_url redirect_type handle published listed cache_strategy response_type position)
|
|
321
|
+
fields = %w(title slug redirect_url redirect_type handle published listed cache_strategy response_type position seo_title meta_description meta_keywords)
|
|
322
322
|
|
|
323
323
|
_attributes = self.attributes.delete_if { |k, v| !fields.include?(k.to_s) || v.blank? }.deep_stringify_keys
|
|
324
324
|
|
|
@@ -346,7 +346,8 @@ module Locomotive
|
|
|
346
346
|
# @return [ Hash ] The params
|
|
347
347
|
#
|
|
348
348
|
def to_params
|
|
349
|
-
params = self.filter_attributes %w(title parent_id slug redirect_url redirect_type handle listed published cache_strategy
|
|
349
|
+
params = self.filter_attributes %w(title parent_id slug redirect_url redirect_type handle listed published cache_strategy
|
|
350
|
+
response_type position templatized seo_title meta_description meta_keywords)
|
|
350
351
|
|
|
351
352
|
# slug
|
|
352
353
|
params.delete(:slug) if self.depth == 0
|
|
@@ -376,7 +377,9 @@ module Locomotive
|
|
|
376
377
|
# @return [ Hash ] The safe params
|
|
377
378
|
#
|
|
378
379
|
def to_safe_params
|
|
379
|
-
fields = %w(title slug listed published handle cache_strategy
|
|
380
|
+
fields = %w(title slug listed published handle cache_strategy
|
|
381
|
+
redirect_url response_type templatized content_type_id position
|
|
382
|
+
seo_title meta_description meta_keywords)
|
|
380
383
|
|
|
381
384
|
params = self.attributes.delete_if do |k, v|
|
|
382
385
|
!fields.include?(k.to_s) || (!v.is_a?(FalseClass) && v.blank?)
|
|
@@ -1,49 +1,70 @@
|
|
|
1
1
|
module Locomotive
|
|
2
2
|
module Mounter
|
|
3
3
|
module Reader
|
|
4
|
-
|
|
4
|
+
module Api
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
class Base
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
attr_accessor :runner, :items
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
self.items = {}
|
|
13
|
-
end
|
|
10
|
+
delegate :uri, :uri_with_scheme, to: :runner
|
|
11
|
+
delegate :locales, to: :mounting_point
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
def initialize(runner)
|
|
14
|
+
self.runner = runner
|
|
15
|
+
self.items = {}
|
|
16
|
+
end
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
def mounting_point
|
|
19
|
+
self.runner.mounting_point
|
|
20
|
+
end
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
def get(resource_name, locale = nil, raw = false)
|
|
23
|
+
params = { query: {} }
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
params[:query][:locale] = locale if locale
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
response = Locomotive::Mounter::EngineApi.get("/#{resource_name}.json", params).parsed_response
|
|
29
28
|
|
|
30
|
-
|
|
29
|
+
return response if raw
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
31
|
+
case response
|
|
32
|
+
when Hash then response.to_hash.delete_if { |k, _| !self.safe_attributes.include?(k) }
|
|
33
|
+
when Array
|
|
34
|
+
response.map do |row|
|
|
35
|
+
# puts "#{row.inspect}\n---" # DEBUG
|
|
36
|
+
row.delete_if { |k, _| !self.safe_attributes.include?(k) }
|
|
37
|
+
end
|
|
38
|
+
else
|
|
39
|
+
response
|
|
40
|
+
end
|
|
41
|
+
end
|
|
43
42
|
|
|
44
|
-
|
|
43
|
+
# Build a new content asset from an url and a folder and add it
|
|
44
|
+
# to the global list of the content assets.
|
|
45
|
+
#
|
|
46
|
+
# @param [ String ] url The url of the content asset.
|
|
47
|
+
# @param [ String ] folder The folder of the content asset (optional).
|
|
48
|
+
#
|
|
49
|
+
# @return [ String ] The local path (not absolute) of the content asset.
|
|
50
|
+
#
|
|
51
|
+
def add_content_asset(url, folder = nil)
|
|
52
|
+
content_assets = self.mounting_point.resources[:content_assets]
|
|
45
53
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
54
|
+
if (url =~ /^https?:\/\//).nil?
|
|
55
|
+
url = URI.join(self.uri_with_scheme, url)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
asset = Locomotive::Mounter::Models::ContentAsset.new(uri: url, folder: folder)
|
|
59
|
+
|
|
60
|
+
content_assets[url.to_s] = asset
|
|
61
|
+
|
|
62
|
+
asset.local_filepath
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
49
70
|
end
|
|
@@ -5,19 +5,19 @@ module Locomotive
|
|
|
5
5
|
|
|
6
6
|
class ContentAssetsReader < Base
|
|
7
7
|
|
|
8
|
-
# Build the list of
|
|
8
|
+
# Build the list of content assets from the public folder with eager loading.
|
|
9
9
|
#
|
|
10
10
|
# @return [ Array ] The cached list of theme assets
|
|
11
11
|
#
|
|
12
12
|
def read
|
|
13
13
|
base_uri = self.runner.uri.split('/').first
|
|
14
|
-
base_uri = "http://#{base_uri}" unless base_uri =~ /^
|
|
14
|
+
base_uri = "http://#{base_uri}" unless base_uri =~ /^https?:\/\//
|
|
15
15
|
|
|
16
16
|
self.get(:content_assets).each do |attributes|
|
|
17
17
|
url = attributes.delete('url')
|
|
18
18
|
|
|
19
19
|
attributes['folder'] = 'samples/assets'
|
|
20
|
-
attributes['uri'] = URI(url =~
|
|
20
|
+
attributes['uri'] = URI(url =~ /^https?:\/\// ? url : "#{base_uri}#{url}")
|
|
21
21
|
|
|
22
22
|
self.items[url] = Locomotive::Mounter::Models::ContentAsset.new(attributes)
|
|
23
23
|
end
|
|
@@ -80,21 +80,24 @@ module Locomotive
|
|
|
80
80
|
|
|
81
81
|
content_type.fields.each do |field|
|
|
82
82
|
value = (case field.type
|
|
83
|
-
when
|
|
83
|
+
when
|
|
84
84
|
original_attributes[field.name]
|
|
85
85
|
when :text
|
|
86
|
-
|
|
86
|
+
replace_urls_by_content_assets(original_attributes[field.name])
|
|
87
87
|
when :select
|
|
88
88
|
field.find_select_option(original_attributes[field.name]).try(:name)
|
|
89
89
|
when :date
|
|
90
90
|
original_attributes["formatted_#{field.name}"]
|
|
91
|
+
when :file
|
|
92
|
+
retrieve_file_path(content_type, field, original_attributes)
|
|
91
93
|
when :belongs_to, :many_to_many
|
|
92
94
|
# push a relationship in the waiting line in order to be resolved at last
|
|
93
95
|
target_field_name = field.type == :belongs_to ? "#{field.name}_id" : "#{field.name}_ids"
|
|
94
96
|
self.relationships << { id: attributes['_id'], field: field.name, target_ids: original_attributes[target_field_name] }
|
|
95
97
|
nil
|
|
96
98
|
else
|
|
97
|
-
|
|
99
|
+
# :string, :boolean, :email, :integer, :float, :tags
|
|
100
|
+
original_attributes[field.name]
|
|
98
101
|
end)
|
|
99
102
|
|
|
100
103
|
attributes[field.name] = value unless value.nil?
|
|
@@ -134,6 +137,24 @@ module Locomotive
|
|
|
134
137
|
content
|
|
135
138
|
end
|
|
136
139
|
|
|
140
|
+
def retrieve_file_path(content_type, field, attributes)
|
|
141
|
+
value = attributes[field.name]
|
|
142
|
+
|
|
143
|
+
return nil if value.blank?
|
|
144
|
+
|
|
145
|
+
base_folder = File.join('/', 'samples', content_type.slug, attributes['_slug'])
|
|
146
|
+
|
|
147
|
+
if value.is_a?(Hash)
|
|
148
|
+
{}.tap do |translations|
|
|
149
|
+
value.each do |locale, url|
|
|
150
|
+
translations[locale] = self.add_content_asset(url, File.join(base_folder, locale))
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
else
|
|
154
|
+
self.add_content_asset(value, base_folder)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
137
158
|
end
|
|
138
159
|
|
|
139
160
|
end
|
|
@@ -63,7 +63,7 @@ module Locomotive
|
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
def safe_attributes
|
|
66
|
-
%w(name slug description order_by order_direction label_field_name
|
|
66
|
+
%w(name slug description order_by order_direction label_field_name group_by_field_name public_submission_accounts entries_custom_fields klass_name created_at updated_at)
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
end
|
|
@@ -144,9 +144,14 @@ module Locomotive
|
|
|
144
144
|
#
|
|
145
145
|
def filter_editable_elements(list)
|
|
146
146
|
list.map do |attributes|
|
|
147
|
+
type = attributes['type']
|
|
147
148
|
attributes.keep_if { |k, _| %w(_id block slug content).include?(k) }.tap do |hash|
|
|
148
|
-
|
|
149
|
-
hash['content'].
|
|
149
|
+
if type == 'EditableFile'
|
|
150
|
+
hash['content'] = self.add_content_asset(hash['content'], '/samples/pages')
|
|
151
|
+
else
|
|
152
|
+
self.mounting_point.content_assets.each do |path, asset|
|
|
153
|
+
hash['content'].gsub!(path, asset.local_filepath)
|
|
154
|
+
end
|
|
150
155
|
end
|
|
151
156
|
end
|
|
152
157
|
end
|
|
@@ -16,12 +16,12 @@ module Locomotive
|
|
|
16
16
|
#
|
|
17
17
|
def read
|
|
18
18
|
base_uri = self.runner.uri.split('/').first
|
|
19
|
-
base_uri = "http://#{base_uri}" unless base_uri =~ /^
|
|
19
|
+
base_uri = "http://#{base_uri}" unless base_uri =~ /^https?:\/\//
|
|
20
20
|
|
|
21
21
|
self.items = self.get(:theme_assets).map do |attributes|
|
|
22
22
|
url = attributes.delete('url')
|
|
23
23
|
|
|
24
|
-
attributes['uri'] = URI(url =~
|
|
24
|
+
attributes['uri'] = URI(url =~ /^https?:\/\// ? url : "#{base_uri}#{url}")
|
|
25
25
|
|
|
26
26
|
Locomotive::Mounter::Models::ThemeAsset.new(attributes)
|
|
27
27
|
end
|
|
@@ -10,8 +10,8 @@ module Locomotive
|
|
|
10
10
|
# @return [ Array ] The cached list of theme assets
|
|
11
11
|
#
|
|
12
12
|
def read
|
|
13
|
-
self.items = get(:translations).
|
|
14
|
-
Locomotive::Mounter::Models::Translation.new(attributes)
|
|
13
|
+
self.items = get(:translations).each_with_object({}) do |attributes,hash|
|
|
14
|
+
hash[attributes['key']] = Locomotive::Mounter::Models::Translation.new(attributes)
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
@@ -10,7 +10,7 @@ module Locomotive
|
|
|
10
10
|
def self.instance
|
|
11
11
|
@@instance ||= Runner.new(:api)
|
|
12
12
|
end
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
def self.teardown
|
|
15
15
|
@@instance = nil
|
|
16
16
|
end
|
|
@@ -22,16 +22,11 @@ module Locomotive
|
|
|
22
22
|
# Call the LocomotiveCMS engine to get a token for
|
|
23
23
|
# the next API calls
|
|
24
24
|
def prepare
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
password = self.parameters.delete(:password)
|
|
28
|
-
|
|
29
|
-
if uri.blank? || email.blank? || password.blank?
|
|
30
|
-
raise Locomotive::Mounter::ReaderException.new("one or many API credentials (uri, email, password) are missing")
|
|
31
|
-
end
|
|
25
|
+
credentials = self.parameters.select { |k, _| %w(uri email password api_key).include?(k.to_s) }
|
|
26
|
+
self.uri = credentials[:uri]
|
|
32
27
|
|
|
33
28
|
begin
|
|
34
|
-
Locomotive::Mounter::EngineApi.set_token(
|
|
29
|
+
Locomotive::Mounter::EngineApi.set_token(credentials)
|
|
35
30
|
rescue Exception => e
|
|
36
31
|
raise Locomotive::Mounter::ReaderException.new("unable to get an API token: #{e.message}")
|
|
37
32
|
end
|
|
@@ -45,6 +40,14 @@ module Locomotive
|
|
|
45
40
|
[SiteReader, ContentAssetsReader, SnippetsReader, ContentTypesReader, ContentEntriesReader, PagesReader, ThemeAssetsReader, TranslationsReader]
|
|
46
41
|
end
|
|
47
42
|
|
|
43
|
+
# Return the uri with the scheme (http://)
|
|
44
|
+
#
|
|
45
|
+
# @return [ String ] The uri starting by http://
|
|
46
|
+
#
|
|
47
|
+
def uri_with_scheme
|
|
48
|
+
self.uri =~ /^http/ ? self.uri : "http://#{self.uri}"
|
|
49
|
+
end
|
|
50
|
+
|
|
48
51
|
end
|
|
49
52
|
|
|
50
53
|
end
|
|
@@ -10,7 +10,7 @@ module Locomotive
|
|
|
10
10
|
# @return [ Array ] The list of content assets
|
|
11
11
|
#
|
|
12
12
|
def read
|
|
13
|
-
self.items =
|
|
13
|
+
self.items = {} # prefer an array over a hash
|
|
14
14
|
|
|
15
15
|
self.fetch_from_pages
|
|
16
16
|
|
|
@@ -66,7 +66,7 @@ module Locomotive
|
|
|
66
66
|
source.to_s.match(/\/samples\/.*\.[a-zA-Z0-9]+/) do |match|
|
|
67
67
|
filepath = File.join(self.root_dir, match.to_s)
|
|
68
68
|
folder = File.dirname(match.to_s)
|
|
69
|
-
self.items
|
|
69
|
+
self.items[source] = Locomotive::Mounter::Models::ContentAsset.new(filepath: filepath, folder: folder)
|
|
70
70
|
end
|
|
71
71
|
end
|
|
72
72
|
|
|
@@ -188,6 +188,14 @@ module Locomotive
|
|
|
188
188
|
end
|
|
189
189
|
|
|
190
190
|
protected
|
|
191
|
+
|
|
192
|
+
def truncate(string, length = 50, separator = '[...]')
|
|
193
|
+
if string.length > length
|
|
194
|
+
string[0..(length - separator.length)] + separator
|
|
195
|
+
else
|
|
196
|
+
string
|
|
197
|
+
end
|
|
198
|
+
end
|
|
191
199
|
|
|
192
200
|
def response_to_status(response)
|
|
193
201
|
response ? :success : :error
|
|
@@ -248,7 +256,7 @@ module Locomotive
|
|
|
248
256
|
when :same then 'same'.colorize(color: :magenta)
|
|
249
257
|
when :not_translated then 'not translated (itself or parent)'.colorize(color: :yellow)
|
|
250
258
|
end
|
|
251
|
-
|
|
259
|
+
|
|
252
260
|
spaces = '.' * (80 - self.resource_message(resource).size)
|
|
253
261
|
self.log "#{spaces}[#{status_label}]\n"
|
|
254
262
|
|
|
@@ -265,7 +273,7 @@ module Locomotive
|
|
|
265
273
|
#
|
|
266
274
|
def resource_message(resource)
|
|
267
275
|
op_label = resource.persisted? ? 'updating': 'creating'
|
|
268
|
-
" #{op_label} #{resource.to_s}"
|
|
276
|
+
" #{op_label} #{truncate(resource.to_s)}"
|
|
269
277
|
end
|
|
270
278
|
|
|
271
279
|
# Log a message to the console or the logger depending on the options
|
|
@@ -14,9 +14,17 @@ module Locomotive
|
|
|
14
14
|
# Other local attributes
|
|
15
15
|
attr_accessor :tmp_folder
|
|
16
16
|
|
|
17
|
+
# store checksums of remote assets. needed to check if an asset has to be updated or not
|
|
18
|
+
attr_accessor :checksums
|
|
19
|
+
|
|
20
|
+
# the assets stored in the engine have the same base url
|
|
21
|
+
attr_accessor :remote_base_url
|
|
22
|
+
|
|
17
23
|
def prepare
|
|
18
24
|
super
|
|
19
25
|
|
|
26
|
+
self.checksums = {}
|
|
27
|
+
|
|
20
28
|
# prepare the place where the assets will be stored temporarily.
|
|
21
29
|
self.create_tmp_folder
|
|
22
30
|
|
|
@@ -25,8 +33,13 @@ module Locomotive
|
|
|
25
33
|
remote_path = File.join('/', attributes['folder'], File.basename(attributes['local_path']))
|
|
26
34
|
|
|
27
35
|
if theme_asset = self.theme_assets[remote_path]
|
|
28
|
-
theme_asset._id
|
|
29
|
-
theme_asset.
|
|
36
|
+
theme_asset._id = attributes['id']
|
|
37
|
+
self.checksums[theme_asset._id] = attributes['checksum']
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if remote_base_url.nil?
|
|
41
|
+
attributes['url'] =~ /(.*\/sites\/[0-9a-f]+\/theme)/
|
|
42
|
+
self.remote_base_url = $1
|
|
30
43
|
end
|
|
31
44
|
end
|
|
32
45
|
end
|
|
@@ -44,7 +57,7 @@ module Locomotive
|
|
|
44
57
|
begin
|
|
45
58
|
if theme_asset.persisted?
|
|
46
59
|
# we only update it if the size has changed or if the force option has been set.
|
|
47
|
-
if self.force? || self.theme_asset_changed?(theme_asset
|
|
60
|
+
if self.force? || self.theme_asset_changed?(theme_asset)
|
|
48
61
|
response = self.put :theme_assets, theme_asset._id, params
|
|
49
62
|
status = self.response_to_status(response)
|
|
50
63
|
else
|
|
@@ -129,36 +142,28 @@ module Locomotive
|
|
|
129
142
|
self.theme_assets.values.sort { |a, b| a.priority <=> b.priority }
|
|
130
143
|
end
|
|
131
144
|
|
|
132
|
-
# Tell if the theme_asset has changed in order to update it
|
|
145
|
+
# Tell if the theme_asset has been changed in order to update it
|
|
133
146
|
# if so or simply skip it.
|
|
134
147
|
#
|
|
135
148
|
# @param [ Object ] theme_asset The theme asset
|
|
136
|
-
# @param [ Object ] tmp_file The size of the file (after precompilation if required)
|
|
137
149
|
#
|
|
138
|
-
# @return [ Boolean ] True if the
|
|
150
|
+
# @return [ Boolean ] True if the checksums of the local and remote files are different.
|
|
139
151
|
#
|
|
140
|
-
def theme_asset_changed?(theme_asset
|
|
141
|
-
|
|
142
|
-
# we need to compare compiled contents (sass, coffeescript) with the right urls
|
|
143
|
-
tmp_content = ''
|
|
152
|
+
def theme_asset_changed?(theme_asset)
|
|
153
|
+
content = theme_asset.content
|
|
144
154
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
# in the doubt, we prefer to return true
|
|
151
|
-
return true
|
|
152
|
-
end
|
|
155
|
+
if theme_asset.stylesheet_or_javascript?
|
|
156
|
+
# we need to compare compiled contents (sass, coffeescript) with the right urls inside
|
|
157
|
+
content = content.gsub(/[("'](\/(stylesheets|javascripts|images|media|others)\/(([^;.]+)\/)*([a-zA-Z_\-0-9]+)\.[a-z]{2,3})[)"']/) do |path|
|
|
158
|
+
sanitized_path = path.gsub(/[("')]/, '').gsub(/^\//, '')
|
|
159
|
+
sanitized_path = File.join(self.remote_base_url, sanitized_path)
|
|
153
160
|
|
|
154
|
-
|
|
155
|
-
"#{path.first}/#{$2 + $4}#{path.last}"
|
|
161
|
+
"#{path.first}#{sanitized_path}#{path.last}"
|
|
156
162
|
end
|
|
157
|
-
|
|
158
|
-
tmp_content != theme_asset.content
|
|
159
|
-
else
|
|
160
|
-
Digest::SHA1.file(tmp_file).hexdigest != Digest::SHA1.file(theme_asset.filepath).hexdigest
|
|
161
163
|
end
|
|
164
|
+
|
|
165
|
+
# compare local checksum with the remote one
|
|
166
|
+
Digest::MD5.hexdigest(content) != self.checksums[theme_asset._id]
|
|
162
167
|
end
|
|
163
168
|
|
|
164
169
|
end
|
|
@@ -5,11 +5,12 @@ module Locomotive
|
|
|
5
5
|
|
|
6
6
|
# Push translations to a remote LocomotiveCMS engine.
|
|
7
7
|
#
|
|
8
|
-
#
|
|
8
|
+
# Only pushes if force_translations flag is set
|
|
9
9
|
#
|
|
10
10
|
class TranslationsWriter < Base
|
|
11
11
|
|
|
12
12
|
def prepare
|
|
13
|
+
return unless force_translations?
|
|
13
14
|
super
|
|
14
15
|
|
|
15
16
|
# set the unique identifier to each local translation
|
|
@@ -22,6 +23,7 @@ module Locomotive
|
|
|
22
23
|
|
|
23
24
|
# Write all the translations to the remote destination
|
|
24
25
|
def write
|
|
26
|
+
return unless force_translations?
|
|
25
27
|
self.translations.each do |key, translation|
|
|
26
28
|
self.output_resource_op translation
|
|
27
29
|
|
|
@@ -34,6 +36,9 @@ module Locomotive
|
|
|
34
36
|
|
|
35
37
|
protected
|
|
36
38
|
|
|
39
|
+
def force_translations?
|
|
40
|
+
self.runner.parameters[:force_translations] || false
|
|
41
|
+
end
|
|
37
42
|
# Persist a translation by calling the API. The returned id
|
|
38
43
|
# is then set to the translation itself.
|
|
39
44
|
#
|
|
@@ -25,16 +25,11 @@ module Locomotive
|
|
|
25
25
|
# by default, do not push data (content entries and editable elements)
|
|
26
26
|
self.parameters[:data] ||= false
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
password = self.parameters.delete(:password)
|
|
31
|
-
|
|
32
|
-
if uri.blank? || email.blank? || password.blank?
|
|
33
|
-
raise Locomotive::Mounter::WriterException.new("one or many API credentials (uri, email, password) are missing")
|
|
34
|
-
end
|
|
28
|
+
credentials = self.parameters.select { |k, _| %w(uri email password api_key).include?(k.to_s) }
|
|
29
|
+
self.uri = credentials[:uri]
|
|
35
30
|
|
|
36
31
|
begin
|
|
37
|
-
Locomotive::Mounter::EngineApi.set_token(
|
|
32
|
+
Locomotive::Mounter::EngineApi.set_token(credentials)
|
|
38
33
|
rescue Exception => e
|
|
39
34
|
raise Locomotive::Mounter::WriterException.new("unable to get an API token: #{e.message}")
|
|
40
35
|
end
|
|
@@ -5,12 +5,12 @@ module Locomotive
|
|
|
5
5
|
|
|
6
6
|
class ContentAssetsWriter < Base
|
|
7
7
|
|
|
8
|
-
# It creates the
|
|
8
|
+
# It creates the content assets folder
|
|
9
9
|
def prepare
|
|
10
10
|
self.create_folder 'public'
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
# It writes all the
|
|
13
|
+
# It writes all the content assets into files
|
|
14
14
|
def write
|
|
15
15
|
self.mounting_point.content_assets.each do |_, asset|
|
|
16
16
|
self.open_file(self.target_asset_path(asset), 'wb') do |file|
|
|
@@ -10,8 +10,8 @@ module Locomotive
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def write
|
|
13
|
-
content = self.mounting_point.translations.each_with_object({}) do |translation, hash|
|
|
14
|
-
hash[
|
|
13
|
+
content = self.mounting_point.translations.each_with_object({}) do |(key,translation), hash|
|
|
14
|
+
hash[key] = translation.values
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
content = content.empty? ? '' : content.to_yaml
|
|
@@ -31,7 +31,7 @@ module Locomotive
|
|
|
31
31
|
# @return [ Array ] List of the writer classes
|
|
32
32
|
#
|
|
33
33
|
def writers
|
|
34
|
-
[SiteWriter, SnippetsWriter, ContentTypesWriter, ContentEntriesWriter, PagesWriter, ThemeAssetsWriter, TranslationsWriter]
|
|
34
|
+
[SiteWriter, SnippetsWriter, ContentTypesWriter, ContentEntriesWriter, PagesWriter, ThemeAssetsWriter, ContentAssetsWriter, TranslationsWriter]
|
|
35
35
|
# [SiteWriter, PagesWriter, SnippetsWriter, ContentTypesWriter, ContentEntriesWriter, ContentAssetsWriter, ThemeAssetsWriter, TranslationsWriter]
|
|
36
36
|
end
|
|
37
37
|
|
metadata
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: locomotivecms_mounter
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 1.1.0
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Didier Lafforgue
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date: 2013-
|
|
11
|
+
date: 2013-06-05 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
14
|
name: tilt
|
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
none: false
|
|
18
16
|
requirements:
|
|
19
17
|
- - '='
|
|
20
18
|
- !ruby/object:Gem::Version
|
|
@@ -22,7 +20,6 @@ dependencies:
|
|
|
22
20
|
type: :runtime
|
|
23
21
|
prerelease: false
|
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
-
none: false
|
|
26
23
|
requirements:
|
|
27
24
|
- - '='
|
|
28
25
|
- !ruby/object:Gem::Version
|
|
@@ -30,7 +27,6 @@ dependencies:
|
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
|
31
28
|
name: haml
|
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
|
33
|
-
none: false
|
|
34
30
|
requirements:
|
|
35
31
|
- - '='
|
|
36
32
|
- !ruby/object:Gem::Version
|
|
@@ -38,7 +34,6 @@ dependencies:
|
|
|
38
34
|
type: :runtime
|
|
39
35
|
prerelease: false
|
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
-
none: false
|
|
42
37
|
requirements:
|
|
43
38
|
- - '='
|
|
44
39
|
- !ruby/object:Gem::Version
|
|
@@ -46,7 +41,6 @@ dependencies:
|
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
|
47
42
|
name: sass
|
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
|
49
|
-
none: false
|
|
50
44
|
requirements:
|
|
51
45
|
- - ~>
|
|
52
46
|
- !ruby/object:Gem::Version
|
|
@@ -54,7 +48,6 @@ dependencies:
|
|
|
54
48
|
type: :runtime
|
|
55
49
|
prerelease: false
|
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
-
none: false
|
|
58
51
|
requirements:
|
|
59
52
|
- - ~>
|
|
60
53
|
- !ruby/object:Gem::Version
|
|
@@ -62,7 +55,6 @@ dependencies:
|
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
|
63
56
|
name: compass
|
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
|
65
|
-
none: false
|
|
66
58
|
requirements:
|
|
67
59
|
- - ~>
|
|
68
60
|
- !ruby/object:Gem::Version
|
|
@@ -70,7 +62,6 @@ dependencies:
|
|
|
70
62
|
type: :runtime
|
|
71
63
|
prerelease: false
|
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
-
none: false
|
|
74
65
|
requirements:
|
|
75
66
|
- - ~>
|
|
76
67
|
- !ruby/object:Gem::Version
|
|
@@ -78,7 +69,6 @@ dependencies:
|
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
|
79
70
|
name: coffee-script
|
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
|
81
|
-
none: false
|
|
82
72
|
requirements:
|
|
83
73
|
- - ~>
|
|
84
74
|
- !ruby/object:Gem::Version
|
|
@@ -86,7 +76,6 @@ dependencies:
|
|
|
86
76
|
type: :runtime
|
|
87
77
|
prerelease: false
|
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
-
none: false
|
|
90
79
|
requirements:
|
|
91
80
|
- - ~>
|
|
92
81
|
- !ruby/object:Gem::Version
|
|
@@ -94,7 +83,6 @@ dependencies:
|
|
|
94
83
|
- !ruby/object:Gem::Dependency
|
|
95
84
|
name: less
|
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
|
97
|
-
none: false
|
|
98
86
|
requirements:
|
|
99
87
|
- - ~>
|
|
100
88
|
- !ruby/object:Gem::Version
|
|
@@ -102,7 +90,6 @@ dependencies:
|
|
|
102
90
|
type: :runtime
|
|
103
91
|
prerelease: false
|
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
105
|
-
none: false
|
|
106
93
|
requirements:
|
|
107
94
|
- - ~>
|
|
108
95
|
- !ruby/object:Gem::Version
|
|
@@ -110,7 +97,6 @@ dependencies:
|
|
|
110
97
|
- !ruby/object:Gem::Dependency
|
|
111
98
|
name: RedCloth
|
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
|
113
|
-
none: false
|
|
114
100
|
requirements:
|
|
115
101
|
- - ~>
|
|
116
102
|
- !ruby/object:Gem::Version
|
|
@@ -118,7 +104,6 @@ dependencies:
|
|
|
118
104
|
type: :runtime
|
|
119
105
|
prerelease: false
|
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
-
none: false
|
|
122
107
|
requirements:
|
|
123
108
|
- - ~>
|
|
124
109
|
- !ruby/object:Gem::Version
|
|
@@ -126,7 +111,6 @@ dependencies:
|
|
|
126
111
|
- !ruby/object:Gem::Dependency
|
|
127
112
|
name: activesupport
|
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
|
129
|
-
none: false
|
|
130
114
|
requirements:
|
|
131
115
|
- - ~>
|
|
132
116
|
- !ruby/object:Gem::Version
|
|
@@ -134,7 +118,6 @@ dependencies:
|
|
|
134
118
|
type: :runtime
|
|
135
119
|
prerelease: false
|
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
137
|
-
none: false
|
|
138
121
|
requirements:
|
|
139
122
|
- - ~>
|
|
140
123
|
- !ruby/object:Gem::Version
|
|
@@ -142,7 +125,6 @@ dependencies:
|
|
|
142
125
|
- !ruby/object:Gem::Dependency
|
|
143
126
|
name: i18n
|
|
144
127
|
requirement: !ruby/object:Gem::Requirement
|
|
145
|
-
none: false
|
|
146
128
|
requirements:
|
|
147
129
|
- - ~>
|
|
148
130
|
- !ruby/object:Gem::Version
|
|
@@ -150,7 +132,6 @@ dependencies:
|
|
|
150
132
|
type: :runtime
|
|
151
133
|
prerelease: false
|
|
152
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
153
|
-
none: false
|
|
154
135
|
requirements:
|
|
155
136
|
- - ~>
|
|
156
137
|
- !ruby/object:Gem::Version
|
|
@@ -158,7 +139,6 @@ dependencies:
|
|
|
158
139
|
- !ruby/object:Gem::Dependency
|
|
159
140
|
name: stringex
|
|
160
141
|
requirement: !ruby/object:Gem::Requirement
|
|
161
|
-
none: false
|
|
162
142
|
requirements:
|
|
163
143
|
- - ~>
|
|
164
144
|
- !ruby/object:Gem::Version
|
|
@@ -166,7 +146,6 @@ dependencies:
|
|
|
166
146
|
type: :runtime
|
|
167
147
|
prerelease: false
|
|
168
148
|
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
-
none: false
|
|
170
149
|
requirements:
|
|
171
150
|
- - ~>
|
|
172
151
|
- !ruby/object:Gem::Version
|
|
@@ -174,7 +153,6 @@ dependencies:
|
|
|
174
153
|
- !ruby/object:Gem::Dependency
|
|
175
154
|
name: multi_json
|
|
176
155
|
requirement: !ruby/object:Gem::Requirement
|
|
177
|
-
none: false
|
|
178
156
|
requirements:
|
|
179
157
|
- - ~>
|
|
180
158
|
- !ruby/object:Gem::Version
|
|
@@ -182,7 +160,6 @@ dependencies:
|
|
|
182
160
|
type: :runtime
|
|
183
161
|
prerelease: false
|
|
184
162
|
version_requirements: !ruby/object:Gem::Requirement
|
|
185
|
-
none: false
|
|
186
163
|
requirements:
|
|
187
164
|
- - ~>
|
|
188
165
|
- !ruby/object:Gem::Version
|
|
@@ -190,7 +167,6 @@ dependencies:
|
|
|
190
167
|
- !ruby/object:Gem::Dependency
|
|
191
168
|
name: httmultiparty
|
|
192
169
|
requirement: !ruby/object:Gem::Requirement
|
|
193
|
-
none: false
|
|
194
170
|
requirements:
|
|
195
171
|
- - '='
|
|
196
172
|
- !ruby/object:Gem::Version
|
|
@@ -198,7 +174,6 @@ dependencies:
|
|
|
198
174
|
type: :runtime
|
|
199
175
|
prerelease: false
|
|
200
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
201
|
-
none: false
|
|
202
177
|
requirements:
|
|
203
178
|
- - '='
|
|
204
179
|
- !ruby/object:Gem::Version
|
|
@@ -206,23 +181,20 @@ dependencies:
|
|
|
206
181
|
- !ruby/object:Gem::Dependency
|
|
207
182
|
name: json
|
|
208
183
|
requirement: !ruby/object:Gem::Requirement
|
|
209
|
-
none: false
|
|
210
184
|
requirements:
|
|
211
185
|
- - ~>
|
|
212
186
|
- !ruby/object:Gem::Version
|
|
213
|
-
version: 1.
|
|
187
|
+
version: 1.8.0
|
|
214
188
|
type: :runtime
|
|
215
189
|
prerelease: false
|
|
216
190
|
version_requirements: !ruby/object:Gem::Requirement
|
|
217
|
-
none: false
|
|
218
191
|
requirements:
|
|
219
192
|
- - ~>
|
|
220
193
|
- !ruby/object:Gem::Version
|
|
221
|
-
version: 1.
|
|
194
|
+
version: 1.8.0
|
|
222
195
|
- !ruby/object:Gem::Dependency
|
|
223
196
|
name: mime-types
|
|
224
197
|
requirement: !ruby/object:Gem::Requirement
|
|
225
|
-
none: false
|
|
226
198
|
requirements:
|
|
227
199
|
- - ~>
|
|
228
200
|
- !ruby/object:Gem::Version
|
|
@@ -230,7 +202,6 @@ dependencies:
|
|
|
230
202
|
type: :runtime
|
|
231
203
|
prerelease: false
|
|
232
204
|
version_requirements: !ruby/object:Gem::Requirement
|
|
233
|
-
none: false
|
|
234
205
|
requirements:
|
|
235
206
|
- - ~>
|
|
236
207
|
- !ruby/object:Gem::Version
|
|
@@ -238,7 +209,6 @@ dependencies:
|
|
|
238
209
|
- !ruby/object:Gem::Dependency
|
|
239
210
|
name: zip
|
|
240
211
|
requirement: !ruby/object:Gem::Requirement
|
|
241
|
-
none: false
|
|
242
212
|
requirements:
|
|
243
213
|
- - ~>
|
|
244
214
|
- !ruby/object:Gem::Version
|
|
@@ -246,7 +216,6 @@ dependencies:
|
|
|
246
216
|
type: :runtime
|
|
247
217
|
prerelease: false
|
|
248
218
|
version_requirements: !ruby/object:Gem::Requirement
|
|
249
|
-
none: false
|
|
250
219
|
requirements:
|
|
251
220
|
- - ~>
|
|
252
221
|
- !ruby/object:Gem::Version
|
|
@@ -254,7 +223,6 @@ dependencies:
|
|
|
254
223
|
- !ruby/object:Gem::Dependency
|
|
255
224
|
name: colorize
|
|
256
225
|
requirement: !ruby/object:Gem::Requirement
|
|
257
|
-
none: false
|
|
258
226
|
requirements:
|
|
259
227
|
- - ~>
|
|
260
228
|
- !ruby/object:Gem::Version
|
|
@@ -262,7 +230,6 @@ dependencies:
|
|
|
262
230
|
type: :runtime
|
|
263
231
|
prerelease: false
|
|
264
232
|
version_requirements: !ruby/object:Gem::Requirement
|
|
265
|
-
none: false
|
|
266
233
|
requirements:
|
|
267
234
|
- - ~>
|
|
268
235
|
- !ruby/object:Gem::Version
|
|
@@ -270,7 +237,6 @@ dependencies:
|
|
|
270
237
|
- !ruby/object:Gem::Dependency
|
|
271
238
|
name: logger
|
|
272
239
|
requirement: !ruby/object:Gem::Requirement
|
|
273
|
-
none: false
|
|
274
240
|
requirements:
|
|
275
241
|
- - ! '>='
|
|
276
242
|
- !ruby/object:Gem::Version
|
|
@@ -278,7 +244,6 @@ dependencies:
|
|
|
278
244
|
type: :runtime
|
|
279
245
|
prerelease: false
|
|
280
246
|
version_requirements: !ruby/object:Gem::Requirement
|
|
281
|
-
none: false
|
|
282
247
|
requirements:
|
|
283
248
|
- - ! '>='
|
|
284
249
|
- !ruby/object:Gem::Version
|
|
@@ -286,7 +251,6 @@ dependencies:
|
|
|
286
251
|
- !ruby/object:Gem::Dependency
|
|
287
252
|
name: rake
|
|
288
253
|
requirement: !ruby/object:Gem::Requirement
|
|
289
|
-
none: false
|
|
290
254
|
requirements:
|
|
291
255
|
- - '='
|
|
292
256
|
- !ruby/object:Gem::Version
|
|
@@ -294,7 +258,6 @@ dependencies:
|
|
|
294
258
|
type: :development
|
|
295
259
|
prerelease: false
|
|
296
260
|
version_requirements: !ruby/object:Gem::Requirement
|
|
297
|
-
none: false
|
|
298
261
|
requirements:
|
|
299
262
|
- - '='
|
|
300
263
|
- !ruby/object:Gem::Version
|
|
@@ -302,7 +265,6 @@ dependencies:
|
|
|
302
265
|
- !ruby/object:Gem::Dependency
|
|
303
266
|
name: rspec
|
|
304
267
|
requirement: !ruby/object:Gem::Requirement
|
|
305
|
-
none: false
|
|
306
268
|
requirements:
|
|
307
269
|
- - ~>
|
|
308
270
|
- !ruby/object:Gem::Version
|
|
@@ -310,7 +272,6 @@ dependencies:
|
|
|
310
272
|
type: :development
|
|
311
273
|
prerelease: false
|
|
312
274
|
version_requirements: !ruby/object:Gem::Requirement
|
|
313
|
-
none: false
|
|
314
275
|
requirements:
|
|
315
276
|
- - ~>
|
|
316
277
|
- !ruby/object:Gem::Version
|
|
@@ -318,7 +279,6 @@ dependencies:
|
|
|
318
279
|
- !ruby/object:Gem::Dependency
|
|
319
280
|
name: mocha
|
|
320
281
|
requirement: !ruby/object:Gem::Requirement
|
|
321
|
-
none: false
|
|
322
282
|
requirements:
|
|
323
283
|
- - '='
|
|
324
284
|
- !ruby/object:Gem::Version
|
|
@@ -326,7 +286,6 @@ dependencies:
|
|
|
326
286
|
type: :development
|
|
327
287
|
prerelease: false
|
|
328
288
|
version_requirements: !ruby/object:Gem::Requirement
|
|
329
|
-
none: false
|
|
330
289
|
requirements:
|
|
331
290
|
- - '='
|
|
332
291
|
- !ruby/object:Gem::Version
|
|
@@ -334,7 +293,6 @@ dependencies:
|
|
|
334
293
|
- !ruby/object:Gem::Dependency
|
|
335
294
|
name: rack-test
|
|
336
295
|
requirement: !ruby/object:Gem::Requirement
|
|
337
|
-
none: false
|
|
338
296
|
requirements:
|
|
339
297
|
- - ~>
|
|
340
298
|
- !ruby/object:Gem::Version
|
|
@@ -342,7 +300,6 @@ dependencies:
|
|
|
342
300
|
type: :development
|
|
343
301
|
prerelease: false
|
|
344
302
|
version_requirements: !ruby/object:Gem::Requirement
|
|
345
|
-
none: false
|
|
346
303
|
requirements:
|
|
347
304
|
- - ~>
|
|
348
305
|
- !ruby/object:Gem::Version
|
|
@@ -350,7 +307,6 @@ dependencies:
|
|
|
350
307
|
- !ruby/object:Gem::Dependency
|
|
351
308
|
name: ruby-debug-wrapper
|
|
352
309
|
requirement: !ruby/object:Gem::Requirement
|
|
353
|
-
none: false
|
|
354
310
|
requirements:
|
|
355
311
|
- - ~>
|
|
356
312
|
- !ruby/object:Gem::Version
|
|
@@ -358,7 +314,6 @@ dependencies:
|
|
|
358
314
|
type: :development
|
|
359
315
|
prerelease: false
|
|
360
316
|
version_requirements: !ruby/object:Gem::Requirement
|
|
361
|
-
none: false
|
|
362
317
|
requirements:
|
|
363
318
|
- - ~>
|
|
364
319
|
- !ruby/object:Gem::Version
|
|
@@ -366,7 +321,6 @@ dependencies:
|
|
|
366
321
|
- !ruby/object:Gem::Dependency
|
|
367
322
|
name: vcr
|
|
368
323
|
requirement: !ruby/object:Gem::Requirement
|
|
369
|
-
none: false
|
|
370
324
|
requirements:
|
|
371
325
|
- - '='
|
|
372
326
|
- !ruby/object:Gem::Version
|
|
@@ -374,7 +328,6 @@ dependencies:
|
|
|
374
328
|
type: :development
|
|
375
329
|
prerelease: false
|
|
376
330
|
version_requirements: !ruby/object:Gem::Requirement
|
|
377
|
-
none: false
|
|
378
331
|
requirements:
|
|
379
332
|
- - '='
|
|
380
333
|
- !ruby/object:Gem::Version
|
|
@@ -382,23 +335,20 @@ dependencies:
|
|
|
382
335
|
- !ruby/object:Gem::Dependency
|
|
383
336
|
name: therubyracer
|
|
384
337
|
requirement: !ruby/object:Gem::Requirement
|
|
385
|
-
none: false
|
|
386
338
|
requirements:
|
|
387
339
|
- - ~>
|
|
388
340
|
- !ruby/object:Gem::Version
|
|
389
|
-
version: 0.
|
|
341
|
+
version: 0.11.4
|
|
390
342
|
type: :development
|
|
391
343
|
prerelease: false
|
|
392
344
|
version_requirements: !ruby/object:Gem::Requirement
|
|
393
|
-
none: false
|
|
394
345
|
requirements:
|
|
395
346
|
- - ~>
|
|
396
347
|
- !ruby/object:Gem::Version
|
|
397
|
-
version: 0.
|
|
348
|
+
version: 0.11.4
|
|
398
349
|
- !ruby/object:Gem::Dependency
|
|
399
350
|
name: webmock
|
|
400
351
|
requirement: !ruby/object:Gem::Requirement
|
|
401
|
-
none: false
|
|
402
352
|
requirements:
|
|
403
353
|
- - '='
|
|
404
354
|
- !ruby/object:Gem::Version
|
|
@@ -406,7 +356,6 @@ dependencies:
|
|
|
406
356
|
type: :development
|
|
407
357
|
prerelease: false
|
|
408
358
|
version_requirements: !ruby/object:Gem::Requirement
|
|
409
|
-
none: false
|
|
410
359
|
requirements:
|
|
411
360
|
- - '='
|
|
412
361
|
- !ruby/object:Gem::Version
|
|
@@ -491,29 +440,25 @@ files:
|
|
|
491
440
|
- lib/locomotive/mounter.rb
|
|
492
441
|
homepage: http://www.locomotivecms.com
|
|
493
442
|
licenses: []
|
|
443
|
+
metadata: {}
|
|
494
444
|
post_install_message:
|
|
495
445
|
rdoc_options: []
|
|
496
446
|
require_paths:
|
|
497
447
|
- lib
|
|
498
448
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
499
|
-
none: false
|
|
500
449
|
requirements:
|
|
501
450
|
- - ! '>='
|
|
502
451
|
- !ruby/object:Gem::Version
|
|
503
452
|
version: '0'
|
|
504
|
-
segments:
|
|
505
|
-
- 0
|
|
506
|
-
hash: 2290558764515626735
|
|
507
453
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
508
|
-
none: false
|
|
509
454
|
requirements:
|
|
510
455
|
- - ! '>='
|
|
511
456
|
- !ruby/object:Gem::Version
|
|
512
457
|
version: 1.3.6
|
|
513
458
|
requirements: []
|
|
514
459
|
rubyforge_project: locomotivecms_mounter
|
|
515
|
-
rubygems_version:
|
|
460
|
+
rubygems_version: 2.0.3
|
|
516
461
|
signing_key:
|
|
517
|
-
specification_version:
|
|
462
|
+
specification_version: 4
|
|
518
463
|
summary: LocomotiveCMS Mounter
|
|
519
464
|
test_files: []
|