lhj-tools 0.1.6 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/lhj/action/sh_helper.rb +138 -0
  3. data/lib/lhj/command/config/info.rb +67 -0
  4. data/lib/lhj/command/config.rb +11 -0
  5. data/lib/lhj/command/file_path.rb +20 -0
  6. data/lib/lhj/command/head_import.rb +19 -3
  7. data/lib/lhj/command/http.rb +14 -0
  8. data/lib/lhj/command/init.rb +38 -16
  9. data/lib/lhj/command/local/fetch.rb +1 -1
  10. data/lib/lhj/command/local/filter.rb +1 -1
  11. data/lib/lhj/command/local/local.rb +1 -1
  12. data/lib/lhj/command/local/local_upload.rb +1 -1
  13. data/lib/lhj/command/local/micro_service.rb +1 -1
  14. data/lib/lhj/command/oss/del.rb +1 -1
  15. data/lib/lhj/command/oss/list.rb +1 -1
  16. data/lib/lhj/command/oss/upload.rb +1 -1
  17. data/lib/lhj/command/refactor_rename.rb +1 -1
  18. data/lib/lhj/command/rename_image.rb +1 -1
  19. data/lib/lhj/command/sync_pod_repo.rb +153 -0
  20. data/lib/lhj/command/trans.rb +1 -1
  21. data/lib/lhj/command/yapi/formatters/base.rb +15 -0
  22. data/lib/lhj/command/yapi/formatters/command_context.rb +23 -0
  23. data/lib/lhj/command/yapi/formatters/service.rb +23 -0
  24. data/lib/lhj/command/yapi.rb +136 -98
  25. data/lib/lhj/command.rb +27 -5
  26. data/lib/lhj/tools/version.rb +1 -1
  27. data/lib/lhj/tools.rb +1 -0
  28. data/lib/lhj/tree/hash_walker.rb +1 -1
  29. data/lib/lhj/tree/path_walker.rb +1 -2
  30. data/lib/lhj/tree/tree.rb +5 -5
  31. data/lib/lhj/ui/errors/lhj_common_error.rb +19 -0
  32. data/lib/lhj/ui/errors/lhj_crash.rb +11 -0
  33. data/lib/lhj/ui/errors/lhj_error.rb +25 -0
  34. data/lib/lhj/ui/errors/lhj_exception.rb +19 -0
  35. data/lib/lhj/ui/errors/lhj_shell_error.rb +11 -0
  36. data/lib/lhj/ui/errors.rb +1 -0
  37. data/lib/lhj/ui/implementations/shell.rb +148 -0
  38. data/lib/lhj/ui/interface.rb +205 -0
  39. data/lib/lhj/ui/ui.rb +26 -0
  40. metadata +54 -2
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lhj
4
+ module ErbFormatter
5
+ # context
6
+ class Context
7
+ def initialize(target)
8
+ @target = target
9
+ end
10
+
11
+ def fetch_binding
12
+ @target.instance_eval { binding }.tap do |bind|
13
+ decorate_binding(bind)
14
+ end
15
+ end
16
+
17
+ # 空方法
18
+ def decorate_binding(bind)
19
+ bind.eval('save = 1')
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'erb'
2
+ require_relative 'base'
3
+ require_relative 'command_context'
4
+
5
+ module Lhj
6
+ module ErbFormatter
7
+ # service
8
+ class Service < Base
9
+ # @param [String] name
10
+ def render(name = 'yapi')
11
+ template(name).result(Context.new(@runner).fetch_binding)
12
+ end
13
+
14
+ def template(name)
15
+ if RUBY_VERSION < '2.6'
16
+ ERB.new(File.read(File.join(File.dirname(__FILE__), 'template', "#{name}.erb")), nil, '-')
17
+ else
18
+ ERB.new(File.read(File.join(File.dirname(__FILE__), 'template', "#{name}.erb")), trim_mode: '-')
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -2,9 +2,11 @@ require 'net/https'
2
2
  require 'uri'
3
3
  require 'json'
4
4
  require 'yaml'
5
+ require 'lhj/command/yapi/formatters/service'
5
6
 
6
7
  module Lhj
7
8
  class Command
