lhj-tools 0.1.5 → 0.1.9

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: ae59197a9dbd9ce3ed7de0da5c26ce2cc91c8b97f7049b08981134c293e67b1a
4
- data.tar.gz: 9b553856214eab3372e2c528707eae16dbbf59068109ac1042256cb32ffedaa0
3
+ metadata.gz: 55ea8babd6d7b1aa8bdbc376bd7c624620dc4b868be6fa6decf8ba46443f4e4d
4
+ data.tar.gz: e802b2a688c86d442a6f2776b7d6ce0abf93edf82ef3b3fe2bdf4624ba8f4aa4
5
5
  SHA512:
6
- metadata.gz: 197f2cdaa7e7f8eacbbe3fd28b9f2a6cf4a871d4045134f359cd6ec01f6b79995a8416c5ef4cec2b6b5a21cee238f1a34f2ddb3559fb96e8400c3c878e73f75b
7
- data.tar.gz: 990499bcc61e51695cad04f2e5b248056fa236a640cf704e40d2774ddace77df537b4a99429f8c36d168e9344daa2db2763a7bd82eb5086ede790fe7b974912f
6
+ metadata.gz: e23b3398d6c629c30814c5a3b0354430b215ce0d0b9f6cab8e499a87da74d0fc6d3a7c174e81d31d53e89a6eab603bc2f572e428f6715e3ab71a739f7e03a24d
7
+ data.tar.gz: 11872fd8fefb0e3dc88e344f20755bbb1a2615e4e28c91e09e20ff9c616379d35f6a33d57cd0b670a115e31e5725f121919ec74cd5db512423b9a36a28dfb70a
@@ -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,18 +11,18 @@ 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
20
  %w[http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/localizable_config.yml
23
21
  http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/oss_config.yml
24
22
  http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/yapi.yml
25
- http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/zh2hant.yml]
23
+ http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/zh2hant.yml
24
+ http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/pod_config.yml
25
+ http://aomi-ios-repo.oss-cn-shenzhen.aliyuncs.com/main_config.yml]
26
26
  end
27
27
 
28
28
  def target_folder
@@ -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
@@ -8,27 +8,40 @@ module Lhj
8
8
  self.summary = '删除OSS的key'
9
9
 
10
10
  self.arguments = [
11
- CLAide::Argument.new('--key=XX', true)
11
+ CLAide::Argument.new('--key=XX', true),
12
+ CLAide::Argument.new('--type=XX', true)
12
13
  ]
13
14
 
14
15
  def self.options
15
16
  [
16
- %w[--key OSS对应的key]
17
+ %w[--key OSS对应的key],
18
+ %w[--type OSS对应的类型]
17
19
  ]
18
20
  end
19
21
 
20
22
  def initialize(argv)
21
23
  @key = argv.option('key')
24
+ @type = argv.option('type')
22
25
  super
23
26
  end
24
27
 
25
28
  def validate!
26
- help! '请输入key' unless @key
29
+ help! '请输入key或者类型' unless @key || @type
27
30
  super
28
31
  end
29
32
 
30
- def run
31
- Lhj::OSS::Helper.instance.delete(@key)
33
+ def handle
34
+ if @type
35
+ objects = Lhj::OSS::Helper.instance.list
36
+ objects.each do |o|
37
+ if /#{@type}/ =~ o.key
38
+ puts "成功删除#{o.key}"
39
+ Lhj::OSS::Helper.instance.delete(o.key)
40
+ end
41
+ end
42
+ else
43
+ Lhj::OSS::Helper.instance.delete(@key)
44
+ end
32
45
  end
33
46
  end
34
47
  end
@@ -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|
@@ -11,13 +11,15 @@ module Lhj
11
11
 
12
12
  self.arguments = [
13
13
  CLAide::Argument.new('type', false),
14
- CLAide::Argument.new('name', false)
14
+ CLAide::Argument.new('name', false),
15
+ CLAide::Argument.new('tag', false)
15
16
  ]
16
17
 
17
18
  def self.options
18
19
  [
19
20
  %w[--type 文件类型],
20
- %w[--name 文件名]
21
+ %w[--name 文件名],
22
+ %w[--tag 标签]
21
23
  ]
22
24
  end
23
25
 
@@ -30,10 +32,11 @@ module Lhj
30
32
  @current_path = argv.shift_argument || Dir.pwd
31
33
  @type = argv.option('type')
