opencode_theme 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|