nimbu 0.11.9 → 0.12.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/lib/nimbu.rb +1 -3
- data/lib/nimbu/auth.rb +120 -105
- data/lib/nimbu/command.rb +49 -44
- data/lib/nimbu/command/server.rb +7 -7
- data/lib/nimbu/version.rb +1 -3
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89810923de0892b2e89ec5a67e73b09504b6b5e3ca55feb3796e687d0aeaac9d
|
4
|
+
data.tar.gz: 234965e37cfe0a548d6d4af6f2f45b5de88ffe4364fb07b1620565d7a200e1e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3f047d1f0971d7931984e5081b156029b531d01c02151d0df83ee32a957e2b893c8c6c7f8db23d0866427d39c051e2de54e5c763d29968d569d9109dba6d3d7
|
7
|
+
data.tar.gz: 7b97b0d9371a70579bee1c89f9a6664ef24989ab2317ffae5095c5e349e708dfe5e6b598aa21a2230349ed07f8df42bc81b62dce2f02d3bf9d7815813754ed90
|
data/lib/nimbu.rb
CHANGED
data/lib/nimbu/auth.rb
CHANGED
@@ -1,26 +1,24 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require "nimbu/helpers"
|
1
|
+
require 'yaml'
|
2
|
+
require 'nimbu'
|
3
|
+
require 'nimbu/helpers'
|
5
4
|
require 'term/ansicolor'
|
5
|
+
require 'netrc'
|
6
6
|
|
7
7
|
class Nimbu::Auth
|
8
8
|
class << self
|
9
|
-
|
10
9
|
include Nimbu::Helpers
|
11
|
-
attr_accessor :credentials
|
12
|
-
attr_accessor :configuration
|
10
|
+
attr_accessor :credentials, :configuration
|
13
11
|
|
14
12
|
def simulator_id
|
15
13
|
return @simulator_id if defined? @simulator_id
|
16
14
|
|
17
|
-
ranges = [('a'..'z'),('A'..'Z'),(0..9)].map{|i| i.to_a}.flatten
|
18
|
-
@simulator_id ||= (1..40).map{ ranges[rand(ranges.length)]
|
15
|
+
ranges = [('a'..'z'), ('A'..'Z'), (0..9)].map { |i| i.to_a }.flatten
|
16
|
+
@simulator_id ||= (1..40).map { ranges[rand(ranges.length)] }.join
|
19
17
|
end
|
20
18
|
|
21
19
|
def client
|
22
20
|
@client ||= begin
|
23
|
-
Nimbu::Client.new(:
|
21
|
+
Nimbu::Client.new(oauth_token: token, endpoint: host, user_agent: user_agent, auto_pagination: true)
|
24
22
|
end
|
25
23
|
end
|
26
24
|
|
@@ -47,15 +45,19 @@ class Nimbu::Auth
|
|
47
45
|
end
|
48
46
|
|
49
47
|
def host
|
50
|
-
ENV['NIMBU_HOST'] ||
|
48
|
+
ENV['NIMBU_HOST'] || 'https://api.nimbu.io'
|
51
49
|
end
|
52
50
|
|
53
51
|
def default_host
|
54
|
-
|
52
|
+
'https://api.nimbu.io'
|
55
53
|
end
|
56
54
|
|
57
55
|
def admin_host
|
58
|
-
@admin_host ||= host.gsub(
|
56
|
+
@admin_host ||= host.gsub(%r{https?://api\.}, '')
|
57
|
+
end
|
58
|
+
|
59
|
+
def api_host
|
60
|
+
@api_host ||= host.gsub(%r{https?://}, '')
|
59
61
|
end
|
60
62
|
|
61
63
|
def site
|
@@ -67,11 +69,11 @@ class Nimbu::Auth
|
|
67
69
|
end
|
68
70
|
|
69
71
|
def get_nimbu_site
|
70
|
-
get_configuration[
|
72
|
+
get_configuration['site']
|
71
73
|
end
|
72
74
|
|
73
75
|
def get_nimbu_theme
|
74
|
-
get_configuration[
|
76
|
+
get_configuration['theme'] || 'default-theme'
|
75
77
|
end
|
76
78
|
|
77
79
|
def get_configuration
|
@@ -94,192 +96,205 @@ class Nimbu::Auth
|
|
94
96
|
end
|
95
97
|
|
96
98
|
def ask_for_configuration
|
97
|
-
|
98
99
|
subdomain = nil
|
99
100
|
sites = client.sites.list
|
100
101
|
|
101
|
-
|
102
|
-
display "You don't have access to any Nimbu sites you can edit yet..."
|
103
|
-
display ""
|
104
|
-
display "Please visit http://nimbu.io, start your 30-day trial and discover our amazing platform!"
|
105
|
-
exit(1)
|
106
|
-
else
|
102
|
+
if sites.respond_to?(:any?) && sites.any?
|
107
103
|
print_separator
|
108
104
|
display "\nLet's first setup the configuration for this directory..."
|
109
105
|
display "\nYou have access to following sites:\n"
|
110
|
-
sites.each_with_index do |site,i|
|
111
|
-
display " #{i+1}) #{site.name.white.bold} => http://#{site.domain}"
|
106
|
+
sites.each_with_index do |site, i|
|
107
|
+
display " #{i + 1}) #{site.name.white.bold} => http://#{site.domain}"
|
112
108
|
end
|
113
109
|
site_number = 0
|
114
110
|
retry_site = false
|
115
111
|
while site_number < 1 || site_number > sites.length
|
116
|
-
|
117
|
-
print "\nOn which site would you like to work? "
|
118
|
-
else
|
112
|
+
if retry_site
|
119
113
|
print "\nPlease enter the number of your site (between 1-#{sites.length}): "
|
114
|
+
else
|
115
|
+
print "\nOn which site would you like to work? "
|
120
116
|
end
|
121
117
|
site_number_string = ask
|
122
|
-
site_number =
|
118
|
+
site_number = begin
|
119
|
+
site_number_string.to_i
|
120
|
+
rescue StandardError
|
121
|
+
0
|
122
|
+
end
|
123
123
|
retry_site = true
|
124
124
|
end
|
125
|
-
puts
|
126
|
-
site = sites[site_number-1]
|
125
|
+
puts ''
|
126
|
+
site = sites[site_number - 1]
|
127
127
|
display "Site chosen => #{site.name.white.bold} (http://#{site.domain})"
|
128
128
|
subdomain = site.subdomain
|
129
129
|
@site = subdomain
|
130
|
+
else
|
131
|
+
display "You don't have access to any Nimbu sites you can edit yet..."
|
132
|
+
exit(1)
|
130
133
|
end
|
131
134
|
|
132
|
-
themes = client.themes(:
|
135
|
+
themes = client.themes(subdomain: subdomain).list
|
133
136
|
current_theme = if themes.length > 1
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
137
|
+
theme_number = 0
|
138
|
+
retry_theme = false
|
139
|
+
while theme_number < 1 || theme_number > themes.length
|
140
|
+
if retry_theme
|
141
|
+
print "\nPlease enter the number of your theme (between 1-#{themes.length}): "
|
142
|
+
else
|
143
|
+
print "\nOn which theme would you like to work in this directory? "
|
144
|
+
end
|
145
|
+
theme_number_string = ask
|
146
|
+
theme_number = begin
|
147
|
+
theme_number_string.to_i
|
148
|
+
rescue StandardError
|
149
|
+
0
|
150
|
+
end
|
151
|
+
retry_theme = true
|
152
|
+
end
|
153
|
+
puts ''
|
154
|
+
display "Theme chosen => #{themes[theme_number - 1].name}"
|
155
|
+
themes[theme_number - 1]
|
156
|
+
else
|
157
|
+
themes.first
|
158
|
+
end
|
152
159
|
@theme = current_theme.short
|
153
160
|
print_separator
|
154
161
|
|
155
|
-
{
|
162
|
+
{ 'site' => subdomain, 'theme' => current_theme.short }
|
156
163
|
end
|
157
164
|
|
158
165
|
def read_configuration
|
159
|
-
existing_config = YAML
|
160
|
-
if existing_config && !
|
161
|
-
existing_config
|
162
|
-
else
|
163
|
-
nil
|
164
|
-
end
|
166
|
+
existing_config = YAML.load(File.open(configuration_file)) if File.exist?(configuration_file)
|
167
|
+
existing_config if existing_config && !existing_config['site'].nil?
|
165
168
|
end
|
166
169
|
|
167
170
|
def write_configuration
|
168
171
|
FileUtils.mkdir_p(File.dirname(configuration_file))
|
169
|
-
File.open(configuration_file, 'w') {|credentials| credentials.puts(YAML.dump(
|
170
|
-
FileUtils.chmod(
|
171
|
-
FileUtils.chmod(
|
172
|
+
File.open(configuration_file, 'w') { |credentials| credentials.puts(YAML.dump(configuration)) }
|
173
|
+
FileUtils.chmod(0o700, File.dirname(configuration_file))
|
174
|
+
FileUtils.chmod(0o600, configuration_file)
|
172
175
|
end
|
173
176
|
|
174
177
|
def reauthorize
|
175
178
|
@credentials = ask_for_and_save_credentials
|
176
179
|
end
|
177
180
|
|
178
|
-
def token
|
181
|
+
def token # :nodoc:
|
179
182
|
ENV['NIMBU_API_KEY'] || get_credentials
|
180
183
|
end
|
181
184
|
|
182
|
-
def
|
183
|
-
if host == default_host
|
184
|
-
"#{home_directory}/.nimbu/credentials"
|
185
|
-
else
|
186
|
-
"#{home_directory}/.nimbu/credentials.#{CGI.escape(host.gsub(/https?\:\/\//,''))}"
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
def get_credentials # :nodoc:
|
185
|
+
def get_credentials # :nodoc:
|
191
186
|
@credentials ||= (read_credentials || ask_for_and_save_credentials)
|
187
|
+
@credentials[:token]
|
192
188
|
end
|
193
189
|
|
194
190
|
def delete_credentials
|
195
|
-
|
196
|
-
|
191
|
+
n = Netrc.read
|
192
|
+
n.delete(api_host)
|
193
|
+
n.save
|
194
|
+
@client = nil
|
195
|
+
@credentials = nil
|
197
196
|
end
|
198
197
|
|
199
198
|
def read_credentials
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
else
|
204
|
-
nil
|
205
|
-
end
|
199
|
+
n = Netrc.read
|
200
|
+
user, token = n[api_host]
|
201
|
+
{ user: user, token: token } if user && token
|
206
202
|
end
|
207
203
|
|
208
204
|
def write_credentials
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
FileUtils.chmod(0600, credentials_file)
|
205
|
+
n = Netrc.read
|
206
|
+
n[api_host] = @credentials[:user], @credentials[:token]
|
207
|
+
n.save
|
213
208
|
end
|
214
209
|
|
215
210
|
def echo_off
|
216
211
|
with_tty do
|
217
|
-
system
|
212
|
+
system 'stty -echo'
|
218
213
|
end
|
219
214
|
end
|
220
215
|
|
221
216
|
def echo_on
|
222
217
|
with_tty do
|
223
|
-
system
|
218
|
+
system 'stty echo'
|
224
219
|
end
|
225
220
|
end
|
226
221
|
|
227
|
-
def ask_for_credentials
|
228
|
-
|
229
|
-
|
222
|
+
def ask_for_credentials(user = nil, password = nil, two_factor_code = nil)
|
223
|
+
unless user
|
224
|
+
print 'Login: '
|
225
|
+
user = ask
|
226
|
+
end
|
230
227
|
|
231
|
-
|
232
|
-
|
228
|
+
unless password
|
229
|
+
print 'Password: '
|
230
|
+
password = running_on_windows? ? ask_for_password_on_windows : ask_for_password
|
231
|
+
end
|
233
232
|
|
234
233
|
begin
|
234
|
+
request_headers = {}
|
235
|
+
request_headers['X-Nimbu-Two-Factor'] = two_factor_code.to_s.strip unless two_factor_code.nil?
|
236
|
+
|
235
237
|
basic_client = Nimbu::Client.new(
|
236
|
-
:
|
237
|
-
:
|
238
|
-
:
|
238
|
+
basic_auth: "#{user}:#{password}",
|
239
|
+
endpoint: host,
|
240
|
+
user_agent: user_agent,
|
241
|
+
headers: request_headers
|
239
242
|
)
|
240
|
-
basic_client.authenticate.token
|
243
|
+
{ user: user, token: basic_client.authenticate.token }
|
241
244
|
rescue Exception => e
|
242
245
|
if e.respond_to?(:http_status_code) && e.http_status_code == 401
|
243
|
-
|
246
|
+
if e.message =~ /two factor authentication/
|
247
|
+
print '2FA Token: '
|
248
|
+
two_factor_code = ask
|
249
|
+
ask_for_credentials(user, password, two_factor_code)
|
250
|
+
else
|
251
|
+
display " => could not login... please check your username and/or password!\n\n"
|
252
|
+
nil
|
253
|
+
end
|
244
254
|
else
|
245
255
|
display " => hmmmm... an error occurred: #{e}. \n\n\nIf this continues to occur, please report \nthe error at https://github.com/nimbu/nimbu/issues.\n\n"
|
256
|
+
nil
|
246
257
|
end
|
247
|
-
nil
|
248
258
|
end
|
249
259
|
end
|
250
260
|
|
251
261
|
def ask_for_password_on_windows
|
252
|
-
require
|
262
|
+
require 'Win32API'
|
253
263
|
char = nil
|
254
264
|
password = ''
|
255
265
|
|
256
|
-
while char = Win32API.new(
|
257
|
-
break if
|
258
|
-
|
266
|
+
while char = Win32API.new('msvcrt', '_getch', [], 'L').Call
|
267
|
+
break if [10, 13].include?(char) # received carriage return or newline
|
268
|
+
|
269
|
+
if [10, 13, 10, 13, 127, 8].include?(char) # backspace and delete
|
259
270
|
password.slice!(-1, 1)
|
260
271
|
else
|
261
272
|
# windows might throw a -1 at us so make sure to handle RangeError
|
262
|
-
|
273
|
+
begin
|
274
|
+
(password << char.chr)
|
275
|
+
rescue StandardError
|
276
|
+
RangeError
|
277
|
+
end
|
263
278
|
end
|
264
279
|
end
|
265
280
|
puts
|
266
|
-
|
281
|
+
password
|
267
282
|
end
|
268
283
|
|
269
284
|
def ask_for_password
|
270
285
|
echo_off
|
271
|
-
trap(
|
286
|
+
trap('INT') do
|
272
287
|
echo_on
|
273
288
|
exit
|
274
289
|
end
|
275
290
|
password = ask
|
276
291
|
puts
|
277
292
|
echo_on
|
278
|
-
|
293
|
+
password
|
279
294
|
end
|
280
295
|
|
281
296
|
def ask_for_and_save_credentials
|
282
|
-
display "Please authenticate with
|
297
|
+
display "Please authenticate with #{admin_host}:"
|
283
298
|
begin
|
284
299
|
@credentials = ask_for_credentials
|
285
300
|
write_credentials
|
@@ -299,7 +314,7 @@ class Nimbu::Auth
|
|
299
314
|
|
300
315
|
def print_separator
|
301
316
|
print "\n"
|
302
|
-
60.times { print
|
317
|
+
60.times { print '#' }
|
303
318
|
print "\n"
|
304
319
|
end
|
305
320
|
|
@@ -309,7 +324,7 @@ class Nimbu::Auth
|
|
309
324
|
|
310
325
|
def invalid_access_message
|
311
326
|
"Error! You do not have access to #{Nimbu::Auth.site}.#{Nimbu::Auth.admin_host}! " +
|
312
|
-
|
327
|
+
'Please check your site id or request access to your site owner.'
|
313
328
|
end
|
314
329
|
end
|
315
330
|
end
|
data/lib/nimbu/command.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
1
|
require 'nimbu/helpers'
|
3
2
|
require 'nimbu/version'
|
4
3
|
require 'term/ansicolor'
|
5
|
-
require
|
4
|
+
require 'optparse'
|
6
5
|
|
7
6
|
class String
|
8
7
|
include Term::ANSIColor
|
@@ -10,12 +9,12 @@ end
|
|
10
9
|
|
11
10
|
module Nimbu
|
12
11
|
module Command
|
13
|
-
class CommandFailed
|
12
|
+
class CommandFailed < RuntimeError; end
|
14
13
|
|
15
14
|
extend Nimbu::Helpers
|
16
15
|
|
17
16
|
def self.load
|
18
|
-
Dir[File.join(File.dirname(__FILE__),
|
17
|
+
Dir[File.join(File.dirname(__FILE__), 'command', '*.rb')].sort.each do |file|
|
19
18
|
require file
|
20
19
|
end
|
21
20
|
end
|
@@ -29,7 +28,7 @@ module Nimbu
|
|
29
28
|
end
|
30
29
|
|
31
30
|
def self.files
|
32
|
-
@@files ||= Hash.new {|hash,key| hash[key] = File.readlines(key).map {|line| line.strip}}
|
31
|
+
@@files ||= Hash.new { |hash, key| hash[key] = File.readlines(key).map { |line| line.strip } }
|
33
32
|
end
|
34
33
|
|
35
34
|
def self.namespaces
|
@@ -65,7 +64,7 @@ module Nimbu
|
|
65
64
|
end
|
66
65
|
|
67
66
|
def self.global_option(name, *args, &blk)
|
68
|
-
global_options << { :
|
67
|
+
global_options << { name: name.to_s, args: args.sort.reverse, proc: blk }
|
69
68
|
end
|
70
69
|
|
71
70
|
def self.warnings
|
@@ -73,15 +72,13 @@ module Nimbu
|
|
73
72
|
end
|
74
73
|
|
75
74
|
def self.display_warnings
|
76
|
-
unless warnings.empty?
|
77
|
-
$stderr.puts(warnings.map {|warning| " ! #{warning}"}.join("\n"))
|
78
|
-
end
|
75
|
+
warn(warnings.map { |warning| " ! #{warning}" }.join("\n")) unless warnings.empty?
|
79
76
|
end
|
80
77
|
|
81
|
-
global_option :help,
|
82
|
-
global_option :debug,
|
78
|
+
global_option :help, '--help', '-h'
|
79
|
+
global_option :debug, '--debug'
|
83
80
|
|
84
|
-
def self.prepare_run(cmd, args=[])
|
81
|
+
def self.prepare_run(cmd, args = [])
|
85
82
|
command = parse(cmd)
|
86
83
|
|
87
84
|
if args.include?('-h') || args.include?('--help')
|
@@ -90,13 +87,14 @@ module Nimbu
|
|
90
87
|
command = parse(cmd)
|
91
88
|
end
|
92
89
|
|
93
|
-
if
|
90
|
+
if ['--version', '-v'].include?(cmd)
|
94
91
|
cmd = 'version'
|
95
92
|
command = parse(cmd)
|
96
93
|
end
|
97
94
|
|
98
95
|
@current_command = cmd
|
99
|
-
@anonymized_args
|
96
|
+
@anonymized_args = []
|
97
|
+
@normalized_args = []
|
100
98
|
|
101
99
|
opts = {}
|
102
100
|
invalid_options = []
|
@@ -105,25 +103,25 @@ module Nimbu
|
|
105
103
|
parser.base.long.delete('version')
|
106
104
|
(global_options + (command && command[:options] || [])).each do |option|
|
107
105
|
parser.on(*option[:args]) do |value|
|
108
|
-
if option[:proc]
|
109
|
-
option[:proc].call(value)
|
110
|
-
end
|
106
|
+
option[:proc].call(value) if option[:proc]
|
111
107
|
opts[option[:name].gsub('-', '_').to_sym] = value
|
112
|
-
ARGV.join(' ') =~ /(#{option[:args].map {|arg| arg.split(' ', 2).first}.join('|')})/
|
113
|
-
@anonymized_args << "#{
|
108
|
+
ARGV.join(' ') =~ /(#{option[:args].map { |arg| arg.split(' ', 2).first }.join('|')})/
|
109
|
+
@anonymized_args << "#{Regexp.last_match(1)} _"
|
114
110
|
@normalized_args << "#{option[:args].last.split(' ', 2).first} _"
|
115
111
|
end
|
116
112
|
end
|
117
113
|
end
|
118
114
|
|
115
|
+
parser.version = Nimbu::VERSION
|
116
|
+
|
119
117
|
begin
|
120
118
|
parser.order!(args) do |nonopt|
|
121
119
|
invalid_options << nonopt
|
122
120
|
@anonymized_args << '!'
|
123
121
|
@normalized_args << '!'
|
124
122
|
end
|
125
|
-
rescue OptionParser::InvalidOption =>
|
126
|
-
invalid_options <<
|
123
|
+
rescue OptionParser::InvalidOption => e
|
124
|
+
invalid_options << e.args.first
|
127
125
|
@anonymized_args << '!'
|
128
126
|
@normalized_args << '!'
|
129
127
|
retry
|
@@ -135,52 +133,54 @@ module Nimbu
|
|
135
133
|
@current_options = opts
|
136
134
|
@invalid_arguments = invalid_options
|
137
135
|
|
138
|
-
if opts[:debug]
|
139
|
-
Nimbu.debug = true
|
140
|
-
end
|
136
|
+
Nimbu.debug = true if opts[:debug]
|
141
137
|
|
142
138
|
@anonymous_command = [ARGV.first, *@anonymized_args].join(' ')
|
143
139
|
begin
|
144
140
|
usage_directory = "#{home_directory}/.nimbu/usage"
|
145
141
|
FileUtils.mkdir_p(usage_directory)
|
146
142
|
usage_file = usage_directory << "/#{Nimbu::VERSION}"
|
147
|
-
usage = if File.
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
143
|
+
usage = if File.exist?(usage_file)
|
144
|
+
json_decode(File.read(usage_file).force_encoding('UTF-8'))
|
145
|
+
else
|
146
|
+
{}
|
147
|
+
end
|
152
148
|
usage[@anonymous_command] ||= 0
|
153
149
|
usage[@anonymous_command] += 1
|
154
150
|
File.write(usage_file, json_encode(usage) + "\n")
|
155
|
-
rescue
|
151
|
+
rescue StandardError
|
156
152
|
# usage writing is not important, allow failures
|
157
153
|
end
|
158
154
|
|
159
155
|
if command
|
160
156
|
command_instance = command[:klass].new(args.dup, opts.dup)
|
161
157
|
|
162
|
-
if !@normalized_args.include?('--app _') && (implied_app =
|
158
|
+
if !@normalized_args.include?('--app _') && (implied_app = begin
|
159
|
+
command_instance.app
|
160
|
+
rescue StandardError
|
161
|
+
nil
|
162
|
+
end)
|
163
163
|
@normalized_args << '--app _'
|
164
164
|
end
|
165
|
-
@normalized_command = [ARGV.first, @normalized_args.sort_by {|arg| arg.gsub('-', '')}].join(' ')
|
165
|
+
@normalized_command = [ARGV.first, @normalized_args.sort_by { |arg| arg.gsub('-', '') }].join(' ')
|
166
166
|
|
167
|
-
[
|
167
|
+
[command_instance, command[:method]]
|
168
168
|
else
|
169
169
|
error([
|
170
170
|
"`#{cmd}` is not a Nimbu command.",
|
171
171
|
suggestion(cmd, commands.keys + command_aliases.keys),
|
172
|
-
|
172
|
+
'See `Nimbu help` for a list of available commands.'
|
173
173
|
].compact.join("\n"))
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
|
-
def self.run(cmd, arguments=[])
|
177
|
+
def self.run(cmd, arguments = [])
|
178
178
|
begin
|
179
179
|
object, method = prepare_run(cmd, arguments.dup)
|
180
180
|
object.send(method)
|
181
|
-
rescue Interrupt, StandardError, SystemExit =>
|
181
|
+
rescue Interrupt, StandardError, SystemExit => e
|
182
182
|
# load likely error classes, as they may not be loaded yet due to defered loads
|
183
|
-
raise(
|
183
|
+
raise(e)
|
184
184
|
end
|
185
185
|
# rescue Nimbu::API::Errors::Unauthorized, RestClient::Unauthorized
|
186
186
|
# puts "Authentication failure"
|
@@ -219,10 +219,10 @@ module Nimbu
|
|
219
219
|
rescue CommandFailed => e
|
220
220
|
error e.message
|
221
221
|
rescue OptionParser::ParseError
|
222
|
-
commands[cmd] ? run(
|
222
|
+
commands[cmd] ? run('help', [cmd]) : run('help')
|
223
223
|
rescue Excon::Errors::SocketError => e
|
224
224
|
if e.message == 'getaddrinfo: nodename nor servname provided, or not known (SocketError)'
|
225
|
-
error(
|
225
|
+
error('Unable to connect to Nimbu API, please check internet connectivity and try again.')
|
226
226
|
else
|
227
227
|
raise(e)
|
228
228
|
end
|
@@ -234,25 +234,30 @@ module Nimbu
|
|
234
234
|
commands[cmd] || commands[command_aliases[cmd]]
|
235
235
|
end
|
236
236
|
|
237
|
-
def self.extract_error(body,
|
237
|
+
def self.extract_error(body, _options = {})
|
238
238
|
default_error = block_given? ? yield : "Internal server error.\nRun 'nimbu status' to check for known platform issues."
|
239
239
|
parse_error_xml(body) || parse_error_json(body) || parse_error_plain(body) || default_error
|
240
240
|
end
|
241
241
|
|
242
242
|
def self.parse_error_xml(body)
|
243
|
-
xml_errors = REXML::Document.new(body).elements.to_a(
|
244
|
-
msg = xml_errors.map { |a| a.text }.join(
|
243
|
+
xml_errors = REXML::Document.new(body).elements.to_a('//errors/error')
|
244
|
+
msg = xml_errors.map { |a| a.text }.join(' / ')
|
245
245
|
return msg unless msg.empty?
|
246
246
|
rescue Exception
|
247
247
|
end
|
248
248
|
|
249
249
|
def self.parse_error_json(body)
|
250
|
-
json =
|
250
|
+
json = begin
|
251
|
+
json_decode(body.to_s)
|
252
|
+
rescue StandardError
|
253
|
+
false
|
254
|
+
end
|
251
255
|
json ? json['error'] : nil
|
252
256
|
end
|
253
257
|
|
254
258
|
def self.parse_error_plain(body)
|
255
|
-
return unless body.respond_to?(:headers) && body.headers[:content_type].to_s.include?(
|
259
|
+
return unless body.respond_to?(:headers) && body.headers[:content_type].to_s.include?('text/plain')
|
260
|
+
|
256
261
|
body.to_s
|
257
262
|
end
|
258
263
|
end
|
data/lib/nimbu/command/server.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require "nimbu/command/base"
|
3
|
-
require "nimbu/server/base"
|
4
|
-
require 'term/ansicolor'
|
5
|
-
require 'thin'
|
6
3
|
|
7
4
|
# running a local server to speed up designing Nimbu themes
|
8
5
|
#
|
@@ -22,6 +19,13 @@ class Nimbu::Command::Server < Nimbu::Command::Base
|
|
22
19
|
# --nocookies # disable session refresh cookie check
|
23
20
|
#
|
24
21
|
def index
|
22
|
+
require 'rubygems'
|
23
|
+
require "nimbu/server/base"
|
24
|
+
require 'term/ansicolor'
|
25
|
+
require 'thin'
|
26
|
+
require 'filewatcher'
|
27
|
+
require 'pathname'
|
28
|
+
|
25
29
|
# Check if config file is present?
|
26
30
|
if !Nimbu::Auth.read_configuration
|
27
31
|
print red(bold("ERROR")), ": this directory does not seem to contain any Nimbu theme configuration. \n ==> Run \"", bold { "nimbu init"}, "\" to initialize this directory."
|
@@ -243,10 +247,6 @@ class Nimbu::Command::Server < Nimbu::Command::Base
|
|
243
247
|
end
|
244
248
|
end
|
245
249
|
|
246
|
-
require 'rubygems'
|
247
|
-
require 'filewatcher'
|
248
|
-
require 'pathname'
|
249
|
-
|
250
250
|
class HamlWatcher
|
251
251
|
class << self
|
252
252
|
include Term::ANSIColor
|
data/lib/nimbu/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nimbu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zenjoy BVBA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: term-ansicolor
|
@@ -178,6 +178,20 @@ dependencies:
|
|
178
178
|
- - ">="
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: netrc
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
181
195
|
- !ruby/object:Gem::Dependency
|
182
196
|
name: filewatcher
|
183
197
|
requirement: !ruby/object:Gem::Requirement
|