bootic_cli 0.7.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ac3bf0e553c05ee15cb57744d5ec3c219c4985df
4
- data.tar.gz: 63daaae9646840e44425b3c1dd7b9a00aba28a6a
3
+ metadata.gz: 78aa25989c89e07072dc2cdac0502d391ed1b403
4
+ data.tar.gz: 9421b7000cf397519a6c68ec2da26078d3522bee
5
5
  SHA512:
6
- metadata.gz: b3de93b783be8f16d12f4bfd442a1825047e02bfb2fa8b0ba49e0eddd6b6c8a57017c716f72da94c8b35af1f863d8cc171951db78346242904f23aa28ad75223
7
- data.tar.gz: a61f6cb78962889818b13c2641042af88aab5c6b167d39748721518e58536054f8627c3d652c52290db986bb23d8a1e8e1a2cbc1091b92dab5422f2c9b7770ea
6
+ metadata.gz: dad570ef8547281df61d8f6630abb3aaa5c0ab422b68a2b7daa92efc3ac09e64a7b3850c88f8a5d5ba8090b10de2ee3a09f4a781b01e28632a2719587403d884
7
+ data.tar.gz: 568c143b7d446d88153f786e48a31253caaa471ba3a355b7af71ce6a33922ecb0b0066c8b685e4a724b20ed94e5155636bc6955f95812ad901465644d6706caa
@@ -270,7 +270,7 @@ module BooticCli
270
270
  end
271
271
 
272
272
  def contains_theme?(path)
273
- File.exist?(File.join(path, 'layout.html'))
273
+ File.exist?(File.join(path, 'settings.json')) || File.exist?(File.join(path, 'layout.html'))
274
274
  end
275
275
 
276
276
  def is_within_theme?
@@ -10,7 +10,7 @@ module BooticCli
10
10
 
11
11
  def ==(other)
12
12
  # puts "Comparing with time #{self.updated_on} vs #{other.updated_on}"
13
- self.updated_on == other.updated_on
13
+ self.updated_on.to_i == other.updated_on.to_i
14
14
  end
15
15
  end
16
16
 
@@ -116,17 +116,25 @@ module BooticCli
116
116
  end
117
117
 
118
118
  def add_template(file_name, body)
119
- check_errors! theme.create_template(
119
+ params = {
120
120
  file_name: file_name,
121
121
  body: body
122
- )
122
+ }
123
+
124
+ if ts = get_updated_on(file_name)
125
+ params.merge!(last_updated_on: ts.to_i)
126
+ end
127
+
128
+ check_errors!(theme.create_template(params)).tap do |entity|
129
+ template_updated(file_name, entity)
130
+ end
123
131
  end
124
132
 
125
133
  def remove_template(file_name)
126
134
  tpl = theme.templates.find { |t| t.file_name == file_name }
127
135
  if tpl && tpl.can?(:delete_template)
128
136
  res = tpl.delete_template
129
- check_errors!(res) if res.respond_to?(:can?)
137
+ res.status.to_i < 300
130
138
  else
131
139
  puts "Cannot delete #{file_name}"
132
140
  end
@@ -143,7 +151,7 @@ module BooticCli
143
151
  asset = theme.assets.find { |t| t.file_name == file_name }
144
152
  if asset and asset.can?(:delete_theme_asset)
145
153
  res = asset.delete_theme_asset
146
- check_errors!(res) if res.respond_to?(:can?)
154
+ res.status.to_i < 300
147
155
  else
148
156
  puts "Cannot delete asset: #{file_name}"
149
157
  end
@@ -152,6 +160,18 @@ module BooticCli
152
160
  private
153
161
  attr_reader :theme
154
162
 
163
+ def get_updated_on(file_name)
164
+ if tpl = templates.find { |t| t.file_name == file_name }
165
+ tpl.updated_on
166
+ end
167
+ end
168
+
169
+ def template_updated(file_name, new_template)
170
+ if index = templates.index { |t| t.file_name == file_name }
171
+ templates[index] = ItemWithTime.new(new_template)
172
+ end
173
+ end
174
+
155
175
  def check_errors!(entity)
156
176
  if entity.has?(:errors)
157
177
  raise EntityErrors.new(entity.errors)
