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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2d7427bf47063e690b70a09d1bf6987c387d7289ec0c4206fd7d6182372e463e
4
- data.tar.gz: d43905b649b15c84de3120b966c42ebb684bdacfec57af0ac2c622fb57218c79
3
+ metadata.gz: a1d71c98366bbad8074af38f9c4381db08fb138457a61cd119ff3f3405ac9ba7
4
+ data.tar.gz: 37d5b49a7403e202dea0c557bcbe17e35e4d3483b2e4a8fa4868d58527d5d545
5
5
  SHA512:
6
- metadata.gz: 5c3f50b5221b68bdec3d7257c31456a70f9fc04263fd48ce4007157b638ab96613a8077339ae016126c9abf0cb75bc2d35f5bb6ef98f70ca55d3310512e21171
7
- data.tar.gz: 0bbff5886d4a5aace7ad8c2143db0fbfe7a7c52cf5809e62a6325a478f7c9c045aede8f74eea640e5a366b38cc6f203e87c372187a257452b65e557d5e87eec3
6
+ metadata.gz: 5a190d0b7d8adf62726401fac4c550acf6b70eb08c0a1775e18df2a724e2156b0c9b4a0b04bd009a8c9b2a3be2b44bb571344058ad5590115088203e13b4f417
7
+ data.tar.gz: dc1ac168f906f8a0db1675ae3dc6ec93dbec6424a7edcfbabe80c3308031f969f4db91057e0783057e4d1e04922fbb70bf3aa326ceec210a75eab3fc23d1f9e1
@@ -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,67 @@
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
+ content = YAML.load_file(file)
31
+
32
+ case content
33
+ when Array
34
+ content.each do |row|
35
+ next unless row.is_a?(Hash)
36
+
37
+ row.each do |key, value|
38
+ table_rows << [key, value]
39
+ end
40
+ table_rows << :separator
41
+ end
42
+ when Hash
43
+ content.each do |key, value|
44
+ table_rows << [key, value]
45
+ end
46
+ end
47
+
48
+ title = File.basename(file).to_s
49
+ print_table(title, table_rows) if table_rows.count.positive?
50
+ end
51
+
52
+ def print_table(title, table_rows)
53
+ table = Terminal::Table.new title: title, headings: %w[键 值], rows: table_rows
54
+ puts table
55
+ end
56
+
57
+ def ask_which_one
58
+ @cli.ask('查看哪个配置: '.green).strip.to_i
59
+ end
60
+
61
+ def config_dir
62
+ Lhj::Config.instance.home_dir
63
+ end
64
+ end
65
+ end
66
+ end
67
+ 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
@@ -9,20 +9,34 @@ module Lhj
9
9
  # sync config
10
10
  class Init < Command
11
11
  self.summary = '初始化控件'
12
- self.description = '使用工具前先执行`lhj init`'
12
+ self.description = '使用工具前先执行`lhj init --url=http://xxx`'
13
13
 
14
- def run
15
- auto_spin
16
- FileUtils.mkdir_p(target_folder) unless File.exist?(target_folder)
17
- download_file
18
- stop
14
+ self.arguments = [
15
+ CLAide::Argument.new('url', true)
16
+ ]
17
+
18
+ def self.options
19
+ [
20
+ %w[--url 配置文件的url]
21
+ ]
22
+ end
23
+
24
+ def validate!
25
+ super
26
+ help! '配置url必须输入' unless @url
19
27
  end
20
28
 
21
- def down_load_urls
22
- %w[http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/localizable_config.yml
23
- http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/oss_config.yml
24
- http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/yapi.yml
25
- http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/zh2hant.yml]
29
+ def initialize(argv)
30
+ @url = argv.option('url')
31
+ super
32
+ end
33
+
34
+ def handle
35
+ FileUtils.mkdir_p(target_folder) unless File.exist?(target_folder)
36
+ file_path = file_name_from_url(@url)
37
+ save_url_to_file(@url, file_path)
38
+ content = YAML.load_file(file_path)
39
+ download_file(content) if content.is_a?(Array)
26
40
  end
27
41
 
28
42
  def target_folder
@@ -41,14 +55,22 @@ module Lhj
41
55
  url.scan(%r{/([^/]+)}).flatten.last
42
56
  end
43
57
 
44
- def download_file
45
- down_load_urls.each do |url|
46
- file_name = file_name_with_url(url)
47
- file_path = File.join(target_folder, file_name)
48
- save_file(url, file_path) unless File.exist?(file_path)
58
+ def download_file(urls)
59
+ urls.each do |url|
60
+ file_path = file_name_from_url(url)
61
+ save_url_to_file(url, file_path)
49
62
  end
50
63
  puts "工具初始化完成 \n"
51
64
  end
65
+
66
+ def save_url_to_file(url, file_path)
67
+ save_file(url, file_path) unless File.exist?(file_path)
68
+ end
69
+
70
+ def file_name_from_url(url)
71
+ file_name = file_name_with_url(url)
72
+ File.join(target_folder, file_name)
73
+ end
52
74
  end
53
75
  end
54
76
  end