32
34
  @name = argv.option('name')
35
+ @tag = argv.option('tag')
33
36
  super
34
37
  end
35
38
 
36
- def run
39
+ def handle
37
40
  Dir.glob("#{@current_path}/*").each do |f|
38
41
  file_name = File.basename(f)
39
42
  if @name && /#{@name}/ =~ file_name
@@ -48,6 +51,7 @@ module Lhj
48
51
 
49
52
  def upload(file, file_name)
50
53
  oss_key = file_name
54
+ oss_key = "#{@tag}/#{file_name}" if @tag
51
55
  Lhj::OSS::Helper.instance.upload(oss_key, file)
52
56
  url = Lhj::OSS::Helper.instance.object_url(oss_key)
53
57
  puts "云端上传成功:#{url}\n"
@@ -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,149 @@
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 '使用工具同步主工程代码'")
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
+ # find src root dir
60
+ src_root_dir = find_src_root_dir(src)
61
+ Dir.chdir(src_root_dir) do
62
+ if ma
63
+ pod_version = ma[0]
64
+ update_all_pod_dependency(pod_name, pod_version)
65
+ puts '9.更新主工程引用pod版本号成功'.green
66
+ end
67
+ end
68
+
69
+ puts '10.手动执行`pod update --verbose --no-repo-update`更新pod'.green
70
+ end
71
+
72
+ def find_src_root_dir(src)
73
+ ps = []
74
+ src.scan(%r{(/[^/]*)}).flatten.each do |path|
75
+ path =~ /Code/ ? break : ps << path
76
+ end
77
+ File.join(ps)
78
+ end
79
+
80
+ def version_regex
81
+ /\d+\.\d+\.(\d+)/
82
+ end
83
+
84
+ def update_podspec_version(path)
85
+ str = ''
86
+ File.readlines(path).each do |l|
87
+ if (/\.version/ =~ l) && (version_regex =~ l)
88
+ last_version = l.scan(version_regex).flatten.first
89
+ next_version = last_version.to_i + 1
90
+ next_version_str = next_version.to_s
91
+ str += l.gsub(/(\d+\.\d+\.)(\d+)/, '\1' + next_version_str)
92
+ else
93
+ str += l.dup
94
+ end
95
+ end
96
+ File.write(path, str)
97
+ end
98
+
99
+ def add_tag(tag)
100
+ cmd = ['git tag']
101
+ cmd << '--force'
102
+ cmd << tag
103
+ Actions.sh(cmd.join(' '))
104
+ end
105
+
106
+ def push_tag
107
+ cmd = ['git push --tags']
108
+ Actions.sh(cmd.join(' '))
109
+ end
110
+
111
+ def update_pod_repo
112
+ # pod repo push miguatech-aomi_ios-mlspecs *.podspec --sources=miguatech-aomi_ios-mlspecs,aliyun,trunk --allow-warnings --use-libraries --verbose
113
+ cmd = ['pod repo push']
114
+ pod_repo_name = 'miguatech-aomi_ios-mlspecs'
115
+ cmd << pod_repo_name
116
+ cmd << '*.podspec'
117
+ cmd << "--sources=#{pod_repo_name},aliyun,trunk"
118
+ cmd << '--allow-warnings'
119
+ cmd << '--use-libraries'
120
+ cmd << '--verbose'
121
+ Actions.sh(cmd.join(' '), log: true, error_callback: nil)
122
+ end
123
+
124
+ def update_all_pod_dependency(pod_name, pod_version)
125
+ Dir.glob(%w[./**/*.podspec ./**/Podfile]).each do |p|
126
+ next if /Example/ =~ p || /temp/ =~ p
127
+
128
+ update_main_version(p, pod_name, pod_version)
129
+ end
130
+ end
131
+
132
+ def update_main_version(file, pod_name, pod_version)
133
+ cont = ''
134
+ File.readlines(file).each do |l|
135
+ if (/#{pod_name}/ =~ l) && (/\d+\.\d+\.\d+/ =~ l)
136
+ path = File.absolute_path(file)
137
+ puts "更新文件:#{path}".magenta
138
+ l.scan(/\d+\.\d+\.\d+/).each do |key|
139
+ cont += l.gsub(key, pod_version)
140
+ end
141
+ else
142
+ cont += l.dup
143
+ end
144
+ end
145
+ File.write(file, cont)
146
+ end
147
+ end
148
+ end
149
+ 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