@@ -8,7 +8,7 @@ module BooticCli
8
8
 
9
9
  Template = Struct.new(:file_name, :body, :updated_on) do
10
10
  def ==(other)
11
- self.updated_on == other.updated_on
11
+ self.updated_on.to_i == other.updated_on.to_i
12
12
  end
13
13
  end
14
14
 
@@ -20,32 +20,39 @@ module BooticCli
20
20
  def ==(other)
21
21
  if other.digest.to_s == '' # api theme asset without a digest set
22
22
  # puts "Other has no digest, so comparing dates: #{self.updated_on} vs #{other.updated_on}"
23
- return self.updated_on == other.updated_on
23
+ return self.updated_on.to_i == other.updated_on.to_i
24
24
  end
25
25
 
26
26
  # file sizes may differ as they are served by CDN (that shrinks them)
27
+ # puts "Comparing digests:\n#{digest}\n#{other.digest}"
27
28
  self.digest == other.digest # self.file_size == other.file_size
28
29
  end
29
30
  end
30
31
 
31
32
  ASSETS_DIR = 'assets'.freeze
32
- TEMPLATE_PATTERNS = ['*.liquid', '*.html', '*.css', '*.js', 'theme.yml'].freeze
33
+ TEMPLATE_PATTERNS = ['sections/*.html', '*.html', '*.css', '*.js', 'theme.yml', 'settings.json'].freeze
33
34
  ASSET_PATTERNS = [File.join(ASSETS_DIR, '*')].freeze
34
35
 
36
+ def self.resolve_path(path, dir)
37
+ File.expand_path(path).sub(File.expand_path(dir) + '/', '')
38
+ end
39
+
35
40
  # helper to resolve the right type (Template or Asset) from a local path
36
41
  # this is not part of the generic Theme interface
37
42
  def self.resolve_type(path)
38
43
  path =~ /assets\// ? :asset : :template
39
44
  end
40
45
 
41
- def self.resolve_file(path)
46
+ def self.resolve_file(path, workdir)
42
47
  file = File.new(path)
43
48
  type = resolve_type(path)
44
- file_name = File.basename(path)
45
49
 
50
+ # initialize a new asset or template as it might be a new file
46
51
  item = if path =~ /assets\//
52
+ file_name = File.basename(path)
47
53
  ThemeAsset.new(file_name, file, file.mtime.utc)
48
54
  else
55
+ file_name = resolve_path(path, workdir)
49
56
  Template.new(file_name, file.read, file.mtime.utc)
50
57
  end
51
58
 
@@ -86,7 +93,7 @@ module BooticCli
86
93
  def templates