@@ -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,153 @@
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 begin_title
16
+ '读取映射文件~/.lhj/pod_config.yml'
17
+ end
18
+
19
+ def handle
20
+ sync
21
+ end
22
+
23
+ def sync
24
+ config_file = File.join(Lhj::Config.instance.home_dir, 'pod_config.yml')
25
+ arr = YAML.load_file(config_file)
26
+ arr.each_index { |i| puts "#{i}.#{arr[i]['pod']}".yellow }
27
+ idx = @cli.ask('请选择哪一个库同步: '.green).strip.to_i
28
+ pod_name = arr[idx]['pod']
29
+ src = arr[idx]['main_path']
30
+ dest = arr[idx]['pod_path']
31
+ FileUtils.cp_r(src, dest, remove_destination: true)
32
+ puts '1.从主工程复制代码到pod库成功'.green
33
+
34
+ ma = nil
35
+ Dir.chdir(dest) do
36
+ Dir.glob('*.podspec').each do |p|
37
+ update_podspec_version(p)
38
+ version_line = IO.readlines(p).find{ |line| (/\.version/ =~ line) && (version_regex =~ line) }
39
+ ma = version_line.match(version_regex)
40
+ end
41
+ puts '2.更新版本号成功'.green
42
+
43
+ Actions.sh('git add .')
44
+ puts '3.git add成功'.green
45
+
46
+ Actions.sh("git commit -m '使用工具同步主工程代码'")
47
+ puts '4.git 提交成功'.green
48
+
49
+ Actions.sh('git push')
50
+ puts '5.git 推送成功'.green
51
+
52
+ add_tag(ma[0]) if ma
53
+ puts "6.设置tag成功! tag号:#{ma[0]}".green
54
+
55
+ push_tag
56
+ puts '7.推送tag成功'.green
57
+
58
+ update_pod_repo
59
+ puts "8.#{pod_name}推送pod repo成功".green
60
+
61
+ end
62
+
63
+ # find src root dir
64
+ src_root_dir = find_src_root_dir(src)
65
+ Dir.chdir(src_root_dir) do
66
+ if ma
67
+ pod_version = ma[0]
68
+ update_all_pod_dependency(pod_name, pod_version)
69
+ puts '9.更新主工程引用pod版本号成功'.green
70
+ end
71
+ end
72
+
73
+ puts '10.手动执行`pod update --verbose --no-repo-update`更新pod'.green
74
+ end
75
+
76
+ def find_src_root_dir(src)
77
+ ps = []
78
+ src.scan(%r{(/[^/]*)}).flatten.each do |path|
79
+ path =~ /Code/ ? break : ps << path
80
+ end
81
+ File.join(ps)
82
+ end
83
+
84
+ def version_regex
85
+ /\d+\.\d+\.(\d+)/
86
+ end
87
+
88
+ def update_podspec_version(path)
89
+ str = ''
90
+ File.readlines(path).each do |l|
91
+ if (/\.version/ =~ l) && (version_regex =~ l)
92
+ last_version = l.scan(version_regex).flatten.first
93
+ next_version = last_version.to_i + 1
94
+ next_version_str = next_version.to_s
95
+ str += l.gsub(/(\d+\.\d+\.)(\d+)/, '\1' + next_version_str)
96
+ else
97
+ str += l.dup
98
+ end
99
+ end
100
+ File.write(path, str)
101
+ end
102
+
103
+ def add_tag(tag)
104
+ cmd = ['git tag']
105
+ cmd << '--force'
106
+ cmd << tag
107
+ Actions.sh(cmd.join(' '))
108
+ end
109
+
110
+ def push_tag
111
+ cmd = ['git push --tags']
112
+ Actions.sh(cmd.join(' '))
113
+ end
114
+
115
+ def update_pod_repo
116
+ # pod repo push miguatech-aomi_ios-mlspecs *.podspec --sources=miguatech-aomi_ios-mlspecs,aliyun,trunk --allow-warnings --use-libraries --verbose
117
+ cmd = ['pod repo push']
118
+ pod_repo_name = 'miguatech-aomi_ios-mlspecs'
119
+ cmd << pod_repo_name
120
+ cmd << '*.podspec'
121
+ cmd << "--sources=#{pod_repo_name},aliyun,trunk"
122
+ cmd << '--allow-warnings'
123
+ cmd << '--use-libraries'
124
+ cmd << '--verbose'
125
+ Actions.sh(cmd.join(' '), log: true, error_callback: nil)
126
+ end
127
+
128
+ def update_all_pod_dependency(pod_name, pod_version)
129
+ Dir.glob(%w[./**/*.podspec ./**/Podfile]).each do |p|
130
+ next if /Example/ =~ p || /temp/ =~ p
131
+
132
+ update_main_version(p, pod_name, pod_version)
133
+ end
134
+ end
135
+
136
+ def update_main_version(file, pod_name, pod_version)
137
+ cont = ''
138
+ File.readlines(file).each do |l|
139
+ if (/#{pod_name}/ =~ l) && (/\d+\.\d+\.\d+/ =~ l)
140
+ path = File.absolute_path(file)
141
+ puts "更新文件:#{path}".magenta
142
+ l.scan(/\d+\.\d+\.\d+/).each do |key|
143
+ cont += l.gsub(key, pod_version)
144
+ end
145
+ else
146
+ cont += l.dup
147
+ end
148
+ end
149
+ File.write(file, cont)
150
+ end
151
+ end
152
+ end
153
+ 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
 
@@ -0,0 +1,15 @@
1
+ module Lhj
2
+ # format
3
+ module ErbFormatter
4
+ # base
5
+ class Base
6
+ def initialize(runner)
7
+ @runner = runner
8
+ end
9
+
10
+ def render
11
+ 'Implement global help here'
12
+ end
13
+ end
14
+ end
15
+ end