opencode_theme 1.0.5 → 1.0.6
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/opencode +2 -2
- data/lib/opencode_theme.rb +3 -7
- data/lib/opencode_theme/base_service.rb +43 -22
- data/lib/opencode_theme/cli.rb +172 -155
- data/lib/opencode_theme/version.rb +1 -1
- data/opencode_theme.gemspec +7 -3
- data/spec/cassettes_local/bootstrap/valid.yml +4252 -0
- data/spec/cassettes_local/clean/invalid.yml +36 -0
- data/spec/cassettes_local/components/list.yml +1881 -0
- data/spec/cassettes_local/configure/invalid2.yml +36 -0
- data/spec/cassettes_local/configure/invalid3.yml +36 -0
- data/spec/cassettes_local/configure/valid.yml +36 -0
- data/spec/cassettes_local/delete/valid.yml +36 -0
- data/spec/cassettes_local/download/valid_single.yml +39 -0
- data/spec/cassettes_local/download/valid_theme.yml +4182 -0
- data/spec/cassettes_local/list/invalid.yml +36 -0
- data/spec/cassettes_local/list/valid.yml +297 -0
- data/spec/cassettes_local/process_install/download.yml +221 -0
- data/spec/cassettes_local/subject/valid.yml +38 -0
- data/spec/cassettes_local/units/components/list.yml +298 -0
- data/spec/cassettes_local/units/components/list_tag/wrong.yml +65 -0
- data/spec/cassettes_local/upload/valid_single.yml +39 -0
- data/spec/cassettes_local/upload/valid_theme.yml +4035 -0
- data/spec/functional/functional_spec.rb +168 -85
- data/spec/spec_helper.rb +6 -0
- data/spec/unit/components/install_spec.rb +55 -0
- data/spec/unit/components/list_spec.rb +29 -0
- data/spec/unit/components/process_install_spec.rb +28 -0
- metadata +79 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b31d3bda90a5294781ad0976e613e1d8aad3a86
|
4
|
+
data.tar.gz: 0c527af5921856b60d29db88cb1a7457fe25f982
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05dbbb461ccd12335fa79189680c628c79d3b6705062e780d4cee9fc49cf4a951628ee94d662d6d05f0a476ffa78b50bd557ab1627d45873badf8c4b402fe37d
|
7
|
+
data.tar.gz: 9349963d73f29cbc2e5d90692fe8624b5c613c0cb5a95ec9c8fe11fdd65909be980523b42df4c03f2dd8b90d627cea6ffee318fb4c52e18abe9259d296479b6c
|
data/bin/opencode
CHANGED
@@ -8,7 +8,7 @@ def fallback_load_path(path)
|
|
8
8
|
yield
|
9
9
|
rescue LoadError
|
10
10
|
unless retried
|
11
|
-
|
11
|
+
$LOAD_PATH << path
|
12
12
|
retried = true
|
13
13
|
retry
|
14
14
|
end
|
@@ -19,4 +19,4 @@ fallback_load_path(File.join(File.dirname(__FILE__), '..', 'lib')) do
|
|
19
19
|
require 'opencode_theme'
|
20
20
|
require 'opencode_theme/cli'
|
21
21
|
end
|
22
|
-
OpencodeTheme::Cli.start(ARGV)
|
22
|
+
OpencodeTheme::Cli.start(ARGV)
|
data/lib/opencode_theme.rb
CHANGED
@@ -3,7 +3,7 @@ require 'opencode_theme/base_service'
|
|
3
3
|
|
4
4
|
module OpencodeTheme
|
5
5
|
|
6
|
-
NOOPParser = Proc.new {|data, format| {} }
|
6
|
+
NOOPParser = Proc.new { |data, format| {} }
|
7
7
|
TIMER_RESET = 10
|
8
8
|
PERMIT_LOWER_LIMIT = 3
|
9
9
|
CONFIG_FILE = 'config.yml'
|
@@ -12,10 +12,6 @@ module OpencodeTheme
|
|
12
12
|
ENV['test']
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.critical_permits?
|
16
|
-
@@total_api_calls.to_i - @@current_api_call_count.to_i < PERMIT_LOWER_LIMIT
|
17
|
-
end
|
18
|
-
|
19
15
|
def self.passed_api_refresh?
|
20
16
|
delta_seconds > TIMER_RESET
|
21
17
|
end
|
@@ -40,7 +36,7 @@ module OpencodeTheme
|
|
40
36
|
config = YAML.load(File.read(CONFIG_FILE))
|
41
37
|
config
|
42
38
|
else
|
43
|
-
puts "#{CONFIG_FILE}
|
39
|
+
puts "#{CONFIG_FILE} não encontrado!" unless test?
|
44
40
|
{}
|
45
41
|
end
|
46
42
|
end
|
@@ -71,4 +67,4 @@ module OpencodeTheme
|
|
71
67
|
(config[:whitelist_files] || []).compact
|
72
68
|
end
|
73
69
|
|
74
|
-
end
|
70
|
+
end
|
@@ -1,56 +1,73 @@
|
|
1
1
|
require 'httparty'
|
2
|
+
|
2
3
|
module OpencodeTheme
|
3
4
|
include HTTParty
|
4
5
|
default_options.update(verify: false)
|
5
6
|
@@current_api_call_count = 0
|
6
|
-
@@total_api_calls = 40
|
7
7
|
URL_API = 'https://opencode.tray.com.br'
|
8
8
|
|
9
9
|
def self.api_usage
|
10
|
-
|
10
|
+
''
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.check_config
|
14
|
-
response = opencode_theme.post('/api/check', query: { theme_id: config[:theme_id],
|
15
|
-
|
16
|
-
{ success: response.success?, response: JSON.parse(response.body) }
|
14
|
+
response = opencode_theme.post('/api/check', query: { theme_id: config[:theme_id], gem_version: OpencodeTheme::VERSION })
|
15
|
+
{ success: response.success?, response: parser_json(response.body) }
|
17
16
|
end
|
18
17
|
|
19
18
|
def self.list
|
20
19
|
response = opencode_theme.get('/api/list', query: { gem_version: OpencodeTheme::VERSION })
|
21
|
-
{ success: response.success?, response:
|
20
|
+
{ success: response.success?, response: parser_json(response.body) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.list_opencode_components
|
24
|
+
response = opencode_theme.get('/api/themes/'+config[:theme_id]+'/components', query: { gem_version: OpencodeTheme::VERSION })
|
25
|
+
{ success: response.success?, response: parser_json(response.body) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.install_opencode_components(name, user= nil, origin = nil)
|
29
|
+
return unless name
|
30
|
+
query_default = { gem_version: OpencodeTheme::VERSION }
|
31
|
+
query = query_default.merge({ origin: origin, user: user })
|
32
|
+
response = opencode_theme.post("/api/themes/#{config[:theme_id]}/components/#{name}/install", query: query)
|
33
|
+
response
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.install_opencode_components_notification(name, user= nil, origin = nil)
|
37
|
+
return unless name
|
38
|
+
query_default = { gem_version: OpencodeTheme::VERSION }
|
39
|
+
query = query_default.merge({ origin: origin, user: user, download_component: true })
|
40
|
+
opencode_route = "/api/themes/#{config[:theme_id]}/components/#{name}/install/notification"
|
41
|
+
response = opencode_theme.post(opencode_route, query: query)
|
22
42
|
end
|
23
43
|
|
24
44
|
def self.clean
|
25
|
-
response = opencode_theme.post('/api/clean_cache', query: { theme_id: config[:theme_id],
|
26
|
-
|
27
|
-
{ success: response.success?, response: JSON.parse(response.body) }
|
45
|
+
response = opencode_theme.post('/api/clean_cache', query: { theme_id: config[:theme_id], gem_version: OpencodeTheme::VERSION })
|
46
|
+
{ success: response.success?, response: parser_json(response.body) }
|
28
47
|
end
|
29
48
|
|
30
49
|
def self.theme_delete(theme_id)
|
31
50
|
response = opencode_theme.delete("/api/themes/#{theme_id}", parser: NOOPParser, query: { gem_version: OpencodeTheme::VERSION })
|
32
|
-
{ success: response.success?, response:
|
51
|
+
{ success: response.success?, response: parser_json(response.body) }
|
33
52
|
end
|
34
53
|
|
35
|
-
def self.theme_new(
|
36
|
-
response = opencode_theme.post('/api/themes',
|
37
|
-
|
38
|
-
|
39
|
-
headers: { 'Content-Type' => 'application/json'},
|
40
|
-
parser: NOOPParser )
|
41
|
-
assets = response.code == 200 ? JSON.parse(response.body)["assets"] : {}
|
42
|
-
{ success: response.success?, assets: assets, response: JSON.parse(response.body) }
|
54
|
+
def self.theme_new(_theme_base, theme_name)
|
55
|
+
response = opencode_theme.post('/api/themes', query: { gem_version: OpencodeTheme::VERSION }, body: { theme: { theme_base: theme_name, name: theme_name, gem_version: OpencodeTheme::VERSION } }.to_json, headers: { 'Content-Type' => 'application/json'}, parser: NOOPParser)
|
56
|
+
assets = response.code == 200 ? JSON.parse(response.body)['assets'] : {}
|
57
|
+
{ success: response.success?, assets: assets, response: parser_json(response.body) }
|
43
58
|
end
|
44
59
|
|
45
60
|
def self.asset_list
|
46
61
|
response = opencode_theme.get(path, parser: NOOPParser, query: { gem_version: OpencodeTheme::VERSION })
|
47
|
-
|
48
|
-
|
62
|
+
if response.code == 200
|
63
|
+
assets = response.code == 200 ? parser_json(response.body)['assets'].map { |a| a['key'][1..a['key'].length] } : response.body
|
64
|
+
assets
|
65
|
+
end
|
49
66
|
end
|
50
67
|
|
51
68
|
def self.get_asset(asset)
|
52
69
|
response = opencode_theme.get(path, query: { key: "/#{asset}", gem_version: OpencodeTheme::VERSION }, parser: NOOPParser)
|
53
|
-
asset =
|
70
|
+
asset = parser_json(response.body)
|
54
71
|
asset
|
55
72
|
end
|
56
73
|
|
@@ -65,11 +82,15 @@ module OpencodeTheme
|
|
65
82
|
response
|
66
83
|
end
|
67
84
|
|
85
|
+
def self.parser_json(body)
|
86
|
+
JSON.parse(body)
|
87
|
+
end
|
88
|
+
|
68
89
|
private
|
69
90
|
|
70
91
|
def self.opencode_theme
|
71
92
|
base_uri URL_API
|
72
|
-
headers
|
93
|
+
headers 'Authorization' => "Token token=#{config[:api_key]}_#{config[:password]}"
|
73
94
|
OpencodeTheme
|
74
95
|
end
|
75
96
|
end
|
data/lib/opencode_theme/cli.rb
CHANGED
@@ -15,38 +15,43 @@ MimeMagic.add('application/font-woff2', extensions: %w(woff2), parents: 'font/op
|
|
15
15
|
MimeMagic.add('application/vnd.ms-fontobject', extensions: %w(eot), parents: 'font/opentype')
|
16
16
|
|
17
17
|
module OpencodeTheme
|
18
|
+
|
19
|
+
module_function
|
20
|
+
|
18
21
|
class Cli < Thor
|
19
22
|
include Thor::Actions
|
20
23
|
|
21
|
-
IGNORE = %w(config.yml)
|
22
|
-
DEFAULT_WHITELIST = %w(configs/ css/ elements/ img/ layouts/ pages/ js/)
|
23
|
-
TIMEFORMAT = '%H:%M:%S'
|
24
|
-
|
25
|
-
tasks.keys.abbrev.each do |shortcut, command|
|
26
|
-
map shortcut => command.to_sym
|
27
|
-
end
|
24
|
+
IGNORE = %w(config.yml).freeze
|
25
|
+
DEFAULT_WHITELIST = %w(configs/ css/ elements/ img/ layouts/ pages/ js/).freeze
|
26
|
+
TIMEFORMAT = '%H:%M:%S'.freeze
|
28
27
|
|
29
28
|
map 'new' => :bootstrap
|
30
29
|
map 'rm' => :remove
|
31
30
|
|
31
|
+
tasks.keys.abbrev.each { |shortcut, command| map shortcut => command.to_sym }
|
32
|
+
desc 'components', "Listagem (opencode components list) ou instalação de componentes(opencode components install nome) "
|
33
|
+
def components(action = 'list', name = nil, user = 'tray-desenvolvedores', origin = 'github')
|
34
|
+
return show_list_components if action == 'list'
|
35
|
+
return install_component(name, user, origin) if action == 'install' && !name.nil?
|
36
|
+
return components_install if action == 'install' && name.nil?
|
37
|
+
end
|
38
|
+
|
32
39
|
desc 'configure API_KEY PASSWORD THEME_ID', 'Configura o tema que sera modificado'
|
33
40
|
def configure(api_key = nil, password = nil, theme_id = nil)
|
34
41
|
config = { api_key: api_key, password: password, theme_id: theme_id }
|
35
|
-
|
36
42
|
if api_key.nil? || password.nil? || theme_id.nil?
|
37
43
|
response = {}
|
38
|
-
response[
|
39
|
-
return report_error(Time.now, '
|
44
|
+
response['message'] = 'necessário informar api_key e password e theme_id.'
|
45
|
+
return report_error(Time.now, 'Configuração [FALHOU]', response)
|
40
46
|
end
|
41
47
|
OpencodeTheme.config = config
|
42
|
-
|
43
48
|
response = OpencodeTheme.check_config
|
44
49
|
if response[:success]
|
45
|
-
config
|
50
|
+
config[:preview_url] = response[:response]['preview']
|
46
51
|
create_file('config.yml', config.to_yaml, force: true)
|
47
52
|
say('Configuration [OK]', :green)
|
48
53
|
else
|
49
|
-
report_error(Time.now, '
|
54
|
+
report_error(Time.now, 'Configuração [FALHOU]', response[:response])
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
@@ -54,12 +59,11 @@ module OpencodeTheme
|
|
54
59
|
def list
|
55
60
|
config = OpencodeTheme.config
|
56
61
|
response = OpencodeTheme.list
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
62
|
+
if response[:response]['authentication'] == false
|
63
|
+
response = {}
|
64
|
+
response['message'] = 'necessário autenticação'
|
65
|
+
return report_error(Time.now, 'Configuração [FALHOU]', response)
|
66
|
+
end
|
63
67
|
if response[:success]
|
64
68
|
say("\n")
|
65
69
|
response[:response]['themes'].each do |theme|
|
@@ -77,9 +81,8 @@ module OpencodeTheme
|
|
77
81
|
end
|
78
82
|
|
79
83
|
desc 'clean', 'Limpa o cache de arquivos estáticos'
|
80
|
-
|
81
84
|
def clean
|
82
|
-
|
85
|
+
OpencodeTheme.config
|
83
86
|
response = OpencodeTheme.clean
|
84
87
|
if response[:success]
|
85
88
|
say('Clean cache [OK]\n', :green)
|
@@ -93,31 +96,25 @@ module OpencodeTheme
|
|
93
96
|
def bootstrap(api_key = nil, password = nil, theme_name = 'default', theme_base = 'default')
|
94
97
|
OpencodeTheme.config = { api_key: api_key, password: password }
|
95
98
|
check_config = OpencodeTheme.check_config
|
96
|
-
|
97
99
|
if check_config[:success]
|
98
100
|
say('Configuration [OK]', :green)
|
99
101
|
else
|
100
102
|
report_error(Time.now, 'Configuration [FAIL]', check_config[:response])
|
101
103
|
return
|
102
104
|
end
|
103
|
-
|
104
105
|
response = OpencodeTheme.theme_new(theme_base, theme_name)
|
105
|
-
|
106
106
|
if response[:success]
|
107
107
|
say("Create #{theme_name} theme on store", :green)
|
108
108
|
else
|
109
109
|
report_error(Time.now, 'Could not create a new theme', response[:response])
|
110
110
|
return
|
111
111
|
end
|
112
|
-
|
113
|
-
say("Creating directory named #{theme_name}", :green)
|
112
|
+
say("Criando diretório do tema:#{theme_name}", :green)
|
114
113
|
empty_directory(theme_name)
|
115
|
-
|
116
|
-
say("Saving configuration to #{theme_name}", :green)
|
114
|
+
say("Salvando configuração para o tema: #{theme_name}", :green)
|
117
115
|
OpencodeTheme.config.merge!(theme_id: response[:response]['theme_id'], preview_url: response[:response]['preview'])
|
118
116
|
create_file("#{theme_name}/config.yml", OpencodeTheme.config.to_yaml)
|
119
|
-
|
120
|
-
say("Downloading #{theme_name} assets from Opencode")
|
117
|
+
say("Downloading arquivos do tema #{theme_name}")
|
121
118
|
Dir.chdir(theme_name)
|
122
119
|
download
|
123
120
|
end
|
@@ -133,25 +130,30 @@ module OpencodeTheme
|
|
133
130
|
method_option :quiet, type: :boolean, default: false
|
134
131
|
method_option :exclude
|
135
132
|
def download(*keys)
|
136
|
-
assets = keys.empty?
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
133
|
+
assets = if keys.empty?
|
134
|
+
say('Aguarde enquanto listamos os arquivos...', :green)
|
135
|
+
start_time = Time.now
|
136
|
+
assets_list = OpencodeTheme.asset_list
|
137
|
+
total_assets = assets_list.count
|
138
|
+
assets_list
|
139
|
+
else
|
140
|
+
keys
|
141
|
+
end
|
142
|
+
say("encontrado: #{total_assets} arquivos" , :green)
|
143
|
+
say("o tempo de download depende da quantidade de arquivos, por favor aguarde:" , :green)
|
144
|
+
start_time = Time.now
|
145
|
+
return report_error(Time.now, 'Não foi possível listar os arquivos', JSON.parse(assets)) if assets.is_a? String
|
146
|
+
assets = assets.delete_if { |asset| asset =~ Regexp.new(options['exclude']) } if options['exclude']
|
147
|
+
|
148
|
+
assets.to_enum.with_index(1).map do |asset, accumator|
|
149
|
+
download = download_asset(URI.decode(asset))
|
150
|
+
return say("Error: #{asset}", :red) unless options['quiet'] unless download
|
151
|
+
say("[#{total_assets}/#{accumator}] Downloaded: #{asset}", :green) unless options['quiet'] #|| !download
|
154
152
|
end
|
153
|
+
|
154
|
+
finish_time = Time.now
|
155
|
+
elapsed_seconds = ((finish_time.to_f - start_time.to_f)).to_i
|
156
|
+
say("tempo total de download: #{elapsed_seconds.to_i}s")
|
155
157
|
end
|
156
158
|
|
157
159
|
desc 'upload FILE', 'Sobe o arquivo informado ou todos se FILE for omitido'
|
@@ -159,12 +161,12 @@ module OpencodeTheme
|
|
159
161
|
def upload(*keys)
|
160
162
|
assets = keys.empty? ? local_assets_list : keys
|
161
163
|
assets.each do |asset|
|
162
|
-
send_asset(
|
164
|
+
send_asset(asset.to_s, options['quiet'])
|
163
165
|
end
|
164
166
|
say('Done.', :green) unless options['quiet']
|
165
167
|
end
|
166
168
|
|
167
|
-
desc 'rm FILE', 'Remove um arquivo do tema
|
169
|
+
desc 'rm FILE', 'Remove um arquivo do tema'
|
168
170
|
method_option :quiet, type: :boolean, default: false
|
169
171
|
def remove(*keys)
|
170
172
|
keys.each do |key|
|
@@ -176,64 +178,40 @@ module OpencodeTheme
|
|
176
178
|
desc 'watch', 'Baixa e sobe um arquivo sempre que ele for salvo'
|
177
179
|
method_option :quiet, type: :boolean, default: false
|
178
180
|
method_option :keep_files, type: :boolean, default: false
|
179
|
-
|
180
|
-
|
181
|
-
# def watch
|
182
|
-
# watcher do |filename, event|
|
183
|
-
# filename = filename.gsub("#{Dir.pwd}/", '')
|
184
|
-
# unless local_assets_list.include?(filename)
|
185
|
-
# say("Unknown file [#{filename}]", :red)
|
186
|
-
# next
|
187
|
-
# end
|
188
|
-
# action = if [:changed, :new].include?(event)
|
189
|
-
# :send_asset
|
190
|
-
# elsif event == :delete
|
191
|
-
# :delete_asset
|
192
|
-
# else
|
193
|
-
# raise NotImplementedError, "Unknown event -- #{event} -- #{filename}"
|
194
|
-
# end
|
195
|
-
# send(action, filename, options['quiet'])
|
196
|
-
# end
|
197
|
-
# end
|
198
181
|
def watch
|
199
182
|
watcher do |filename, event|
|
200
|
-
filename = filename.
|
201
|
-
|
202
|
-
|
203
|
-
action =
|
204
|
-
:
|
205
|
-
|
206
|
-
:
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
183
|
+
filename = filename.sub(Dir.pwd.to_s + '/', '')
|
184
|
+
next if components_temporary_file?(filename)
|
185
|
+
next unless file?(filename)
|
186
|
+
action =
|
187
|
+
if [:changed, :new].include?(event)
|
188
|
+
:send_asset
|
189
|
+
elsif event == :delete
|
190
|
+
:delete_asset
|
191
|
+
else
|
192
|
+
say("This is not file [#{filename}]", :blue)
|
193
|
+
raise NotImplementedError, "Evento Desconhecido -- #{event} -- #{filename}"
|
194
|
+
end
|
211
195
|
send(action, filename, options['quiet'])
|
212
|
-
else
|
213
|
-
next
|
214
|
-
end
|
215
|
-
|
216
|
-
|
217
196
|
end
|
218
197
|
end
|
219
198
|
|
220
|
-
desc 'systeminfo', 'Mostra
|
199
|
+
desc 'systeminfo', 'Mostra informações do sistema'
|
221
200
|
def systeminfo
|
222
|
-
ruby_version =
|
201
|
+
ruby_version = RUBY_VERSION.to_s
|
223
202
|
ruby_version += "-p#{RUBY_PATCHLEVEL}" if RUBY_PATCHLEVEL
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
puts "Operating System: #{RUBY_PLATFORM}"
|
203
|
+
say( 'Ruby: v' + ruby_version.to_s)
|
204
|
+
say('OpencodeTheme: v' + OpencodeTheme::VERSION.to_s)
|
205
|
+
say('Operating System: ' + RUBY_PLATFORM)
|
228
206
|
%w(HTTParty Launchy).each do |lib|
|
229
207
|
require "#{lib.downcase}/version"
|
230
|
-
|
208
|
+
say("#{lib}: v" + Kernel.const_get("#{lib}::VERSION"))
|
231
209
|
end
|
232
210
|
end
|
233
211
|
|
234
212
|
protected
|
235
213
|
|
236
|
-
def
|
214
|
+
def file?(filename)
|
237
215
|
!FileTest.directory?(filename)
|
238
216
|
end
|
239
217
|
|
@@ -243,6 +221,50 @@ module OpencodeTheme
|
|
243
221
|
|
244
222
|
private
|
245
223
|
|
224
|
+
def show_list_components
|
225
|
+
response = OpencodeTheme.list_opencode_components
|
226
|
+
say('Nome: Descrição:', :blue)
|
227
|
+
response[:response]['list'].map do |list|
|
228
|
+
say(list["name"] + ' ' + list['description'] , :blue)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def install_component(name, user = nil, origin = nil)
|
233
|
+
OpencodeTheme.config = config
|
234
|
+
components = OpencodeTheme.install_opencode_components(name, user, origin)
|
235
|
+
return say("Atenção: Não foi possivel instalar o componente: #{name}", :yellow) unless components.success?
|
236
|
+
files = components["files"]["tree"].map { |file| { path: file['path'], type: file['type'], url: components["url_base"]+file['path'] } }
|
237
|
+
if components[:success]
|
238
|
+
OpencodeTheme.install_opencode_components_notification(name, user, origin)
|
239
|
+
end
|
240
|
+
files.map do |file|
|
241
|
+
if file[:type] == "tree"
|
242
|
+
FileUtils.mkpath(file[:path])
|
243
|
+
else
|
244
|
+
content = HTTParty.get(file[:url])
|
245
|
+
IO.write(file[:path], content)
|
246
|
+
say("Componente #{name} Downloaded: #{file[:path]}", :green)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
def components_install
|
252
|
+
require 'yaml'
|
253
|
+
manifest = YAML.load_file('opencode.yml') if File.exist?('opencode.yml')
|
254
|
+
return say('opencode.yml not found.', :red) unless manifest
|
255
|
+
if manifest['components'].has_key?('tray')
|
256
|
+
repos_tray = manifest['components']['tray']
|
257
|
+
manifest['components']['tray'].map { |tray_repo| install_component(tray_repo, 'tray-desenvolvedores', 'github') }
|
258
|
+
end
|
259
|
+
if manifest['components'].has_key?('github')
|
260
|
+
manifest['components']['github'].map { |user_repo, repos| repos.map{|repo| install_component(repo, user_repo, 'github') } }
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def components_temporary_file?(filename)
|
265
|
+
['github', 'opencode-components-', 'opencode.yml'].any? { |word| filename.include?(word) }
|
266
|
+
end
|
267
|
+
|
246
268
|
def notify_and_sleep(message)
|
247
269
|
say(message, :red)
|
248
270
|
OpencodeTheme.sleep
|
@@ -253,62 +275,62 @@ module OpencodeTheme
|
|
253
275
|
end
|
254
276
|
|
255
277
|
def opencode_theme_url
|
256
|
-
hash_no_cache = rand(
|
278
|
+
hash_no_cache = rand(100_000)
|
257
279
|
config[:preview_url].concat("&#{hash_no_cache}")
|
258
280
|
end
|
259
281
|
|
260
282
|
def send_asset(asset, quiet = false)
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
end
|
272
|
-
response = show_during("[#{timestamp}] Uploading: #{asset}", quiet) do
|
273
|
-
OpencodeTheme.send_asset(data)
|
274
|
-
end
|
275
|
-
if response.success?
|
276
|
-
say("[#{timestamp}] File uploaded: #{asset}", :green) unless quiet
|
277
|
-
else
|
278
|
-
report_error(Time.now, "Could not upload #{asset}", response)
|
279
|
-
end
|
283
|
+
return unless valid_name?(asset)
|
284
|
+
return unless valid?(asset)
|
285
|
+
return unless file?(asset)
|
286
|
+
data = { key: "/#{asset}" }
|
287
|
+
content = File.read(asset.to_s)
|
288
|
+
if binary_file?(asset) || OpencodeTheme.is_binary_data?(content)
|
289
|
+
content = File.open(asset.to_s, 'rb', &:read)
|
290
|
+
data[:attachment] = Base64.encode64(content)
|
291
|
+
else
|
292
|
+
data[:value] = Base64.encode64(content)
|
280
293
|
end
|
294
|
+
response = show_during("[#{timestamp}]Enviando: #{asset}", quiet) { OpencodeTheme.send_asset(data) }
|
295
|
+
if response.success?
|
296
|
+
say("[#{timestamp}] Arquivo enviado: #{asset}", :green) unless quiet
|
297
|
+
else
|
298
|
+
report_error(Time.now, "Nao foi possível fazer upload #{asset}", response)
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
def temp_files?(file_name)
|
281
303
|
end
|
282
304
|
|
283
305
|
def temporary_file?(asset)
|
284
306
|
false unless asset.include?('~')
|
285
307
|
end
|
286
308
|
|
287
|
-
def delete_asset(key,
|
288
|
-
return say("[#{timestamp}]
|
309
|
+
def delete_asset(key, _quiet = false)
|
310
|
+
return say("[#{timestamp}] Diretório removido/renomeado: #{key}", :green) unless key.include?('.')
|
289
311
|
return exec_delete_file(key) if valid_name?(key)
|
290
312
|
end
|
291
313
|
|
292
314
|
def exec_delete_file(key, quiet = false)
|
293
|
-
response = show_during("[#{timestamp}]
|
315
|
+
response = show_during("[#{timestamp}] Removendo: #{key}", quiet) do
|
294
316
|
OpencodeTheme.delete_asset(key)
|
295
317
|
end
|
296
318
|
if response.success?
|
297
|
-
say("[#{timestamp}]
|
319
|
+
say("[#{timestamp}] Arquivo removido: #{key} ", :green) unless quiet
|
298
320
|
else
|
299
|
-
report_error(Time.now, "
|
321
|
+
report_error(Time.now, "Não foi possível remover: #{key}", response)
|
300
322
|
end
|
301
323
|
end
|
302
324
|
|
303
325
|
def watcher
|
304
326
|
FileWatcher.new(Dir.pwd).watch do |filename, event|
|
305
|
-
yield(
|
327
|
+
yield(filename.to_s, event)
|
306
328
|
end
|
307
329
|
end
|
308
330
|
|
309
331
|
def local_assets_list
|
310
332
|
local_files.reject do |p|
|
311
|
-
@permitted_files ||= (DEFAULT_WHITELIST | OpencodeTheme.whitelist_files).map{ |pattern| Regexp.new(pattern)}
|
333
|
+
@permitted_files ||= (DEFAULT_WHITELIST | OpencodeTheme.whitelist_files).map { |pattern| Regexp.new(pattern) }
|
312
334
|
@permitted_files.none? { |regex| regex =~ p } || OpencodeTheme.ignore_files.any? { |regex| regex =~ p }
|
313
335
|
end
|
314
336
|
end
|
@@ -320,11 +342,10 @@ module OpencodeTheme
|
|
320
342
|
end
|
321
343
|
|
322
344
|
def valid?(key)
|
323
|
-
return true
|
324
|
-
#
|
325
|
-
|
326
|
-
|
327
|
-
# false
|
345
|
+
return true if DEFAULT_WHITELIST.include?(key.split('/').first + "/")
|
346
|
+
say("'#{key}' não é um arquivo válido para ser enviado", :yellow)
|
347
|
+
say("subdiretórios permitidos: #{DEFAULT_WHITELIST.join(' ')}", :yellow)
|
348
|
+
false
|
328
349
|
end
|
329
350
|
|
330
351
|
def timestamp(time = Time.now)
|
@@ -334,37 +355,33 @@ module OpencodeTheme
|
|
334
355
|
def valid_name?(key)
|
335
356
|
return if temporary_file?(key)
|
336
357
|
name = key.split('/').last
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
358
|
+
return true if extension_valid?(name)
|
359
|
+
response = {}
|
360
|
+
response['message'] = 'verifique as regras de nome de arquivos:'
|
361
|
+
response['more_info'] = 'https://tray-desenvolvedores.github.io/frontend/console-tool/#error'
|
362
|
+
report_error(Time.now, "Invalid name: #{name}", response)
|
363
|
+
end
|
364
|
+
|
365
|
+
|
366
|
+
def extension_valid?(name)
|
367
|
+
/^[0-9a-zA-Z\-_.]+\.(ttf|otf|eot|svg|woff|woff2|css|scss|styl|html|js|jpg|gif|png|json|TTF|OTF|EOT|SVG|WOFF|WOFF2|CSS|SCSS|STYL|HTML|JS|PNG|GIF|JPG|JSON)$/ === name
|
346
368
|
end
|
347
369
|
|
348
370
|
def download_asset(key)
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
format = 'w+b:ISO-8859-1'
|
361
|
-
elsif response['attachment']
|
362
|
-
content = Base64.decode64(response['attachment'])
|
363
|
-
format = 'w+b'
|
364
|
-
end
|
365
|
-
FileUtils.mkdir_p(File.dirname(URI.decode(key)))
|
366
|
-
File.open(key, format) { |f| f.write content } if content
|
371
|
+
return unless valid_name?(key)
|
372
|
+
return unless valid?(key)
|
373
|
+
response = OpencodeTheme.get_asset(URI.encode(key))
|
374
|
+
return report_error(Time.now, "Não foi possível efetuar o download do arquivo: #{key}", response) unless response['key']
|
375
|
+
if response['content']
|
376
|
+
content = Base64.decode64(response['content'])
|
377
|
+
content = content.force_encoding('ISO-8859-1')
|
378
|
+
format = 'w+b:ISO-8859-1'
|
379
|
+
elsif response['attachment']
|
380
|
+
content = Base64.decode64(response['attachment'])
|
381
|
+
format = 'w+b'
|
367
382
|
end
|
383
|
+
FileUtils.mkdir_p(File.dirname(URI.decode(key)))
|
384
|
+
File.open(key, format) { |f| f.write content }
|
368
385
|
end
|
369
386
|
|
370
387
|
def show_during(message = '', quiet = false, &block)
|
@@ -375,10 +392,10 @@ module OpencodeTheme
|
|
375
392
|
end
|
376
393
|
|
377
394
|
def report_error(time, message, response)
|
378
|
-
say("[#{timestamp(time)}] Error: #{message}", :red)
|
395
|
+
say("[#{timestamp(time)}] Error: #{message}", :red) if message
|
379
396
|
if response
|
380
|
-
message_details = response[
|
381
|
-
message_details = "#{message_details} \n #{response[
|
397
|
+
message_details = response['message']
|
398
|
+
message_details = "#{message_details} \n #{response['more_info']}" unless response['more_info'].nil?
|
382
399
|
say("Error Details: #{message_details}", :yellow)
|
383
400
|
end
|
384
401
|
end
|