87
94
  @templates ||= (
88
95
  paths_for(TEMPLATE_PATTERNS).sort.map do |path|
89
- name = File.basename(path)
96
+ name = self.class.resolve_path(path, dir)
90
97
  file = File.new(path)
91
98
  Template.new(name, file.read, file.mtime.utc)
92
99
  end
@@ -113,6 +120,9 @@ module BooticCli
113
120
  body = body.gsub(/\r\n?/, "\n")
114
121
  end
115
122
 
123
+ dir = File.dirname(path)
124
+ FileUtils.mkdir_p(dir) unless File.exist?(dir)
125
+
116
126
  File.open(path, 'w') do |io|
117
127
  io.write(body)
118
128
  end
@@ -154,7 +164,9 @@ module BooticCli
154
164
  end
155
165
 
156
166
  def paths_for(patterns)
157
- patterns.reduce([]) {|m, pattern| m + Dir[File.join(dir, pattern)]}
167
+ patterns.reduce([]) do |m, pattern|
168
+ m + Dir[File.join(dir, pattern)]
169
+ end
158
170
  end
159
171
 
160
172
  def setup
@@ -189,21 +189,22 @@ module BooticCli
189
189
 
190
190
  def watch(dir, remote_theme, watcher: Listen)
191
191
  listener = watcher.to(dir) do |modified, added, removed|
192
+
192
193
  if modified.any?
193
194
  modified.each do |path|
194
- upsert_file(remote_theme, path)
195
+ upsert_file(remote_theme, path, dir)
195
196
  end
196
197
  end
197
198
 
198
199
  if added.any?
199
200
  added.each do |path|
200
- upsert_file(remote_theme, path)
201
+ upsert_file(remote_theme, path, dir)
201
202
  end
202
203
  end
203
204
 
204
205
  if removed.any?
205
206
  removed.each do |path|
206
- delete_file(remote_theme, path)
207
+ delete_file(remote_theme, path, dir)
207
208
  end
208
209
  end
209
210
 
@@ -321,10 +322,11 @@ module BooticCli
321
322
  pool.start
322
323
  end
323
324
 
324
- def upsert_file(theme, path)
325
+ def upsert_file(theme, path, dir)
325
326
  return if File.basename(path)[0] == '.' # filter out .lock and .state
326
- item, type = FSTheme.resolve_file(path)
327
- handle_file_errors(type, item) do
327
+
328
+ item, type = FSTheme.resolve_file(path, dir)
329
+ success = handle_file_errors(type, item) do
328
330
  case type
329
331
  when :template
330
332
  theme.add_template(item.file_name, item.body)
@@ -332,35 +334,42 @@ module BooticCli
332
334
  theme.add_asset(item.file_name, item.file)
333
335
  end
334
336
  end
335
- puts "Uploaded #{type}: #{highlight(item.file_name)}"
337
+ puts "Uploaded #{type}: #{highlight(item.file_name)}" if success
336
338
  end
337
339
 
338
- def delete_file(theme, path)
340
+ def delete_file(theme, path, dir)
339
341
  type = FSTheme.resolve_type(path)
340
- file_name = File.basename(path)
341
- case type
342
+ success = case type
342
343
  when :template
344
+ file_name = FSTheme.resolve_path(path, dir)
343
345
  theme.remove_template(file_name)
344
346
  when :asset
347
+ file_name = File.basename(path)
345
348
  theme.remove_asset(file_name)
346
349
  else
347
350
  raise "Invalid type: #{type}"
348
351
  end
349
- puts "Deleted remote #{type}: #{highlight(file_name)}"
352
+ puts "Deleted remote #{type}: #{highlight(file_name)}" if success
350
353
  end
351
354
 
352
355
  def handle_file_errors(type, file, &block)
353
356
  begin
354
357
  yield
358
+ true
355
359
  rescue APITheme::EntityErrors => e
356
360
  fields = e.errors.map(&:field)
357
361
 
358
- error_msg = if fields.include?("file_content_type") or fields.include?("content_type")
362
+ if fields.include?('$.updated_on') || fields.include?('updated_on')
363
+ prompt.say("#{file.file_name} timestamp #{e.errors.first.messages.first}", :red)
364
+ abort
365
+ end
366
+
367
+ error_msg = if fields.include?('file_content_type') or fields.include?('content_type')
359
368
  "is an unsupported file type for #{type}s."
360
- elsif fields.include?("file_file_size") # big asset
369
+ elsif fields.include?('file_file_size') # big asset
361
370
  size_str = file.file_size.to_i > 0 ? "(#{file.file_size} KB) " : ''
362
371
  "#{size_str}is heavier than the maximum allowed for assets (1 MB)"
363
- elsif fields.include?("body") # big template
372
+ elsif fields.include?('body') # big template
364
373
  str = file.file_name[/\.(html|liquid)$/] ? "Try splitting it into smaller chunks" : "Try saving it as an asset instead"
365
374
  str += ", since templates can hold up to 64 KB of data."
366
375
  else
@@ -368,11 +377,11 @@ module BooticCli
368
377
  end
369
378
 
370
379
  prompt.say("#{file.file_name} #{error_msg}. Skipping...", :red)
371
- # abort
380
+ false # abort
372
381
 
373
382
  rescue JSON::GeneratorError => e
374
383
  prompt.say("#{file.file_name} looks like a binary file, not a template. Skipping...", :red)
375
- # abort
384
+ false # just continue, don't abort
376
385
 
377
386
  rescue Net::OpenTimeout, Net::ReadTimeout => e
378
387
  prompt.say("I'm having trouble connecting to the server. Please try again in a minute.", :red)
@@ -1,3 +1,3 @@
1
1
  module BooticCli
2
- VERSION = '0.7.1'
2
+ VERSION = '0.8.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootic_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ismael Celis
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-03-07 00:00:00.000000000 Z
12
+ date: 2020-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor