lhj-tools 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2d7427bf47063e690b70a09d1bf6987c387d7289ec0c4206fd7d6182372e463e
4
- data.tar.gz: d43905b649b15c84de3120b966c42ebb684bdacfec57af0ac2c622fb57218c79
3
+ metadata.gz: bc16cb199d5effe6c4e343846614075ce57b187a5ffc94029018b6aba9984806
4
+ data.tar.gz: 95f135ea8bc7b9149ca8c0038ddd8b385e0d56b6ff5f19f8da871c844ff5bae1
5
5
  SHA512:
6
- metadata.gz: 5c3f50b5221b68bdec3d7257c31456a70f9fc04263fd48ce4007157b638ab96613a8077339ae016126c9abf0cb75bc2d35f5bb6ef98f70ca55d3310512e21171
7
- data.tar.gz: 0bbff5886d4a5aace7ad8c2143db0fbfe7a7c52cf5809e62a6325a478f7c9c045aede8f74eea640e5a366b38cc6f203e87c372187a257452b65e557d5e87eec3
6
+ metadata.gz: '0738172f4def843dfd49872dabb456db63dec9a1f92b335dfa5fd027cbba51077890f0e693349d08b9cb91b020506fae1fd3676aa32b00d14d0d074d80331a4a'
7
+ data.tar.gz: 5b835d1c230e54377d9fa2c8ad9a847b00c37fa57a5737d60fbdf6834a1925f84033f58f429671cef50e57319e39ed18c8662bdfdd9141d403e5e72371394d8e
@@ -0,0 +1,138 @@
1
+ require "open3"
2
+
3
+ module Lhj
4
+ module Actions
5
+ # Execute a shell command
6
+ # This method will output the string and execute it
7
+ # Just an alias for sh_no_action
8
+ # When running this in tests, it will return the actual command instead of executing it
9
+ # @param log [Boolean] should fastlane print out the executed command
10
+ # @param error_callback [Block] a callback invoked with the command output if there is a non-zero exit status
11
+ def self.sh(*command, log: true, error_callback: nil, &b)
12
+ sh_control_output(*command, print_command: log, print_command_output: log, error_callback: error_callback, &b)
13
+ end
14
+
15
+ def self.sh_no_action(*command, log: true, error_callback: nil, &b)
16
+ sh_control_output(*command, print_command: log, print_command_output: log, error_callback: error_callback, &b)
17
+ end
18
+
19
+ def self.sh_enabled?
20
+ true
21
+ end
22
+
23
+ # @param command The command to be executed (variadic)
24
+ # @param print_command [Boolean] Should we print the command that's being executed
25
+ # @param print_command_output [Boolean] Should we print the command output during execution
26
+ # @param error_callback [Block] A block that's called if the command exits with a non-zero status
27
+ # @yield [status, result, cmd] The return status of the command, all output from the command and an equivalent shell command
28
+ # @yieldparam [Process::Status] status A Process::Status indicating the status of the completed command
29
+ # @yieldparam [String] result The complete output to stdout and stderr of the completed command
30
+ # @yieldparam [String] cmd A shell command equivalent to the arguments passed
31
+ # rubocop: disable Metrics/PerceivedComplexity
32
+ def self.sh_control_output(*command, print_command: true, print_command_output: true, error_callback: nil)
33
+ print_command = print_command_output = true if $troubleshoot
34
+ # Set the encoding first, the user might have set it wrong
35
+ previous_encoding = [Encoding.default_external, Encoding.default_internal]
36
+ Encoding.default_external = Encoding::UTF_8
37
+ Encoding.default_internal = Encoding::UTF_8
38
+
39
+ # Workaround to support previous Fastlane syntax.
40
+ # This has some limitations. For example, it requires the caller to shell escape
41
+ # everything because of usages like ["ls -la", "/tmp"] instead of ["ls", "-la", "/tmp"].
42
+ command = [command.first.join(" ")] if command.length == 1 && command.first.kind_of?(Array)
43
+
44
+ shell_command = shell_command_from_args(*command)
45
+ UI.command(shell_command) if print_command
46
+
47
+ result = ''
48
+ exit_status = nil
49
+ if sh_enabled?
50
+ # The argument list is passed directly to Open3.popen2e, which
51
+ # handles the variadic argument list in the same way as Kernel#spawn.
52
+ # (http://ruby-doc.org/core-2.4.2/Kernel.html#method-i-spawn) or
53
+ # Process.spawn (http://ruby-doc.org/core-2.4.2/Process.html#method-c-spawn).
54
+ #
55
+ # sh "ls -la /Applications/Xcode\ 7.3.1.app"
56
+ # sh "ls", "-la", "/Applications/Xcode 7.3.1.app"
57
+ # sh({ "FOO" => "Hello" }, "echo $FOO")
58
+ Open3.popen2e(*command) do |stdin, io, thread|
59
+ io.sync = true
60
+ io.each do |line|
61
+ UI.command_output(line.strip) if print_command_output
62
+ result << line
63
+ end
64
+ exit_status = thread.value
65
+ end
66
+
67
+ # Checking Process::Status#exitstatus instead of #success? makes for more
68
+ # testable code. (Tests mock exitstatus only.) This is also consistent
69
+ # with previous implementations of sh and... probably portable to all
70
+ # relevant platforms.
71
+ if exit_status.exitstatus != 0
72
+ message = if print_command
73
+ "Exit status of command '#{shell_command}' was #{exit_status.exitstatus} instead of 0."
74
+ else
75
+ "Shell command exited with exit status #{exit_status.exitstatus} instead of 0."
76
+ end
77
+ message += "\n#{result}" if print_command_output
78
+
79
+ if error_callback || block_given?
80
+ UI.error(message)
81
+ # block notified below, on success or failure
82
+ error_callback && error_callback.call(result)
83
+ else
84
+ UI.shell_error!(message)
85
+ end
86
+ end
87
+ else
88
+ result << shell_command # only for the tests
89
+ end
90
+
91
+ if block_given?
92
+ # Avoid yielding nil in tests. $? will be meaningless, but calls to
93
+ # it will not crash. There is no Process::Status.new. The alternative
94
+ # is to move this inside the sh_enabled? check and not yield in tests.
95
+ return yield(exit_status || $?, result, shell_command)
96
+ end
97
+ result
98
+ rescue => ex
99
+ raise ex
100
+ ensure
101
+ Encoding.default_external = previous_encoding.first
102
+ Encoding.default_internal = previous_encoding.last
103
+ end
104
+ # rubocop: enable Metrics/PerceivedComplexity
105
+
106
+ # Used to produce a shell command string from a list of arguments that may
107
+ # be passed to methods such as Kernel#system, Kernel#spawn and Open3.popen2e
108
+ # in order to print the command to the terminal. The same *args are passed
109
+ # directly to a system call (Open3.popen2e). This interpretation is not
110
+ # used when executing a command.
111
+ #
112
+ # @param args Any number of arguments used to construct a command
113
+ # @raise [ArgumentError] If no arguments passed
114
+ # @return [String] A shell command representing the arguments passed in
115
+ def self.shell_command_from_args(*args)
116
+ raise ArgumentError, "sh requires at least one argument" unless args.count > 0
117
+
118
+ command = ""
119
+
120
+ # Optional initial environment Hash
121
+ if args.first.kind_of?(Hash)
122
+ command = args.shift.map { |k, v| "#{k}=#{v.shellescape}" }.join(" ") + " "
123
+ end
124
+
125
+ # Support [ "/usr/local/bin/foo", "foo" ], "-x", ...
126
+ if args.first.kind_of?(Array)
127
+ command += args.shift.first.shellescape + " " + args.shelljoin
128
+ command.chomp!(" ")
129
+ elsif args.count == 1 && args.first.kind_of?(String)
130
+ command += args.first
131
+ else
132
+ command += args.shelljoin
133
+ end
134
+
135
+ command
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,47 @@
1
+ require 'highline'
2
+ require 'lhj/config'
3
+
4
+ module Lhj
5
+ class Command
6
+ class Config < Command
7
+ # show config info
8
+ class Info < Config
9
+ self.summary = '查看配置信息'
10
+
11
+ def initialize(argv)
12
+ @cli = HighLine.new
13
+ super
14
+ end
15
+
16
+ def handle
17
+ show_config
18
+ end
19
+
20
+ def show_config
21
+ config_arr = Dir.glob("#{config_dir}/**/*.yml")
22
+ config_arr.each_index { |i| puts "#{i}.#{File.basename(config_arr[i])}".yellow }
23
+ idx = ask_which_one
24
+ config_file = config_arr[idx]
25
+ show_yaml(config_file)
26
+ end
27
+
28
+ def show_yaml(file)
29
+ table_rows = []
30
+ yaml = YAML.load_file(file)
31
+ yaml.each { |key, value| table_rows << [key, value] }
32
+ title = File.basename(file).to_s
33
+ table = Terminal::Table.new title: title, headings: %w[键 值], rows: table_rows
34
+ puts table
35
+ end
36
+
37
+ def ask_which_one
38
+ @cli.ask('查看哪个配置: '.green).strip.to_i
39
+ end
40
+
41
+ def config_dir
42
+ Lhj::Config.instance.home_dir
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,11 @@
1
+ require 'lhj/command/config/info'
2
+
3
+ module Lhj
4
+ class Command
5
+ # sync config
6
+ class Config < Command
7
+ self.summary = '配置操作'
8
+ self.abstract_command = true
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ require 'lhj/tree/tree'
2
+
3
+ module Lhj
4
+ class Command
5
+ # show file path
6
+ class Filepath < Command
7
+ self.summary = '显示文件目录'
8
+
9
+ def initialize(argv)
10
+ @current_path = argv.shift_argument || Dir.pwd
11
+ super
12
+ end
13
+
14
+ def handle
15
+ tree = Lhj::Tree.new(@current_path)
16
+ puts tree.render
17
+ end
18
+ end
19
+ end
20
+ end
@@ -5,7 +5,8 @@ require 'fileutils'
5
5
 