9
+ # generate model from yapi
8
10
  class Yapi < Command
9
11
  self.summary = '通过yapi接口生成请求'
10
12
  self.description = '更新 ~/.lhj/yapi.yml 文件配置后执行`lhj api`生成接口模型'
@@ -21,23 +23,53 @@ module Lhj
21
23
  @id = argv.option('id')
22
24
  @model_pre_name = argv.option('model-pre')
23
25
  @save = argv.flag?('save', false)
26
+ @debug = argv.flag?('debug', false)
24
27
  @http_url = ''
25
28
  @http_headers = []
26
- @data_json = {}
27
- @models = []
28
29
  @config_id = ''
29
30
  @config_model_pre = 'ML'
30
31
  @model_default_suffix = 'Model'
31
32
  @type_trans = {}
32
33
  @config_model_names = []
33
34
  @model_names = []
35
+ # <<<===== model for template
36
+ @result_model_name = ''
37
+ @param_model_name = ''
38
+ @model_template = ''
39
+ @desc = ''
40
+ @path = ''
41
+ @path_name = ''
42
+ @path_key = ''
43
+ @method = 'GET'
44
+ @title = ''
45
+ @username = ''
46
+ @req_body_is_json_schema = false
47
+ # =====>>>
34
48
  super
35
49
  end
36
50
 
37
- def run
38
- load_config
39
- fetch_model
40
- print_methods
51
+ def begin_title
52
+ '读取配置文件~/.lhj/yapi.yml'
53
+ end
54
+
55
+ def handle
56
+ process(yml_file) if File.exist?(yml_file)
57
+ end
58
+
59
+ def process(config_file)
60
+ load_config(config_file)
61
+ res_body = req_api_model
62
+ return unless res_body && res_body['errcode'].to_i.zero? && !res_body.empty?
63
+
64
+ # 1.print request result
65
+ print_res_body_model(res_body)
66
+ # 2.print request json body
67
+ print_req_body_model(res_body)
68
+ # 3.print request param
69
+ print_req_query(res_body['data'])
70
+ # 4.print request method
71
+ print_http_method(res_body['data'])
72
+ # 5.save to file
41
73
  save_to_file if @save
42
74
  end
43
75
 
@@ -49,13 +81,19 @@ module Lhj
49
81
  end
50
82
 
51
83
  def puts_h(str)
52
- puts str
84
+ puts str.magenta
85
+ @h_file_array ||= []
86
+ @h_file_array << str
87
+ end
88
+
89
+ def puts_h_red(str)
90
+ puts str.red
53
91
  @h_file_array ||= []
54
92
  @h_file_array << str
55
93
  end
56
94
 
57
95
  def puts_m(str)
58
- puts str
96
+ puts str.blue
59
97
  @m_file_array ||= []
60
98
  @m_file_array << str
61
99
  end
@@ -65,20 +103,23 @@ module Lhj
65
103
  file_name = gen_model_name('')
66
104
  h_file = File.join('.', "#{file_name}.h")
67
105
  m_file = File.join('.', "#{file_name}.m")
68
- File.write(h_file, @h_file_array.join("\n")) if @h_file_array.count > 0
69
- File.write(m_file, @m_file_array.join("\n")) if @m_file_array.count > 0
70
- puts "\n\n生成文件成功!所在路径:\n#{File.expand_path(h_file)} \n#{File.expand_path(m_file)}"
106
+ File.write(h_file, @h_file_array.join("\n")) if @h_file_array.count.positive?
107
+ File.write(m_file, @m_file_array.join("\n")) if @m_file_array.count.positive?
108
+ puts "\n\n生成文件成功!所在路径:\n#{File.expand_path(h_file)} \n#{File.expand_path(m_file)}".green
71
109
  end
72
110
 
73
111
  def url_str
74
112
  "#{@http_url}#{api_id}"
75
113
  end
76
114
 
77
- def load_config
78
- yml = File.join(Lhj::Config.instance.home_dir, 'yapi.yml')
79
- config = YAML.load_file(yml)
115
+ def yml_file
116
+ File.join(Lhj::Config.instance.home_dir, 'yapi.yml')
117
+ end
118
+
119
+ def load_config(file)
120
+ config = YAML.load_file(file)
80
121
  config.each do |k, v|
81
- @http_headers << "#{k}=#{v}" if (k.eql?('__wpkreporterwid_') || k.eql?('_yapi_token') || k.eql?('_yapi_uid'))
122
+ @http_headers << "#{k}=#{v}" if k.eql?('__wpkreporterwid_') || k.eql?('_yapi_token') || k.eql?('_yapi_uid')
82
123
  end
83
124
  @http_url = config['url']
84
125
  @config_id = config['id']
@@ -100,79 +141,81 @@ module Lhj
100
141
  @config_model_suffix || @model_default_suffix
101
142
  end
102
143
 
103
- def req_model
144
+ def req_api_model
104
145
  uri = URI.parse(url_str)
105
146
  req = Net::HTTP::Get.new(uri)
106
147
  req['Cookie'] = @http_headers.join('; ')
107
148
  res = Net::HTTP.start(uri.hostname, uri.port) do |http|
108
149
  http.request(req)
109
150
  end
110
- puts res.body
111
- JSON.parse(res.body)
151
+ res_json = JSON.parse(res.body)
152
+ puts res.body unless res_json['errcode'].to_i.zero?
153
+ puts res.body if @debug
154
+ res_json
112
155
  end
113
156
 
114
- def fetch_model
115
- res_json = req_model
116
- begin
117
- puts "\n<===============打印返回数据模型-Begin=====================>\n"
118
- fetch_res_boy(res_json)
119
- print_models
120
- print_models_implementation
121
- puts "\n<===============打印返回数据模型-End=====================>\n"
157
+ def print_res_body_model(res_json)
158
+ res_body = fetch_res_boy(res_json)
159
+ return unless res_body
160
+
161
+ puts "\n<===============打印返回数据模型-Begin=====================>\n".green
162
+ models = []
163
+ handle_model(res_body) do |model|
164
+ models << model
122
165
  end
123
- begin
124
- puts "\n<===============打印请求模型-Begin=====================>\n"
125
- @models = []
126
- @model_names = []
127
- fetch_req_body(res_json)
128
- print_models
129
- print_models_implementation
130
- puts "\n<===============打印请求模型-End=====================>\n"
166
+ print_models(models)
167
+ print_models_impl(models)
168
+ @result_model_name = models.last[:name]
169
+ puts "\n<===============打印返回数据模型-End=====================>\n".green
170
+ end
171
+
172
+ def print_req_body_model(res_json)
173
+ req_body = fetch_req_body(res_json)
174
+ return unless req_body
175
+
176
+ puts "\n<===============打印请求模型-Begin=====================>\n".green
177
+ models = []
178
+ handle_model(req_body) do |model|
179
+ models << model
131
180
  end
181
+ print_models(models)
182
+ print_models_impl(models)
183
+ @param_model_name = models.last[:name]
184
+ puts "\n<===============打印请求模型-End=====================>\n".green
132
185
  end
133
186
 
134
187
  def fetch_res_boy(res_json)
135
- if res_json && res_json['data']
136
- @data_json = res_json['data']
137
- if @data_json['res_body']
138
- begin
139
- res_body = JSON.parse(@data_json['res_body'])
140
- detail_obj = res_body['properties']['detailMsg'] || {}
141
- detail_obj['name'] = gen_model_name('')
142
- handle_model(detail_obj)
143
- rescue => ex
144
- puts ex
145
- end
146
- end
147
- end
188
+ return if !res_json || !res_json['data'] || !res_json['data']['res_body']
189
+
190
+ res_body = JSON.parse(res_json['data']['res_body'])
191
+ return if !res_body['properties'] || !res_body['properties']['detailMsg']
192
+
193
+ result = res_body['properties']['detailMsg']
194
+ return unless result['type'] == 'object' || result['type'] == 'array'
195
+
196
+ result['name'] = gen_model_name('')
197
+ result
148
198
  end
149
199
 
150
200
  def fetch_req_body(res_json)
151
- if res_json && res_json['data']
152
- @data_json = res_json['data']
153
- if @data_json['req_body_other']
154
- begin
155
- res_body = JSON.parse(@data_json['req_body_other'])
156
- res_body['name'] = gen_model_name('')
157
- handle_model(res_body)
158
- rescue => ex
159
- puts ex
160
- end
161
- end
162
- end
201
+ return if !res_json || !res_json['data'] || !res_json['data']['req_body_other']
202
+
203
+ result = JSON.parse(res_json['data']['req_body_other'])
204
+ result['name'] = gen_model_name('')
205
+ result
163
206
  end
164
207
 
165
208
  def gen_model_name(name)
166
209
  n = name.gsub(/vo|model|list/i, '').gsub(/(.*)s$/, '\1').gsub(/^\w/) { $&.upcase }
167
210
  if n.length <= 0
168
- n = @config_model_names.detect { |c| !@model_names.any? { |n| n.gsub(/#{model_pre}(.*)Model/, '\1').eql?(c) } }
211
+ n = @config_model_names.detect { |c| @model_names.none? { |na| na.gsub(/#{model_pre}(.*)Model/, '\1').eql?(c) } }
169
212
  end
170
213
  model_name = "#{model_pre}#{n}#{model_suffix}"
171
214
  @model_names << model_name
172
215
  model_name
173
216
  end
174
217
 
175
- def handle_model(model)
218
+ def handle_model(model, &block)
176
219
  p_type = model['type']
177
220
  p_name = model['name']
178
221
  p_properties = model['properties']
@@ -191,22 +234,22 @@ module Lhj
191
234
  c_model[:type_name] = 'NSString'
192
235
  else
193
236
  c_model[:type_name] = o['name']
194
- handle_model(o)
237
+ handle_model(o, &block)
195
238
  end
196
239
  end
197
240
  properties << c_model
198
241
  end
199
242
  p_model[:properties] = properties
200
- @models << p_model
243
+ block[p_model] if block_given?
201
244
  when 'array'
202
245
  t = model['items']
203
246
  t['name'] = p_name
204
- handle_model(t)
247
+ handle_model(t, &block)
205
248
  end
206
249
  end
207
250
 
208
- def print_models
209
- @models.each do |model|
251
+ def print_models(models)
252
+ models.each do |model|
210
253
  model_name = model[:name] || ''
211
254
  model_properties = model[:properties]
212
255
  puts_h "@interface #{model_name} : NSObject"
@@ -217,11 +260,11 @@ module Lhj
217
260
  end
218
261
  end
219
262
 
220
- def print_models_implementation
221
- @models.each do |model|
263
+ def print_models_impl(models)
264
+ models.each do |model|
222
265
  puts_m "@implementation #{model[:name]}"
223
266
  str = model[:properties].filter { |p| p[:type].eql?('array') && !p[:type_name].eql?('NSString') }.map { |p| "@\"#{p[:key]}\": #{p[:type_name]}.class" }.join(', ')
224
- if str && str.length > 0
267
+ if str && str.length.positive?
225
268
  puts_m '+(NSDictionary *)modelContainerPropertyGenericClass {'
226
269
  puts_m " return @{#{str}};"
227
270
  puts_m '}'
@@ -242,9 +285,9 @@ module Lhj
242
285
  case type
243
286
  when 'integer'
244
287
  puts_h "@property (nonatomic, assign) NSInteger #{key};"
245
- if des.include?('分')
246
- puts_h '/////////==========删掉其中一个属性'
247
- puts_h "@property (nonatomic, strong) MLCentNumber *#{key};"
288
+ if des.include?('分') || des.include?('0.01')
289
+ puts_h_red '/////////==========删掉其中一个属性'
290
+ puts_h_red "@property (nonatomic, strong) MLCentNumber *#{key};"
248
291
  end
249
292
  when 'cent'
250
293
  puts_h "@property (nonatomic, strong) MLCentNumber *#{key};"
@@ -267,39 +310,34 @@ module Lhj
267
310
  end
268
311
  end
269
312
 
270
- def print_methods
271
- puts "\n<===============方法调用=====================>\n"
272
- puts_m '/**'
273
- puts_m " * #{@data_json['title']} -- #{@data_json['username']}"
274
- puts_m ' */'
275
- key_str = @data_json['path'].split('/').map { |s| s.gsub(/[^A-Za-z0-9]/, '').gsub(/^\w/) { $&.upcase } }.join('')
276
- key = "k#{key_str}URL"
277
- puts_m "static NSString * const #{key} = @\"#{@data_json['path']}\";"
278
- puts_m "\n\n"
313
+ # @param [Object] data
314
+ def print_req_query(data)
315
+ return unless data && data['req_query']
316
+
279
317
  puts_h '@interface MLParamModel : NSObject'
280
- @data_json['req_query'].each do |h|
318
+ data['req_query'].each do |h|
281
319
  des = h['desc']
282
320
  puts_h "///#{des} #{h['example']}"
283
321
  puts_h "@property (nonatomic, copy) NSString *#{h['name']};"
284
322
  end
285
323
  puts_h '@end'
286
324
  puts "\n\n"
287
- model = @models.last
288
- if @data_json['method'].eql?('GET')
289
- puts_m " [MLNetworkingManager getWithUrl:#{key} params:nil response:^(MLResponseMessage *responseMessage) {"
290
- puts_m ' if (response.resultCode == 0 && !response.error){'
291
- puts_m ' NSDictionary *detailMsg = response.detailMsg'
292
- puts_m " #{model[:name]} *model = [#{model[:name]} yy_modelWithDictionary:detailMsg];" if model
293
- puts_m ' }'
294
- puts_m ' }];'
295
- else
296
- puts_m " [MLNetworkingManager postWithUrl:#{key} params:nil response:^(MLResponseMessage *responseMessage) {"
297
- puts_m ' if (response.resultCode == 0 && !response.error){'
298
- puts_m ' NSDictionary *detailMsg = response.detailMsg'
299
- puts_m " #{model[:name]} *model = [#{model[:name]} yy_modelWithDictionary:detailMsg];" if model
300
- puts_m ' }'
301
- puts_m ' }];'
302
- end
325
+ end
326
+
327
+ def print_http_method(data)
328
+ return unless data
329
+
330
+ @path = data['path']
331
+ @method = data['method']
332
+ @title = data['title']
333
+ @username = data['username']
334
+ @desc = data['desc']
335
+ @method = 'JSON' if data['req_body_is_json_schema']
336
+ @path_name = @path.split('/').map { |s| s.gsub(/[^A-Za-z0-9]/, '').gsub(/^\w/) { $&.upcase } }.join('') if @path
337
+ @path_key = "k#{@path_name}URL"
338
+ puts "\n<===============方法调用=====================>\n".green
339
+ @model_template = Lhj::ErbFormatter::Service.new(self).render('model')
340
+ puts Lhj::ErbFormatter::Service.new(self).render('yapi').blue
303
341
  end
304
342
  end
305
343
  end
data/lib/lhj/command.rb CHANGED
@@ -1,10 +1,13 @@
1
1
  require 'claide'
2
2
  require "tty-spinner"
3
+ require 'lhj/action/sh_helper'
4
+ require 'lhj/ui/ui'
3
5
 
4
6
  module Lhj
5
7
  # command plugin
6
8
  class Command < CLAide::Command
7
9
  require 'lhj/command/init'
10
+ require 'lhj/command/config'
8
11
  require 'lhj/command/head_import'
9
12
  require 'lhj/command/refactor_rename'
10
13
  require 'lhj/command/local/fetch'
@@ -20,21 +23,40 @@ module Lhj
20
23
  require 'lhj/command/rename_image'
21
24
  require 'lhj/command/trans'
22
25
  require 'lhj/command/yapi'
26
+ require 'lhj/command/file_path'
27
+ require 'lhj/command/http'
28
+ require 'lhj/command/sync_pod_repo'
23
29
 
24
30
  self.abstract_command = true
25
31
  self.command = 'lhj'
26
32
 
27
- def spinner
28
- @spinner ||= TTY::Spinner.new('[:spinner]正在处理...', output: $stdout, format: :dots)
33
+ def begin_title
34
+ '开始处理...'
29
35
  end
30
36
 
31
37
  def auto_spin
32
- spinner.auto_spin
33
- puts "\n"
38
+ puts begin_title.green
39
+ # @spinner.auto_spin
34
40
  end
35
41
 
36
42
  def stop
37
- spinner.stop('Done!')
43
+ puts '处理完成'.green
44
+ # @spinner.success('Done!')
45
+ end
46
+
47
+ def initialize(argv)
48
+ super(argv)
49
+ @spinner = TTY::Spinner.new('[:spinner]...', output: $stdout, format: :dots, clear: true)
50
+ end
51
+
52
+ def run
53
+ auto_spin
54
+ handle
55
+ stop
56
+ end
57
+
58
+ def handle
59
+ raise 'A subclass should override the `Lhj::Command#run` method'
38
60
  end
39
61
 
40
62
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Lhj
4
4
  module Tools
5
- VERSION = "0.1.6"
5
+ VERSION = "0.1.10"
6
6
  end
7
7
  end
data/lib/lhj/tools.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require_relative "tools/version"
3
+ require 'colored'
3
4
 
4
5
  module Lhj
5
6
  require 'lhj/config'
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'pathname'
4
4
 
5
- require 'lhj/tree/node'
5
+ require_relative 'node'
6
6
 
7
7
  module Lhj
8
8
  class Tree
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'pathname'
4
-
5
- require 'lhj/tree/node'
4
+ require_relative 'node'
6
5
 
7
6
  module Lhj
8
7
  class Tree
data/lib/lhj/tree/tree.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'lhj/tree/node'
4
- require 'lhj/tree/directory_renderer'
5
- require 'lhj/tree/number_renderer'
6
- require 'lhj/tree/hash_walker'
7
- require 'lhj/tree/path_walker'
3
+ require_relative 'node'
4
+ require_relative 'directory_renderer'
5
+ require_relative 'number_renderer'
6
+ require_relative 'hash_walker'
7
+ require_relative 'path_walker'
8
8
 
9
9
  module Lhj
10
10
  class Tree
@@ -0,0 +1,19 @@
1
+ require_relative 'lhj_exception'
2
+
3
+ module Lhj
4
+ class Interface
5
+ # Super class for exception types that we do not want to record
6
+ # explicitly as crashes or user errors
7
+ class LhjCommonException < LhjException; end
8
+
9
+ # Raised when there is a build failure in xcodebuild
10
+ class LhjBuildFailure < LhjCommonException; end
11
+
12
+ # Raised when a test fails when being run by tools such as scan or snapshot
13
+ class LhjTestFailure < LhjCommonException; end
14
+
15
+ # Raise this type of exception when a failure caused by a third party
16
+ # dependency (i.e. xcodebuild, gradle, slather) happens.
17
+ class LhjDependencyCausedException < LhjCommonException; end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'lhj_exception'
2
+
3
+ module Lhj
4
+ class Interface
5
+ class LhjCrash < LhjException
6
+ def prefix
7
+ '[LHJ_CRASH]'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'lhj_exception'
2
+
3
+ module Lhj
4
+ class Interface
5
+ class LhjError < LhjException
6
+ attr_reader :show_github_issues
7
+ attr_reader :error_info
8
+
9
+ def initialize(show_github_issues: false, error_info: nil)
10
+ @show_github_issues = show_github_issues
11
+ @error_info = error_info
12
+ end
13
+
14
+ def prefix
15
+ '[USER_ERROR]'
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ class Exception
22
+ # def fastlane_should_report_metrics?
23
+ # return false
24
+ # end
25
+ end
@@ -0,0 +1,19 @@
1
+ module Lhj
2
+ class Interface
3
+ class LhjException < StandardError
4
+ def prefix
5
+ '[LHJ_EXCEPTION]'
6
+ end
7
+
8
+ def caused_by_calling_ui_method?(method_name: nil)
9
+ return false if backtrace.nil? || backtrace[0].nil? || method_name.nil?
10
+ first_frame = backtrace[0]
11
+ if first_frame.include?(method_name) && first_frame.include?('interface.rb')
12
+ true
13
+ else
14
+ false
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'lhj_exception'
2
+
3
+ module Lhj
4
+ class Interface
5
+ class LhjShellError < LhjException
6
+ def prefix
7
+ '[SHELL_ERROR]'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1 @@
1
+ Dir[File.dirname(__FILE__) + "/errors/*.rb"].each { |f| require_relative f }