lhj-tools 0.1.6 → 0.1.10

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.
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 }