6
6
  module Lhj
7
7
  class Command
8
- class Import < Command
8
+ # modify header
9
+ class HeaderImport < Command
9
10
  self.summary = '更改头文件引入'
10
11
 
11
12
  def initialize(argv)
@@ -13,14 +14,16 @@ module Lhj
13
14
  @framework = argv.option('framework')
14
15
  @header_map = {}
15
16
  @header_folder_map = {}
17
+ @modify_files = []
16
18
  super
17
19
  end
18
20
 
19
- def run
21
+ def handle
20
22
  generate_header_map
21
23
  # say_header_map
22
24
  # find_all_sub_folder
23
25
  update_source_header
26
+ # print_modify_info
24
27
  end
25
28
 
26
29
  # @return [@header_map]
@@ -109,7 +112,10 @@ module Lhj
109
112
  result = line
110
113
  if line =~ /#import/
111
114
  ma = find_head_key(line)
112
- result = line.gsub(ma[0], @header_map[ma[0].to_sym] || ma[0]) if ma && !exist_in_file(file, ma[0])
115
+ if ma && !exist_in_file(file, ma[0])
116
+ result = line.gsub(ma[0], @header_map[ma[0].to_sym] || ma[0])
117
+ # @modify_files << file unless @modify_files.include?(file)
118
+ end
113
119
  end
114
120
  result
115
121
  end
@@ -123,6 +129,16 @@ module Lhj
123
129
  header_reg = /"\D*.h"/
124
130
  line.match(header_reg)
125
131
  end
132
+
133
+ def print_modify_info
134
+ rows = []
135
+ @modify_files.each do |file|
136
+ rows << [File.basename(file), File.absolute_path(file)]
137
+ end
138
+ title = "修改了#{rows.count}个文件"
139
+ table = Terminal::Table.new title: title, headings: %w[文件 路径], rows: rows
140
+ puts table
141
+ end
126
142
  end
127
143
  end
128
144
  end
@@ -0,0 +1,14 @@
1
+ require 'excon'
2
+
3
+ module Lhj
4
+ class Command
5
+ # http client
6
+ class Http < Command
7
+
8
+ def handle
9
+ response = Excon.get('http://www.baidu.com')
10
+ puts response.body
11
+ end
12
+ end
13
+ end
14
+ end
@@ -11,11 +11,9 @@ module Lhj
11
11
  self.summary = '初始化控件'
12
12
  self.description = '使用工具前先执行`lhj init`'
13
13
 
14
- def run
15
- auto_spin
14
+ def handle
16
15
  FileUtils.mkdir_p(target_folder) unless File.exist?(target_folder)
17
16
  download_file
18
- stop
19
17
  end
20
18
 
21
19
  def down_load_urls
@@ -22,7 +22,7 @@ module Lhj
22
22
  super
23
23
  end
24
24
 
25
- def run
25
+ def handle
26
26
  handle_files
27
27
  gen_csv
28
28
  # update_source_header
@@ -16,7 +16,7 @@ module Lhj
16
16
  super
17
17
  end
18
18
 
19
- def run
19
+ def handle
20
20
  fetch_keys
21
21
  read_csv
22
22
  gen_csv
@@ -39,7 +39,7 @@ module Lhj
39
39
  super
40
40
  end
41
41
 
42
- def run
42
+ def handle
43
43
  down_load_csv_file if need_download
44
44
  read_csv
45
45
  if @key_map.keys.length.positive?
@@ -28,7 +28,7 @@ module Lhj
28
28
  "csv/#{Time.now.to_i}/#{file_name}"
29
29
  end
30
30
 
31
- def run
31
+ def handle
32
32
  csv_files = File.join(@pwd_path, '**', csv_file_name)
33
33
  Dir.glob(csv_files).each do |f|
34
34
  file_name = File.basename(f)
@@ -15,7 +15,7 @@ module Lhj
15
15
  super
16
16
  end
17
17
 
18
- def run
18
+ def handle
19
19
  read_csv
20
20
  update_source
21
21
  end
@@ -30,7 +30,7 @@ module Lhj
30
30
  super
31
31
  end
32
32
 
33
- def run
33
+ def handle
34
34
  if @type
35
35
  objects = Lhj::OSS::Helper.instance.list
36
36
  objects.each do |o|
@@ -7,7 +7,7 @@ module Lhj
7
7
  class List < OSS
8
8
  self.summary = '查看oss列表'
9
9
 
10
- def run
10
+ def handle
11
11
  objects = Lhj::OSS::Helper.instance.list
12
12
  rows = []
13
13
  objects.each do |o|
@@ -36,7 +36,7 @@ module Lhj
36
36
  super
37
37
  end
38
38
 
39
- def run
39
+ def handle
40
40
  Dir.glob("#{@current_path}/*").each do |f|
41
41
  file_name = File.basename(f)
42
42
  if @name && /#{@name}/ =~ file_name
@@ -36,7 +36,7 @@ module Lhj
36
36
  super
37
37
  end
38
38
 
39
- def run
39
+ def handle
40
40
  update_source_file
41
41
  print_info
42
42
  end
@@ -30,7 +30,7 @@ module Lhj
30
30
  super
31
31
  end
32
32
 
33
- def run
33
+ def handle
34
34
  rename_image
35
35
  end
36
36
 
@@ -0,0 +1,138 @@
1
+ require 'lhj/config'
2
+ require 'highline'
3
+
4
+ module Lhj
5
+ class Command
6
+ # sync code to pod
7
+ class SyncPod < Command
8
+ self.summary = '同步代码到私用仓库'
9
+
10
+ def initialize(argv)
11
+ @cli = HighLine.new
12
+ super
13
+ end
14
+
15
+ def handle
16
+ sync
17
+ end
18
+
19
+ def sync
20
+ config_file = File.join(Lhj::Config.instance.home_dir, 'pod_config.yml')
21
+ arr = YAML.load_file(config_file)
22
+ arr.each_index { |i| puts "#{i}.#{arr[i]['pod']}".yellow }
23
+ idx = @cli.ask('请选择哪一个库同步: '.green).strip.to_i
24
+ pod_name = arr[idx]['pod']
25
+ src = arr[idx]['main_path']
26
+ dest = arr[idx]['pod_path']
27
+ FileUtils.cp_r(src, dest, remove_destination: true)
28
+ puts '1.从主工程复制代码到pod库成功'.green
29
+
30
+ ma = nil
31
+ Dir.chdir(dest) do
32
+ Dir.glob("*.podspec").each do |p|
33
+ update_podspec_version(p)
34
+ version_line = IO.readlines(p).find{ |line| (/\.version/ =~ line) && (version_regex =~ line) }
35
+ ma = version_line.match(version_regex)
36
+ end
37
+ puts '2.更新版本号成功'.green
38
+
39
+ Actions.sh("git add .")
40
+ puts '3.git add成功'.green
41
+
42
+ Actions.sh("git commit -m '同步主工程代码by fastlane'")
43
+ puts '4.git 提交成功'.green
44
+
45
+ Actions.sh("git push")
46
+ puts '5.git 推送成功'.green
47
+
48
+ add_tag(ma[0]) if ma
49
+ puts "6.设置tag成功! tag号:#{ma[0]}".green
50
+
51
+ push_tag
52
+ puts '7.推送tag成功'.green
53
+
54
+ update_pod_repo
55
+ puts "8.#{pod_name}推送pod repo成功".green
56
+
57
+ end
58
+
59
+ if ma
60
+ pod_version = ma[0]
61
+ update_all_pod_dependency(pod_name, pod_version)
62
+ puts '9.更新主工程引用pod版本号成功'.green
63
+ end
64
+
65
+ puts '10.手动执行`pod update --verbose --no-repo-update`更新pod'.green
66
+ end
67
+
68
+ def version_regex
69
+ /\d+\.\d+\.(\d+)/
70
+ end
71
+
72
+ def update_podspec_version(path)
73
+ str = ''
74
+ File.readlines(path).each do |l|
75
+ if (/\.version/ =~ l) && (version_regex =~ l)
76
+ last_version = l.scan(version_regex).flatten.first
77
+ next_version = last_version.to_i + 1
78
+ next_version_str = next_version.to_s
79
+ str += l.gsub(/(\d+\.\d+\.)(\d+)/, '\1' + next_version_str)
80
+ else
81
+ str += l.dup
82
+ end
83
+ end
84
+ File.write(path, str)
85
+ end
86
+
87
+ def add_tag(tag)
88
+ cmd = ['git tag']
89
+ cmd << '--force'
90
+ cmd << tag
91
+ UI.message("Adding git tag '#{tag}' 🎯.")
92
+ Actions.sh(cmd.join(' '))
93
+ end
94
+
95
+ def push_tag
96
+ cmd = ['git push --tags']
97
+ UI.message("git push --tags 🎯.")
98
+ Actions.sh(cmd.join(' '))
99
+ end
100
+
101
+ def update_pod_repo
102
+ # pod repo push miguatech-aomi_ios-mlspecs *.podspec --sources=miguatech-aomi_ios-mlspecs,aliyun,trunk --allow-warnings --use-libraries --verbose
103
+ cmd = ['pod repo push']
104
+ pod_repo_name = 'miguatech-aomi_ios-mlspecs'
105
+ cmd << pod_repo_name
106
+ cmd << "*.podspec"
107
+ cmd << "--sources=#{pod_repo_name},aliyun,trunk"
108
+ cmd << "--allow-warnings"
109
+ cmd << "--use-libraries"
110
+ cmd << "--verbose"
111
+ Actions.sh(cmd.join(' '), log: true, error_callback: nil)
112
+ end
113
+
114
+ def update_all_pod_dependency(pod_name, pod_version)
115
+ Dir.glob(["./**/*.podspec", "./**/Podfile"]).each do |p|
116
+ unless /Example/ =~ p
117
+ puts "更新文件:#{p}".magenta
118
+ update_main_proj_podspec_version(p, pod_name, pod_version)
119
+ end
120
+ end
121
+ end
122
+
123
+ def update_main_proj_podspec_version(path, pod_name, pod_version)
124
+ cont = ''
125
+ File.readlines(path).each do |l|
126
+ if (/#{pod_name}/ =~ l) && (/\d+\.\d+\.\d+/ =~ l)
127
+ l.scan(/\d+\.\d+\.\d+/).each do |key|
128
+ cont += l.gsub(key, pod_version)
129
+ end
130
+ else
131
+ cont += l.dup
132
+ end
133
+ end
134
+ File.write(path, cont)
135
+ end
136
+ end
137
+ end
138
+ end
@@ -21,7 +21,7 @@ module Lhj
21
21
  super
22
22
  end
23
23
 
24
- def run
24
+ def handle
25
25
  handler_files
26
26
  end
27
27
 
@@ -5,6 +5,7 @@ require 'yaml'
5
5
 
6
6
  module Lhj
7
7
  class Command
8
+ # generate model from yapi
8
9
  class Yapi < Command
9
10
  self.summary = '通过yapi接口生成请求'
10
11
  self.description = '更新 ~/.lhj/yapi.yml 文件配置后执行`lhj api`生成接口模型'
@@ -34,7 +35,7 @@ module Lhj
34
35
  super
35
36
  end
36
37
 
37
- def run
38
+ def handle
38
39
  load_config
39
40
  fetch_model
40
41
  print_methods
@@ -49,13 +50,13 @@ module Lhj
49
50
  end
50
51
 
51
52
  def puts_h(str)
52
- puts str
53
+ puts str.magenta
53
54
  @h_file_array ||= []
54
55
  @h_file_array << str
55
56
  end
56
57
 
57
58
  def puts_m(str)
58
- puts str
59
+ puts str.blue
59
60
  @m_file_array ||= []
60
61
  @m_file_array << str
61
62
  end
@@ -65,9 +66,9 @@ module Lhj
65
66
  file_name = gen_model_name('')
66
67
  h_file = File.join('.', "#{file_name}.h")
67
68
  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)}"
69
+ File.write(h_file, @h_file_array.join("\n")) if @h_file_array.count.positive?
70
+ File.write(m_file, @m_file_array.join("\n")) if @m_file_array.count.positive?
71
+ puts "\n\n生成文件成功!所在路径:\n#{File.expand_path(h_file)} \n#{File.expand_path(m_file)}".green
71
72
  end
72
73
 
73
74
  def url_str
@@ -78,7 +79,7 @@ module Lhj
78
79
  yml = File.join(Lhj::Config.instance.home_dir, 'yapi.yml')
79
80
  config = YAML.load_file(yml)
80
81
  config.each do |k, v|
81
- @http_headers << "#{k}=#{v}" if (k.eql?('__wpkreporterwid_') || k.eql?('_yapi_token') || k.eql?('_yapi_uid'))
82
+ @http_headers << "#{k}=#{v}" if k.eql?('__wpkreporterwid_') || k.eql?('_yapi_token') || k.eql?('_yapi_uid')
82
83
  end
83
84
  @http_url = config['url']
84
85
  @config_id = config['id']
@@ -107,27 +108,27 @@ module Lhj
107
108
  res = Net::HTTP.start(uri.hostname, uri.port) do |http|
108
109
  http.request(req)
109
110
  end
110
- puts res.body
111
+ puts res.body unless res.body['errcode'].to_i.zero?
111
112
  JSON.parse(res.body)
112
113
  end
113
114
 
114
115
  def fetch_model
115
116
  res_json = req_model
116
117
  begin
117
- puts "\n<===============打印返回数据模型-Begin=====================>\n"
118
+ puts "\n<===============打印返回数据模型-Begin=====================>\n".green
118
119
  fetch_res_boy(res_json)
119
120
  print_models
120
121
  print_models_implementation
121
- puts "\n<===============打印返回数据模型-End=====================>\n"
122
+ puts "\n<===============打印返回数据模型-End=====================>\n".green
122
123
  end
123
124
  begin
124
- puts "\n<===============打印请求模型-Begin=====================>\n"
125
+ puts "\n<===============打印请求模型-Begin=====================>\n".green
125
126
  @models = []
126
127
  @model_names = []
127
128
  fetch_req_body(res_json)
128
129
  print_models
129
130
  print_models_implementation
130
- puts "\n<===============打印请求模型-End=====================>\n"
131
+ puts "\n<===============打印请求模型-End=====================>\n".green
131
132
  end
132
133
  end
133
134
 
@@ -221,7 +222,7 @@ module Lhj
221
222
  @models.each do |model|
222
223
  puts_m "@implementation #{model[:name]}"
223
224
  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
225
+ if str && str.length.positive?
225
226
  puts_m '+(NSDictionary *)modelContainerPropertyGenericClass {'
226
227
  puts_m " return @{#{str}};"
227
228
  puts_m '}'
@@ -268,7 +269,7 @@ module Lhj
268
269
  end
269
270
 
270
271
  def print_methods
271
- puts "\n<===============方法调用=====================>\n"
272
+ puts "\n<===============方法调用=====================>\n".green
272
273
  puts_m '/**'
273
274
  puts_m " * #{@data_json['title']} -- #{@data_json['username']}"
274
275
  puts_m ' */'