bootic_cli 0.3.0 → 0.4.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 +4 -4
- data/bin/bootic +1 -1
- data/lib/bootic_cli/cli.rb +2 -2
- data/lib/bootic_cli/commands/themes.rb +47 -19
- data/lib/bootic_cli/themes/api_theme.rb +8 -0
- data/lib/bootic_cli/themes/fs_theme.rb +12 -11
- data/lib/bootic_cli/themes/mem_theme.rb +8 -0
- data/lib/bootic_cli/themes/theme_selector.rb +24 -22
- data/lib/bootic_cli/themes/workflows.rb +12 -5
- data/lib/bootic_cli/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c74b9f852a960a50c152cef0dc870ecf9e39eb46
|
4
|
+
data.tar.gz: 8badbddd5640c48465531fc40ab690fe83ebdfb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f3a737ceaadbe4a4533fedcfaa90c98ef627aa01d5e4807a271538588608731f5bfeb354df730f242633c50d0bacc00ada01520a6a41f9b0ff274a66d942dd1
|
7
|
+
data.tar.gz: 1b5f6e3e05545c14365eaaa5c759ea209758bbec3c90e8d880bb97c94ad07eb74c6f29fb3398c362c4ee9fe42e1cfa40e8a4f4f3437356771fda28716310eea1
|
data/bin/bootic
CHANGED
data/lib/bootic_cli/cli.rb
CHANGED
@@ -123,7 +123,7 @@ module BooticCli
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
-
desc
|
126
|
+
desc 'erase', 'Clear all credentials from this computer'
|
127
127
|
def erase
|
128
128
|
if session.setup?
|
129
129
|
session.erase!
|
@@ -208,7 +208,7 @@ module BooticCli
|
|
208
208
|
end
|
209
209
|
end
|
210
210
|
|
211
|
-
require
|
211
|
+
require 'bootic_cli/command'
|
212
212
|
|
213
213
|
Dir[File.join(File.dirname(__FILE__), 'commands', '*.rb')].each do |f|
|
214
214
|
load_file f
|
@@ -13,46 +13,55 @@ module BooticCli
|
|
13
13
|
|
14
14
|
desc 'clone [dir]', 'Clone remote theme into directory [dir]'
|
15
15
|
option :shop, banner: '<shop_subdomain>', type: :string
|
16
|
-
option :
|
17
|
-
option :
|
16
|
+
option :public, banner: '<true|false>', type: :boolean, aliases: '-p', desc: 'Clones public theme, even if dev theme exists'
|
17
|
+
option :dev, banner: '<true|false>', type: :boolean, aliases: '-d', desc: 'Clones development theme, or creates one if missing'
|
18
18
|
def clone(dir = nil)
|
19
19
|
logged_in_action do
|
20
|
-
local_theme, remote_theme = theme_selector.setup_theme_pair(options['shop'], dir, options['public'])
|
21
|
-
|
20
|
+
local_theme, remote_theme = theme_selector.setup_theme_pair(options['shop'], dir, options['public'], options['dev'])
|
21
|
+
|
22
|
+
if File.exist?(local_theme.path)
|
23
|
+
prompt.say "Directory already exists! (#{local_theme.path})", :red
|
24
|
+
else
|
25
|
+
prompt.say "Cloning theme files into #{local_theme.path}"
|
26
|
+
workflows.pull(local_theme, remote_theme)
|
27
|
+
local_theme.write_subdomain
|
28
|
+
end
|
22
29
|
end
|
23
30
|
end
|
24
31
|
|
25
32
|
desc 'pull', 'Pull remote changes into current theme directory'
|
26
|
-
option :public, banner: '<true|false>', type: :boolean,
|
27
|
-
option :
|
33
|
+
option :public, banner: '<true|false>', type: :boolean, aliases: '-p', desc: 'Pull from public theme, even if dev theme exists'
|
34
|
+
option :delete, banner: '<true|false>', type: :boolean, desc: 'Remove local files that were removed in remote theme (default: true)'
|
28
35
|
def pull
|
29
36
|
within_theme do
|
30
37
|
local_theme, remote_theme = theme_selector.select_theme_pair(default_subdomain, current_dir, options['public'])
|
31
|
-
workflows.pull(local_theme, remote_theme,
|
38
|
+
workflows.pull(local_theme, remote_theme, delete: options['delete'] || true)
|
32
39
|
end
|
33
40
|
end
|
34
41
|
|
35
42
|
desc 'push', 'Push all local theme files in current dir to remote shop'
|
36
|
-
option :public, banner: '<true|false>', type: :boolean,
|
37
|
-
option :
|
43
|
+
option :public, banner: '<true|false>', type: :boolean, aliases: '-p', desc: 'Push to public theme, even if dev theme exists'
|
44
|
+
option :delete, banner: '<true|false>', type: :boolean, desc: 'Remove files in remote theme that were removed locally (default: true)'
|
38
45
|
def push
|
39
46
|
within_theme do
|
40
47
|
local_theme, remote_theme = theme_selector.select_theme_pair(default_subdomain, current_dir, options['public'])
|
41
|
-
|
48
|
+
warn_user if remote_theme.public? and options['public'].nil?
|
49
|
+
workflows.push(local_theme, remote_theme, delete: options['delete'] || true)
|
42
50
|
end
|
43
51
|
end
|
44
52
|
|
45
|
-
desc 'sync', 'Sync local theme copy
|
46
|
-
option :public, banner: '<true|false>', type: :boolean,
|
53
|
+
desc 'sync', 'Sync changes from local theme copy with remote'
|
54
|
+
option :public, banner: '<true|false>', type: :boolean, aliases: '-p', desc: 'Sync to public theme, even if dev theme exists'
|
47
55
|
def sync
|
48
56
|
within_theme do
|
49
57
|
local_theme, remote_theme = theme_selector.select_theme_pair(default_subdomain, current_dir, options['public'])
|
58
|
+
warn_user if remote_theme.public? and options['public'].nil?
|
50
59
|
workflows.sync(local_theme, remote_theme)
|
51
60
|
end
|
52
61
|
end
|
53
62
|
|
54
63
|
desc 'compare', 'Show differences between local and remote copies'
|
55
|
-
option :public, banner: '<true|false>', type: :boolean,
|
64
|
+
option :public, banner: '<true|false>', type: :boolean, aliases: '-p', desc: 'Compare against public theme, even if dev theme exists'
|
56
65
|
def compare
|
57
66
|
within_theme do
|
58
67
|
local_theme, remote_theme = theme_selector.select_theme_pair(default_subdomain, current_dir, options['public'])
|
@@ -60,11 +69,12 @@ module BooticCli
|
|
60
69
|
end
|
61
70
|
end
|
62
71
|
|
63
|
-
desc 'watch', 'Watch local theme
|
64
|
-
option :public, banner: '<true|false>', type: :boolean,
|
72
|
+
desc 'watch', 'Watch local theme dir and update remote when any file changes'
|
73
|
+
option :public, banner: '<true|false>', type: :boolean, aliases: '-p', desc: 'Pushes any changes to public theme, even if dev theme exists'
|
65
74
|
def watch
|
66
75
|
within_theme do
|
67
76
|
_, remote_theme = theme_selector.select_theme_pair(default_subdomain, current_dir, options['public'])
|
77
|
+
warn_user if remote_theme.public? and options['public'].nil?
|
68
78
|
workflows.watch(current_dir, remote_theme)
|
69
79
|
end
|
70
80
|
end
|
@@ -78,7 +88,7 @@ module BooticCli
|
|
78
88
|
end
|
79
89
|
|
80
90
|
desc 'open', 'Open theme preview URL in a browser'
|
81
|
-
option :public, banner: '<true|false>', type: :boolean,
|
91
|
+
option :public, banner: '<true|false>', type: :boolean, aliases: '-p', desc: 'Opens public theme URL'
|
82
92
|
def open
|
83
93
|
within_theme do
|
84
94
|
_, remote_theme = theme_selector.select_theme_pair(default_subdomain, current_dir, options['public'])
|
@@ -97,9 +107,15 @@ module BooticCli
|
|
97
107
|
|
98
108
|
private
|
99
109
|
|
110
|
+
def warn_user
|
111
|
+
unless prompt.yes_or_no?("You're pushing changes directly to your public theme. Are you sure?", true)
|
112
|
+
prompt.say("Ok, sure. You can skip the above warning prompt by passing a `--public` flag.")
|
113
|
+
abort
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
100
117
|
def within_theme(&block)
|
101
|
-
|
102
|
-
unless File.exist?(File.join(dir, 'layout.html'))
|
118
|
+
unless is_within_theme?
|
103
119
|
prompt.say "This directory doesn't look like a Bootic theme! (#{dir})", :magenta
|
104
120
|
abort
|
105
121
|
end
|
@@ -109,6 +125,11 @@ module BooticCli
|
|
109
125
|
end
|
110
126
|
end
|
111
127
|
|
128
|
+
def is_within_theme?
|
129
|
+
dir = File.expand_path(current_dir)
|
130
|
+
File.exist?(File.join(dir, 'layout.html'))
|
131
|
+
end
|
132
|
+
|
112
133
|
def current_dir
|
113
134
|
'.'
|
114
135
|
end
|
@@ -136,7 +157,14 @@ module BooticCli
|
|
136
157
|
|
137
158
|
def yes_or_no?(question, default_answer)
|
138
159
|
default_char = default_answer ? 'y' : 'n'
|
139
|
-
|
160
|
+
|
161
|
+
begin
|
162
|
+
input = shell.ask("#{question} [#{default_char}]").strip
|
163
|
+
rescue Interrupt
|
164
|
+
say "\nCtrl-C received. Bailing out!", :red
|
165
|
+
abort
|
166
|
+
end
|
167
|
+
|
140
168
|
return default_answer if input == '' || input.downcase == default_char
|
141
169
|
!default_answer
|
142
170
|
end
|
@@ -31,12 +31,20 @@ module BooticCli
|
|
31
31
|
[item, type]
|
32
32
|
end
|
33
33
|
|
34
|
-
attr_reader :subdomain
|
35
|
-
|
36
34
|
def initialize(dir, subdomain: nil)
|
37
35
|
@dir = dir
|
38
36
|
@setup = false
|
39
|
-
@subdomain = subdomain
|
37
|
+
@subdomain = subdomain
|
38
|
+
end
|
39
|
+
|
40
|
+
def subdomain
|
41
|
+
@subdomain || read_subdomain
|
42
|
+
end
|
43
|
+
|
44
|
+
def write_subdomain
|
45
|
+
store.transaction do
|
46
|
+
store['subdomain'] = @subdomain
|
47
|
+
end
|
40
48
|
end
|
41
49
|
|
42
50
|
def reset!
|
@@ -132,15 +140,8 @@ module BooticCli
|
|
132
140
|
)
|
133
141
|
end
|
134
142
|
|
135
|
-
def write_subdomain(sub)
|
136
|
-
store.transaction do
|
137
|
-
store['subdomain'] = sub
|
138
|
-
end
|
139
|
-
sub
|
140
|
-
end
|
141
|
-
|
142
143
|
def read_subdomain
|
143
|
-
store.transaction{ store['subdomain'] }
|
144
|
+
store.transaction { store['subdomain'] }
|
144
145
|
end
|
145
146
|
end
|
146
147
|
end
|
@@ -9,16 +9,27 @@ module BooticCli
|
|
9
9
|
@prompt = prompt
|
10
10
|
end
|
11
11
|
|
12
|
-
def setup_theme_pair(subdomain, dir = nil,
|
12
|
+
def setup_theme_pair(subdomain, dir = nil, wants_public = false, wants_dev = false)
|
13
|
+
raise "Cannot pass both public and dev flags at the same time!" if wants_public && wants_dev
|
14
|
+
|
13
15
|
shop = find_remote_shop(subdomain)
|
14
16
|
raise "No shop with subdomain #{subdomain}" unless shop
|
15
17
|
|
16
18
|
path = dir || shop.subdomain
|
17
|
-
local_theme
|
18
|
-
remote_theme = select_remote_theme(shop,
|
19
|
+
local_theme = select_local_theme(path, shop.subdomain)
|
20
|
+
remote_theme = select_remote_theme(shop, wants_public)
|
21
|
+
|
22
|
+
# if no `wants_public` flag was passed and no dev theme is present
|
23
|
+
# ask the user whether he/she wants to create one now.
|
24
|
+
if !wants_public and remote_theme.public?
|
25
|
+
raise 'Dev theme not available!' unless shop.themes.can?(:create_dev_theme)
|
26
|
+
|
27
|
+
if wants_dev or prompt.yes_or_no?("Would you like to create (and work on) a development version of your theme? (recommended)", true)
|
28
|
+
prompt.say "Good thinking. Creating a development theme out of your current public one...", :green
|
29
|
+
remote_theme = shop.themes.create_dev_theme
|
30
|
+
end
|
31
|
+
end
|
19
32
|
|
20
|
-
prompt.say "Cloning theme files into #{local_theme.path}"
|
21
|
-
prompt.say "Preview this theme at #{remote_theme.path}", :magenta
|
22
33
|
[local_theme, remote_theme]
|
23
34
|
end
|
24
35
|
|
@@ -27,15 +38,15 @@ module BooticCli
|
|
27
38
|
shop = find_remote_shop(local_theme.subdomain)
|
28
39
|
raise "No shop with subdomain #{local_theme.subdomain}" unless shop
|
29
40
|
remote_theme = select_remote_theme(shop, production)
|
30
|
-
|
31
|
-
prompt.say "Preview this theme at #{remote_theme.path}", :magenta
|
32
41
|
[local_theme, remote_theme]
|
33
42
|
end
|
34
43
|
|
35
44
|
def pair(subdomain, dir)
|
36
45
|
shop = find_remote_shop(subdomain)
|
37
46
|
raise "No shop with subdomain #{subdomain}" unless shop
|
38
|
-
select_local_theme(dir, subdomain)
|
47
|
+
theme = select_local_theme(dir, subdomain)
|
48
|
+
theme.write_subdomain
|
49
|
+
theme
|
39
50
|
end
|
40
51
|
|
41
52
|
def select_local_theme(dir, subdomain = nil)
|
@@ -62,24 +73,15 @@ module BooticCli
|
|
62
73
|
private
|
63
74
|
|
64
75
|
def resolve_remote_theme(shop, production = false)
|
65
|
-
if production
|
66
|
-
prompt.say "Working on public theme of shop #{shop.subdomain}", :
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
prompt.say "Working on development theme of shop #{shop.subdomain}", :green
|
71
|
-
themes = shop.themes
|
72
|
-
if themes.has?(:dev_theme)
|
73
|
-
themes.dev_theme
|
74
|
-
elsif themes.can?(:create_dev_theme)
|
75
|
-
prompt.say "Creating development theme...", :green
|
76
|
-
themes.create_dev_theme
|
76
|
+
if production or !shop.themes.has?(:dev_theme)
|
77
|
+
prompt.say "Working on public theme of shop #{shop.subdomain}", :yellow
|
78
|
+
shop.theme
|
77
79
|
else
|
78
|
-
|
80
|
+
prompt.say "Working on development theme of shop #{shop.subdomain}", :green
|
81
|
+
shop.themes.dev_theme
|
79
82
|
end
|
80
83
|
end
|
81
84
|
|
82
|
-
private
|
83
85
|
attr_reader :root, :prompt
|
84
86
|
end
|
85
87
|
end
|
@@ -31,7 +31,7 @@ module BooticCli
|
|
31
31
|
@prompt = prompt
|
32
32
|
end
|
33
33
|
|
34
|
-
def pull(local_theme, remote_theme,
|
34
|
+
def pull(local_theme, remote_theme, delete: true)
|
35
35
|
diff = ThemeDiff.new(source: local_theme, target: remote_theme)
|
36
36
|
check_dupes!(local_theme.assets)
|
37
37
|
|
@@ -45,7 +45,7 @@ module BooticCli
|
|
45
45
|
local_theme.add_template t.file_name, t.body
|
46
46
|
end
|
47
47
|
|
48
|
-
if
|
48
|
+
if delete
|
49
49
|
notice 'Removing local files that were removed on remote...'
|
50
50
|
remove_all(diff.missing_in_target, local_theme)
|
51
51
|
else
|
@@ -56,9 +56,11 @@ module BooticCli
|
|
56
56
|
copy_templates(diff.missing_in_source, local_theme, download_opts)
|
57
57
|
# lets copy all of them and let user decide to overwrite existing
|
58
58
|
copy_assets(remote_theme, local_theme, download_opts)
|
59
|
+
|
60
|
+
prompt.say "Done! Preview this theme at #{remote_theme.path}", :cyan
|
59
61
|
end
|
60
62
|
|
61
|
-
def push(local_theme, remote_theme,
|
63
|
+
def push(local_theme, remote_theme, delete: true)
|
62
64
|
diff = ThemeDiff.new(source: local_theme, target: remote_theme)
|
63
65
|
check_dupes!(local_theme.assets)
|
64
66
|
|
@@ -74,12 +76,14 @@ module BooticCli
|
|
74
76
|
copy_assets(diff.missing_in_target, remote_theme, overwrite: true)
|
75
77
|
copy_templates(diff.missing_in_target, remote_theme)
|
76
78
|
|
77
|
-
if
|
79
|
+
if delete
|
78
80
|
notice 'Removing remote files that were removed locally...'
|
79
81
|
remove_all(diff.missing_in_source, remote_theme)
|
80
82
|
else
|
81
83
|
notice 'Not removing remote files that were removed locally.'
|
82
84
|
end
|
85
|
+
|
86
|
+
prompt.say "Done! View updated version at #{remote_theme.path}", :cyan
|
83
87
|
end
|
84
88
|
|
85
89
|
def sync(local_theme, remote_theme)
|
@@ -112,6 +116,8 @@ module BooticCli
|
|
112
116
|
notice 'Uploading missing remote templates & assets...'
|
113
117
|
copy_templates(diff.missing_in_target, remote_theme, download_opts)
|
114
118
|
copy_assets(diff.missing_in_target, remote_theme, overwrite: true)
|
119
|
+
|
120
|
+
prompt.say "Synced! Preview this theme at #{remote_theme.path}", :cyan
|
115
121
|
end
|
116
122
|
|
117
123
|
def compare(local_theme, remote_theme)
|
@@ -181,6 +187,7 @@ module BooticCli
|
|
181
187
|
exit
|
182
188
|
}
|
183
189
|
|
190
|
+
prompt.say "Preview changes at #{remote_theme.path}", :cyan
|
184
191
|
Kernel.sleep
|
185
192
|
end
|
186
193
|
|
@@ -188,7 +195,7 @@ module BooticCli
|
|
188
195
|
keep_old_theme = prompt.yes_or_no?("Do you want to keep your old public theme as your dev theme?", false)
|
189
196
|
# first push local files to dev theme
|
190
197
|
prompt.say "Pushing local changes to development theme"
|
191
|
-
push
|
198
|
+
push(local_theme, remote_theme, delete: true)
|
192
199
|
# now publish remote dev theme
|
193
200
|
# let it fail if remote_theme doesn't respond to #publish
|
194
201
|
prompt.notice "Publishing development theme"
|
data/lib/bootic_cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootic_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ismael Celis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|