shopify_theme 0.0.23 → 0.0.24
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 +4 -4
- data/lib/shopify_theme.rb +6 -2
- data/lib/shopify_theme/cli.rb +16 -10
- data/lib/shopify_theme/file_filters.rb +18 -0
- data/lib/shopify_theme/filters/blacklist.rb +17 -0
- data/lib/shopify_theme/filters/command_input.rb +17 -0
- data/lib/shopify_theme/filters/whitelist.rb +19 -0
- data/lib/shopify_theme/version.rb +1 -1
- data/spec/unit/cli_spec.rb +11 -6
- data/spec/unit/file_filters_spec.rb +37 -0
- data/spec/unit/filters/blacklist_spec.rb +32 -0
- data/spec/unit/filters/command_input_spec.rb +18 -0
- data/spec/unit/filters/whitelist_spec.rb +41 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50c5d2b43b94c79a4bc37a4d3b71080f2d9e85fb
|
4
|
+
data.tar.gz: bcc2ec0776ca9e537601a94df1146c5ada57a23a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75463c446905bc9d79d59e1b2e3fead8706624c605321f3582dbcdd61713d6b5fc4d8a9cf96d284323bc2f1b3339489fda0cfb7ba79557e9479e59a50c9af21d
|
7
|
+
data.tar.gz: 66c63f7bd44755b65773e8a3684dd49e9c951dbb8ac25b13d5ffcea63c1c7d0739188e3118a5b7c2705f67a5c6def6d2cceeceb64117233b2fca7c95341378d7
|
data/lib/shopify_theme.rb
CHANGED
@@ -7,6 +7,8 @@ module ShopifyTheme
|
|
7
7
|
NOOPParser = Proc.new {|data, format| {} }
|
8
8
|
TIMER_RESET = 10
|
9
9
|
PERMIT_LOWER_LIMIT = 3
|
10
|
+
MAX_TIMBER_RETRY = 5
|
11
|
+
|
10
12
|
|
11
13
|
def self.test?
|
12
14
|
ENV['test']
|
@@ -79,7 +81,7 @@ module ShopifyTheme
|
|
79
81
|
response
|
80
82
|
end
|
81
83
|
|
82
|
-
def self.upload_timber(name, version)
|
84
|
+
def self.upload_timber(name, version, retries=0)
|
83
85
|
release = Releases.new.find(version)
|
84
86
|
response = shopify.post("/admin/themes.json", :body => {:theme => {:name => name, :src => release.zip_url, :role => 'unpublished'}})
|
85
87
|
manage_timer(response)
|
@@ -87,6 +89,8 @@ module ShopifyTheme
|
|
87
89
|
if theme = body['theme']
|
88
90
|
puts "Successfully created #{name} using Shopify Timber #{version}"
|
89
91
|
watch_until_processing_complete(theme)
|
92
|
+
elsif retries < MAX_TIMBER_RETRY
|
93
|
+
upload_timber(name, version, retries + 1)
|
90
94
|
else
|
91
95
|
puts "Could not download theme!"
|
92
96
|
puts body
|
@@ -113,7 +117,7 @@ module ShopifyTheme
|
|
113
117
|
end
|
114
118
|
|
115
119
|
def self.ignore_files
|
116
|
-
(config[:ignore_files] || []).compact
|
120
|
+
(config[:ignore_files] || []).compact
|
117
121
|
end
|
118
122
|
|
119
123
|
def self.whitelist_files
|
data/lib/shopify_theme/cli.rb
CHANGED
@@ -8,6 +8,7 @@ require 'json'
|
|
8
8
|
require 'filewatcher'
|
9
9
|
require 'launchy'
|
10
10
|
require 'mimemagic'
|
11
|
+
require 'shopify_theme/file_filters'
|
11
12
|
|
12
13
|
module ShopifyTheme
|
13
14
|
EXTENSIONS = [
|
@@ -57,7 +58,7 @@ module ShopifyTheme
|
|
57
58
|
|
58
59
|
desc "configure API_KEY PASSWORD STORE THEME_ID", "generate a config file for the store to connect to"
|
59
60
|
def configure(api_key=nil, password=nil, store=nil, theme_id=nil)
|
60
|
-
config = {:api_key => api_key, :password => password, :store => store, :theme_id => theme_id}
|
61
|
+
config = {:api_key => api_key, :password => password, :store => store, :theme_id => theme_id, :whitelist_files => Filters::Whitelist::DEFAULT_WHITELIST}
|
61
62
|
create_file('config.yml', config.to_yaml)
|
62
63
|
check(true)
|
63
64
|
end
|
@@ -72,7 +73,7 @@ module ShopifyTheme
|
|
72
73
|
method_option :master, :type => :boolean, :default => false
|
73
74
|
method_option :version, :type => :string, :default => "latest"
|
74
75
|
def bootstrap(api_key=nil, password=nil, store=nil, theme_name=nil)
|
75
|
-
ShopifyTheme.config = {:api_key => api_key, :password => password, :store => store}
|
76
|
+
ShopifyTheme.config = {:api_key => api_key, :password => password, :store => store, :whitelist_files => Filters::Whitelist::DEFAULT_WHITELIST}
|
76
77
|
check(true)
|
77
78
|
|
78
79
|
theme_name ||= 'Timber'
|
@@ -98,7 +99,7 @@ module ShopifyTheme
|
|
98
99
|
method_option :exclude
|
99
100
|
def download(*keys)
|
100
101
|
check(true)
|
101
|
-
assets = keys
|
102
|
+
assets = assets_for(keys, ShopifyTheme.asset_list)
|
102
103
|
|
103
104
|
if options['exclude']
|
104
105
|
assets = assets.delete_if { |asset| asset =~ Regexp.new(options['exclude']) }
|
@@ -122,6 +123,7 @@ module ShopifyTheme
|
|
122
123
|
method_option :quiet, :type => :boolean, :default => false
|
123
124
|
def upload(*keys)
|
124
125
|
check(true)
|
126
|
+
assets = assets_for(keys, local_assets_list)
|
125
127
|
assets = keys.empty? ? local_assets_list : keys
|
126
128
|
assets.each do |asset|
|
127
129
|
send_asset(asset, options['quiet'])
|
@@ -192,6 +194,13 @@ module ShopifyTheme
|
|
192
194
|
end
|
193
195
|
end
|
194
196
|
|
197
|
+
def local_assets_list
|
198
|
+
FileFilters.new(
|
199
|
+
Filters::Whitelist.new(ShopifyTheme.whitelist_files),
|
200
|
+
Filters::Blacklist.new(ShopifyTheme.ignore_files)
|
201
|
+
).select(local_files)
|
202
|
+
end
|
203
|
+
|
195
204
|
protected
|
196
205
|
|
197
206
|
def config
|
@@ -205,6 +214,10 @@ module ShopifyTheme
|
|
205
214
|
end
|
206
215
|
|
207
216
|
private
|
217
|
+
def assets_for(keys=[], files=[])
|
218
|
+
filter = FileFilters.new(Filters::CommandInput.new(keys))
|
219
|
+
filter.select(files)
|
220
|
+
end
|
208
221
|
|
209
222
|
def watcher
|
210
223
|
FileWatcher.new(Dir.pwd).watch() do |filename, event|
|
@@ -212,13 +225,6 @@ module ShopifyTheme
|
|
212
225
|
end
|
213
226
|
end
|
214
227
|
|
215
|
-
def local_assets_list
|
216
|
-
local_files.reject do |p|
|
217
|
-
@permitted_files ||= (DEFAULT_WHITELIST | ShopifyTheme.whitelist_files).map{|pattern| Regexp.new(pattern)}
|
218
|
-
@permitted_files.none? { |regex| regex =~ p } || ShopifyTheme.ignore_files.any? { |regex| regex =~ p }
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
228
|
def local_files
|
223
229
|
Dir.glob(File.join('**', '*')).reject do |f|
|
224
230
|
File.directory?(f)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'shopify_theme/filters/blacklist'
|
2
|
+
require 'shopify_theme/filters/whitelist'
|
3
|
+
require 'shopify_theme/filters/command_input'
|
4
|
+
|
5
|
+
module ShopifyTheme
|
6
|
+
class FileFilters
|
7
|
+
def initialize(*filters)
|
8
|
+
raise ArgumentError, "Must have at least one filter to apply" unless filters.length > 0
|
9
|
+
@filters = filters
|
10
|
+
end
|
11
|
+
|
12
|
+
def select(list)
|
13
|
+
@filters.reduce(list) do |results, filter|
|
14
|
+
filter.select(results)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ShopifyTheme
|
2
|
+
module Filters
|
3
|
+
class Blacklist
|
4
|
+
attr_reader :patterns
|
5
|
+
|
6
|
+
def initialize(pattern_strings=[])
|
7
|
+
@patterns = pattern_strings.map { |p| Regexp.new(p)}
|
8
|
+
end
|
9
|
+
|
10
|
+
def select(list)
|
11
|
+
list.select do |entry|
|
12
|
+
patterns.none? { |pat| pat.match(entry) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ShopifyTheme
|
2
|
+
module Filters
|
3
|
+
class CommandInput
|
4
|
+
attr_reader :patterns
|
5
|
+
def initialize(inputs=[])
|
6
|
+
@patterns = inputs.map { |i| Regexp.compile(i) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def select(list)
|
10
|
+
return list if patterns.empty?
|
11
|
+
list.select { |entry|
|
12
|
+
patterns.any? { |pat| pat.match(entry) }
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ShopifyTheme
|
2
|
+
module Filters
|
3
|
+
class Whitelist
|
4
|
+
DEFAULT_WHITELIST = %w(layout/ assets/ config/ snippets/ templates/ locales/)
|
5
|
+
|
6
|
+
attr_reader :patterns
|
7
|
+
|
8
|
+
def initialize(pattern_strings=[])
|
9
|
+
@patterns = (pattern_strings.empty? ? DEFAULT_WHITELIST : pattern_strings).map { |pattern| Regexp.new(pattern) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def select(list)
|
13
|
+
list.select do |entry|
|
14
|
+
patterns.any? { |pat| pat.match(entry) }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/spec/unit/cli_spec.rb
CHANGED
@@ -36,17 +36,22 @@ module ShopifyTheme
|
|
36
36
|
|
37
37
|
it "should remove assets that are not a part of the white list" do
|
38
38
|
@cli.local_files = ['assets/image.png', 'config.yml', 'layout/theme.liquid', 'locales/en.default.json']
|
39
|
-
|
40
|
-
assert_equal
|
41
|
-
|
39
|
+
assert_equal 3, @cli.local_assets_list.length
|
40
|
+
assert_equal false, @cli.local_assets_list.include?('config.yml')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should only use the whitelist entries for determining which files to upload (bug #156)' do
|
44
|
+
@cli.local_files = %w(assets/application.css.liquid assets/application.js assets/image.png assets/bunny.jpg layout/index.liquid snippets/preview.liquid)
|
45
|
+
ShopifyTheme.config = {whitelist_files: %w(assets/application.css.liquid assets/application.js layout/ snippets/)}
|
46
|
+
assert_equal 4, @cli.local_assets_list.length
|
47
|
+
assert_equal false, @cli.local_assets_list.include?('assets/image.png')
|
42
48
|
end
|
43
49
|
|
44
50
|
it "should remove assets that are part of the ignore list" do
|
45
51
|
ShopifyTheme.config = {ignore_files: ['config/settings.html']}
|
46
52
|
@cli.local_files = ['assets/image.png', 'layout/theme.liquid', 'config/settings.html']
|
47
|
-
|
48
|
-
assert_equal
|
49
|
-
assert_equal false, local_assets_list.include?('config/settings.html')
|
53
|
+
assert_equal 2, @cli.local_assets_list.length
|
54
|
+
assert_equal false, @cli.local_assets_list.include?('config/settings.html')
|
50
55
|
end
|
51
56
|
|
52
57
|
it "should generate the shop path URL to the query parameter preview_theme_id if the id is present" do
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shopify_theme/file_filters'
|
3
|
+
|
4
|
+
module ShopifyTheme
|
5
|
+
describe "FileFilters" do
|
6
|
+
class IdentityFilter
|
7
|
+
def select(list)
|
8
|
+
list.select { true }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class EvenFilter
|
13
|
+
def select(list)
|
14
|
+
list.select { |i| i % 2 == 0 }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "initializing without a filter raises an error" do
|
19
|
+
assert_raises ArgumentError do
|
20
|
+
FileFilters.new
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "initializing with a single filter" do
|
25
|
+
begin
|
26
|
+
FileFilters.new(IdentityFilter.new)
|
27
|
+
rescue Error => e
|
28
|
+
flunk("Initializing with a single filter should not fail. #{e}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should only select entries that were valid for all of the given filters" do
|
33
|
+
filters = FileFilters.new(IdentityFilter.new, EvenFilter.new)
|
34
|
+
assert_equal [2, 4], filters.select([1, 2, 3, 4, 5])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shopify_theme/filters/blacklist'
|
3
|
+
|
4
|
+
|
5
|
+
module ShopifyTheme
|
6
|
+
module Filters
|
7
|
+
describe "Blacklist" do
|
8
|
+
TEST_PATHS = %w(
|
9
|
+
settings.html
|
10
|
+
config/item1.html
|
11
|
+
config/item2.html
|
12
|
+
config/item3.html
|
13
|
+
layout/thing1.html
|
14
|
+
assets/application.css.liquid
|
15
|
+
assets/application.js
|
16
|
+
templates/thing2.html
|
17
|
+
snippets/fancy.liquid
|
18
|
+
)
|
19
|
+
|
20
|
+
it "should return the entire list back if initialized with no patterns" do
|
21
|
+
blacklist = Blacklist.new
|
22
|
+
assert_equal TEST_PATHS, blacklist.select(TEST_PATHS)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return everything except for the items that matched the pattern" do
|
26
|
+
blacklist = Blacklist.new(%w(config/* settings.html assets/* templates/* snippets/*))
|
27
|
+
assert_equal %w(layout/thing1.html), blacklist.select(TEST_PATHS)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shopify_theme/filters/command_input'
|
3
|
+
|
4
|
+
module ShopifyTheme
|
5
|
+
module Filters
|
6
|
+
describe "CommandInput" do
|
7
|
+
it "should return the entire list if initialized with nothing" do
|
8
|
+
filter = CommandInput.new([])
|
9
|
+
assert_equal %w(a b c d e f), filter.select(%w(a b c d e f))
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return a subset if initialized with some values" do
|
13
|
+
filter = CommandInput.new(%w(a c d))
|
14
|
+
assert_equal %w(a c d a), filter.select(%w(a b c d e a f))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shopify_theme/filters/whitelist'
|
3
|
+
|
4
|
+
module ShopifyTheme
|
5
|
+
module Filters
|
6
|
+
describe "Whitelist" do
|
7
|
+
TEST_PATHS = %w(
|
8
|
+
settings.html
|
9
|
+
config/item1.html
|
10
|
+
config/item2.html
|
11
|
+
config/item3.html
|
12
|
+
layout/thing1.html
|
13
|
+
assets/application.css.liquid
|
14
|
+
assets/application.js
|
15
|
+
templates/thing2.html
|
16
|
+
snippets/fancy.liquid
|
17
|
+
)
|
18
|
+
|
19
|
+
it "should use the default whitelist if nothing was provided" do
|
20
|
+
whitelist = Whitelist.new
|
21
|
+
expected = %w(
|
22
|
+
config/item1.html
|
23
|
+
config/item2.html
|
24
|
+
config/item3.html
|
25
|
+
layout/thing1.html
|
26
|
+
assets/application.css.liquid
|
27
|
+
assets/application.js
|
28
|
+
templates/thing2.html
|
29
|
+
snippets/fancy.liquid
|
30
|
+
)
|
31
|
+
assert_equal expected, whitelist.select(TEST_PATHS)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should ignore the default 1+ whitelists were provided" do
|
35
|
+
whitelist = Whitelist.new %w(settings.html config/item1.html config/item2.html config/item3.html layout/ templates/)
|
36
|
+
expected = %w(settings.html config/item1.html config/item2.html config/item3.html layout/thing1.html templates/thing2.html)
|
37
|
+
assert_equal expected, whitelist.select(TEST_PATHS)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shopify_theme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Duff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -174,6 +174,10 @@ files:
|
|
174
174
|
- lib/shopify_theme.rb
|
175
175
|
- lib/shopify_theme/api_checker.rb
|
176
176
|
- lib/shopify_theme/cli.rb
|
177
|
+
- lib/shopify_theme/file_filters.rb
|
178
|
+
- lib/shopify_theme/filters/blacklist.rb
|
179
|
+
- lib/shopify_theme/filters/command_input.rb
|
180
|
+
- lib/shopify_theme/filters/whitelist.rb
|
177
181
|
- lib/shopify_theme/releases.rb
|
178
182
|
- lib/shopify_theme/version.rb
|
179
183
|
- shipit.rubygems.yml
|
@@ -185,6 +189,10 @@ files:
|
|
185
189
|
- spec/spec_helper.rb
|
186
190
|
- spec/unit/api_checker_spec.rb
|
187
191
|
- spec/unit/cli_spec.rb
|
192
|
+
- spec/unit/file_filters_spec.rb
|
193
|
+
- spec/unit/filters/blacklist_spec.rb
|
194
|
+
- spec/unit/filters/command_input_spec.rb
|
195
|
+
- spec/unit/filters/whitelist_spec.rb
|
188
196
|
- spec/unit/releases_spec.rb
|
189
197
|
homepage: https://github.com/Shopify/shopify_theme
|
190
198
|
licenses:
|