tuya-ci-core 0.1.2 → 0.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 43dcc2e3b61bd8467abab09d0f95ac9b3e2ac8f2
4
- data.tar.gz: 81893089943726ae61c19a2276a4210a9d40cf19
3
+ metadata.gz: 5c318fd664d9d6a7dd4f535615ec6172e638c3a2
4
+ data.tar.gz: 8e1005fc9d1ee413438a0ddd0483d066e26cdc82
5
5
  SHA512:
6
- metadata.gz: ddb198c7cf62fe2a5d708bcfbc2e6b36b3c4ee54d611748d53df782223d601b09f93e5dd87838fe3b637995e1e5fe308398b1c35d47b1b864c1a0f28125a78ad
7
- data.tar.gz: 8a859709a6e22b2edc849178c22edfaf8cabac8f98fcd8d41b41d44abfdf9c2c47d9fa77f55bbd5e745fb2235999e5cd4bb612228c69fbaa5bf3ea371f1a2585
6
+ metadata.gz: a7e3dd4eb3ec40f61eb7d2669a5ccca253783d054c50fe87de7c33564beb52444b5af009fc444dbc930ccd8e200e93b60e79d986ee3c893115cc9b4afd3f8621
7
+ data.tar.gz: 7b8be9fa7634b4a53cd0c73dc5ef0bb31312d0fef7080135503565262658f849f11a1cf455b3ef928d0aa1754048bf61662fd726f75bbbfa10c0d5080373348a
data/bin/tuyacicore CHANGED
File without changes
@@ -0,0 +1,2 @@
1
+ module TYCiCore
2
+ end
@@ -0,0 +1,109 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
2
+ module TYCiCore
3
+ class ConfigModules
4
+
5
+ attr_accessor :config_path, :advance_fields, :pod_path
6
+
7
+ def initialize(config_path="./config_modules.json", advance_fields="{}", pod_path="./Pods/")
8
+ @config_path = config_path
9
+ @advance_fields = advance_fields
10
+ @pod_path = pod_path
11
+ end
12
+
13
+ def config_hash
14
+ content = File.read @config_path
15
+ hash = JSON content
16
+ hash
17
+ end
18
+
19
+ def modules_in_pods
20
+ result = []
21
+ pod_directories = Dir["#{@pod_path}*"].reject{|o| not File.directory?(o)}
22
+ pod_directories.each do |folder|
23
+ name = folder.gsub(/\s+/,'').split('/')[-1]
24
+ if module?(name) && name!="Target Support Files"
25
+ result.push(name)
26
+ end
27
+ end
28
+ result
29
+ end
30
+
31
+ def setup_modules
32
+
33
+ puts "Setup #{@config_path} at #{@pod_path}".green
34
+
35
+ modules = modules_in_pods
36
+
37
+ advance_json = JSON.parse(@advance_fields)
38
+ advance_json["modules"] = modules
39
+
40
+ advance_json_pretty = JSON.pretty_generate(advance_json)
41
+ fh = File.new(@config_path, "w")
42
+ fh.puts advance_json_pretty
43
+ fh.close
44
+ end
45
+
46
+ def module?(name)
47
+ # find_command = "find #{pod_path} -iname #{name}Impl.h"
48
+ # # puts("find_command is #{find_command}")
49
+ # find_command_result = Action.sh find_command
50
+ # # puts("find_command_result is #{find_command_result}")
51
+ # if find_command_result.length > 0
52
+ # return true
53
+ # else
54
+ # return module_lib?(name)
55
+ # end
56
+ commands = %W(#{pod_path} -iname #{name}Impl.h)
57
+ result = EXE.exe('find', commands)
58
+
59
+ if result.length > 0
60
+ true
61
+ else
62
+ module_lib?(name)
63
+ end
64
+ end
65
+
66
+ def module_lib?(name)
67
+
68
+ puts "Name is #{name}".green
69
+
70
+ lib_path = "#{@pod_path}#{name}/#{name}*/lib#{name}.a"
71
+
72
+ puts "File_path is #{lib_path}".yellow
73
+
74
+ libs_path_result = Dir.glob(lib_path)
75
+
76
+ puts("The path is#{libs_path_result}")
77
+
78
+ if libs_path_result.length > 0
79
+
80
+ file_path = libs_path_result[0]
81
+ # find_command = "nm -gU #{file_path} | grep '_OBJC_CLASS_\\$_#{name}Impl'"
82
+ #
83
+ exists_impl = true
84
+ # find_command_result = Action.sh(
85
+ # find_command,
86
+ # error_callback: ->(result) {
87
+ # exists_impl = false
88
+ # }
89
+ # )
90
+
91
+ # TODO exist?
92
+ commands = %W(-gU #{file_path} | grep '_OBJC_CLASS_\\$_#{name}Impl')
93
+
94
+ find_result = EXE.exe('nm', commands)
95
+
96
+ if exists_impl && !find_result.empty?
97
+ puts "Static lib #{name} has #{name}mpl".green
98
+ true
99
+ else
100
+ puts "Static lib #{name} can not find #{name}mpl".red
101
+ false
102
+ end
103
+ end
104
+
105
+ false
106
+ end
107
+
108
+ end
109
+ end
@@ -0,0 +1,56 @@
1
+ require 'tuya/ci/core/config/config_modules'
2
+
3
+ module TYCiCore
4
+ class ODMConfigModules < ConfigModules
5
+
6
+ attr_accessor :content
7
+
8
+ def initialize(config_path="./config_modules.json", pod_path="./Pods/")
9
+ @config_path = config_path
10
+ @pod_path = pod_path
11
+ @content = config_hash
12
+ end
13
+
14
+ def add_mix(key, value)
15
+ mix = @content["mixMap"]
16
+ if mix.nil? || mix.empty?
17
+ mix = Hash[key => value]
18
+ else
19
+ mix[key]=value
20
+ end
21
+ @content["mixMap"]=mix
22
+ end
23
+
24
+ # def add_mix(mixHash)
25
+ # mix = @content["mixMap"]
26
+ # if mix.nil? || mix.empty?
27
+ # mix = mixHash
28
+ # else
29
+ # mix = mix.merge(mixHash)
30
+ # end
31
+ # end
32
+
33
+ def remove_mix(key)
34
+ @content["mixMap"].delete(key)
35
+ end
36
+
37
+ def update_config(key, value)
38
+ @content[key]=value
39
+ end
40
+
41
+ def setup_modules # 根据 pod目录生成 modules
42
+ puts "ODM Setup #{@config_path} at #{@pod_path}".green
43
+
44
+ modules = modules_in_pods
45
+
46
+ @content["modules"] = modules
47
+ end
48
+
49
+ def save(target=@config_path)
50
+ file_content = JSON.pretty_generate(@content)
51
+ fh = File.new(target, "w")
52
+ fh << file_content
53
+ fh.close
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,21 @@
1
+ module TYCiCore
2
+ class Config
3
+ def initialize(path)
4
+ raise "Can not find config at : #{path}" unless File.exist? path
5
+ @content = File.read path
6
+ @content_json = JSON @content
7
+ end
8
+
9
+ def value(key)
10
+ eval("@content_json" << key.split('.').map { |i| "[\"" + i + "\"]" }.join)
11
+ end
12
+
13
+ def method_missing(name)
14
+ if @content_json.has_key? name.to_s
15
+ @content_json[name.to_s]
16
+ else
17
+ super.method_missing name
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,119 @@
1
+ module TYCiCore
2
+ class TYPodAnalyse
3
+ attr_accessor :pods_hash, :pod_nodes_hash, :podfile_lock
4
+ def initialize(podfile_lock)
5
+ @pods_hash = Hash.new
6
+ @pod_nodes_hash = Hash.new
7
+ @podfile_lock = podfile_lock
8
+ podfile_lock.all_pods.each do |pod|
9
+ pod_item = TYPodItem.new pod
10
+ pod_item.dependency_list = @podfile_lock.pods[pod]
11
+ @pods_hash[pod] = pod_item
12
+ end
13
+ end
14
+
15
+ def sorted_pods
16
+ trees
17
+ dep_tree
18
+ diplomatic_pods
19
+ end
20
+
21
+ def trees
22
+ @podfile_lock.all_pods.each do |pod_name|
23
+ pod_item = @pods_hash[pod_name]
24
+ unless pod_item.dependency
25
+ @pod_nodes_hash[pod_name] = tree_build TYPodNode.new, pod_item
26
+ end
27
+ end
28
+ end
29
+
30
+ def tree_build(root_node, root_item)
31
+ root_node.add_pod_item root_item
32
+ root_item.dependency = true
33
+ if root_item.dependency_list
34
+ root_item.dependency_list.each do |item|
35
+ child_item = @pods_hash[item]
36
+ if child_item
37
+ child_node = @pod_nodes_hash[child_item.name]
38
+ if child_node
39
+ unless child_node.parent
40
+ @pod_nodes_hash.delete child_node.pod_item.name
41
+ root_node.join_node child_node
42
+ end
43
+ else
44
+ child_node = TYPodNode.new
45
+ root_node.join_node tree_build(child_node, child_item)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ root_node
51
+ end
52
+
53
+ def dep_tree
54
+ @pods_hash.keys.each do |name|
55
+ child_node = @pod_nodes_hash[name]
56
+ dep_node child_node
57
+ end
58
+ end
59
+
60
+ def dep_node(node)
61
+ if !node || !node.nodes || node.nodes.size == 0
62
+ return 0
63
+ end
64
+ dep = []
65
+ node.nodes.keys.each do |name|
66
+ child_node = node.nodes[name]
67
+ dep.push((dep_node child_node) + 1)
68
+ end
69
+ max_dep = dep.max
70
+ node.node_dep = max_dep
71
+ node.node_dep
72
+ end
73
+
74
+ def sort_nodes
75
+ @pod_nodes_hash.sort_by do |k, v|
76
+ v.node_dep
77
+ end
78
+ end
79
+
80
+ def diplomatic_pods
81
+ sort_nodes
82
+ pods_ = []
83
+ @pod_nodes_hash.keys.each do |key|
84
+ pods_ << (level_order_node @pod_nodes_hash[key])
85
+ end
86
+ pods_hash = Hash.new
87
+ pods_.each do |pods|
88
+ order = pods_hash[pods.size]
89
+ if order
90
+ order.pods = order.pods + pods
91
+ else
92
+ pods_hash[pods.size] = TYPodOrder.new pods.size, pods
93
+ end
94
+ end
95
+ pods_keys_sort = pods_hash.keys.sort.reverse
96
+ result = []
97
+ pods_keys_sort.each do |key|
98
+ pods = pods_hash[key].pods
99
+ result += pods
100
+ end
101
+ result.uniq
102
+ end
103
+
104
+ def level_order_node(node)
105
+ result = []
106
+ queue = []
107
+ queue.push node
108
+ while queue.size > 0 do
109
+ target_node = queue[0]
110
+ queue.delete_at 0
111
+ result.insert 0,target_node.pod_item.name
112
+ target_node.nodes.keys.each do |key_node|
113
+ queue.push target_node.nodes[key_node] if target_node.nodes[key_node]
114
+ end
115
+ end
116
+ result.uniq
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,39 @@
1
+ module TYCiCore
2
+ class TYPodNode
3
+
4
+ attr_accessor :node_dep, :parent, :nodes, :pod_item
5
+
6
+ def initialize
7
+ @node_dep = 0
8
+ @parent = ''
9
+ @nodes = Hash.new
10
+ @pod_item = nil
11
+ end
12
+
13
+ def join_node(node)
14
+ node.parent = @pod_item.name
15
+ nodes[node.pod_item.name] = node
16
+ end
17
+
18
+ def add_pod_item(item)
19
+ @pod_item = item if item
20
+ end
21
+ end
22
+
23
+ class TYPodItem
24
+ attr_accessor :name, :dependency, :dependency_list
25
+ def initialize(name)
26
+ @name = name
27
+ @dependency = false
28
+ @dependency_list = nil
29
+ end
30
+ end
31
+
32
+ class TYPodOrder
33
+ attr_accessor :pods, :group
34
+ def initialize(order, pods)
35
+ @group = order
36
+ @pods = pods
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ module TYCiCore
2
+
3
+ class TYPodFileLock
4
+ attr_accessor :all_pods, :pods
5
+
6
+ def initialize(text)
7
+ all_pods_temp = text.scan /^\s+(\w+-*\w+): [0-9a-zA-Z]*$/
8
+
9
+ @all_pods = []
10
+
11
+ all_pods_temp.each do |pod|
12
+ @all_pods << pod[0]
13
+ end
14
+
15
+ @pods = Hash.new
16
+ @all_pods.each do |pod|
17
+ pod_dependencies = []
18
+ pod_scan = text.scan /^\s{2}-\s+#{pod}\s+.*:((\n\s{4}-\s+.*)*)/
19
+ pod_scan.each do |pod_item|
20
+ if pod_item.size > 0
21
+ item = pod_item[0]
22
+ item.gsub!(/\n/, '')
23
+ item.split(' - ').each do |item_content|
24
+ if item_content != ""
25
+ item_content_clean = item_content.gsub!(/\s\(.*\s.*\)/, '')
26
+ if item_content_clean
27
+ pod_dependencies.push item_content_clean
28
+ else
29
+ pod_dependencies.push item_content
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ @pods[pod] = pod_dependencies if pod_dependencies.size > 0
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,40 @@
1
+ module TYCiCore
2
+ class TYDependencies
3
+
4
+ attr_accessor :path, :content
5
+
6
+ def initialize(path)
7
+ @path = path
8
+ @content = ''
9
+ end
10
+
11
+ def sort_pods(pods)
12
+ if File.exist? @path
13
+ lock_pods = analysis
14
+ pods_hash = Hash.new
15
+ pods.each do |pod|
16
+ pods_hash[pod["name"]] = pod
17
+ end
18
+ result = []
19
+ lock_pods.each do |lock_pod|
20
+ if pods_hash.keys.include? lock_pod
21
+ result.push pods_hash[lock_pod]
22
+ end
23
+ end
24
+ result
25
+ else
26
+ puts "Can not find file: #{@path}".red
27
+ pods
28
+ end
29
+ end
30
+
31
+ def analysis
32
+ content = File.read @path
33
+
34
+ podfile_lock = TYPodFileLock.new content
35
+
36
+ analysis = TYPodAnalyse.new podfile_lock
37
+ analysis.sorted_pods
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,11 @@
1
+ module TYCiCore
2
+ class TYDownload
3
+ def self.download(url, name, path='./')
4
+ puts "Start download : #{url}"
5
+ data=open(url){|f|f.read}
6
+ puts "Saving #{path}#{name}"
7
+ open("#{path}#{name}","wb"){|f|f.write(data)}
8
+ FileUtils.pwd << "/#{name}"
9
+ end
10
+ end
11
+ end
@@ -4,6 +4,8 @@ module TYCiCore
4
4
  require 'cocoapods'
5
5
  require 'cocoapods/executable'
6
6
 
7
+ puts "Command is: #{command}".yellow
8
+
7
9
  Pod::Executable.execute_command(executable, command, raise_if_need)
8
10
  end
9
11
 
@@ -0,0 +1,143 @@
1
+ module TYCiCore
2
+ class GitlabODM
3
+
4
+ attr_accessor :config, :name, :path, :visibility
5
+
6
+ def initialize (config, path, visibility, username, password, email)
7
+ @config = config
8
+ @path = path
9
+ @visibility = visibility
10
+
11
+ @username = username
12
+ @password = password
13
+ @email = email
14
+
15
+ @group_id = ""
16
+ @user_id = ""
17
+
18
+ @hook_project_ios = ""
19
+ @hook_project_android = ""
20
+ @hook_project_id_ios = ""
21
+ @hook_project_id_android = ""
22
+ @hook_project_url_ios = ""
23
+ @hook_project_url_android = ""
24
+ end
25
+
26
+ def odm
27
+
28
+ if create_group
29
+ if create_user
30
+ if add_user_group
31
+ add_project_group
32
+ get_project_id
33
+ add_project_hook @hook_project_id_ios, @config.hook_ios
34
+ add_project_hook @hook_project_id_android, @config.hook_android
35
+
36
+ TYCiCore::Git.git_delete_temp_path @hook_project_ios
37
+ TYCiCore::Git.git_delete_temp_path @hook_project_android
38
+
39
+ puts "odm create gitlab group json is:[start:success:end]".green
40
+ else
41
+ puts 'ODM add user to group failed'.red
42
+ puts "odm create gitlab group json is:[start:failed:end]".red
43
+ end
44
+ else
45
+ puts 'ODM create user failed'.red
46
+ puts "odm create gitlab group json is:[start:failed:end]".red
47
+ return false
48
+ end
49
+ else
50
+ puts 'ODM create group failed'.red
51
+ puts "odm create gitlab group json is:[start:failed:end]".red
52
+ return false
53
+ end
54
+
55
+ end
56
+
57
+ def create_group
58
+ puts 'ODM create group ...'.green
59
+ result = `curl #{@config.host}/api/#{@config.version}/groups -X POST -d "private_token=#{@config.private_token}&name=#{@path}&path=#{@path}&visibility=#{@visibility}"`
60
+ json = JSON result
61
+ @group_id = json["id"]
62
+
63
+ result_bool = not_empty?(json["name"]) && not_empty?(json["web_url"])
64
+ puts json unless result_bool
65
+ result_bool
66
+ end
67
+
68
+ def create_user
69
+ puts 'ODM create user ...'.green
70
+ result = `curl #{@config.host}/api/v4/users?private_token=#{@config.private_token} -X POST -d "name=#{@username}&username=#{@username}&password=#{@password}&email=#{@email}&skip_confirmation=true"`
71
+
72
+ json = JSON result
73
+ @user_id = json["id"]
74
+
75
+ result_bool = not_empty?(json["state"]) && not_empty?(json["created_at"])
76
+ puts json unless result_bool
77
+ result_bool
78
+ end
79
+
80
+ def add_user_group
81
+ puts 'ODM add user to group ...'.green
82
+ result = `curl #{@config.host}/api/v4/groups/#{@group_id}/members?private_token=#{@config.private_token} -X POST -d "id=#{@group_id}&user_id=#{@user_id}&access_level=50"`
83
+ json = JSON result
84
+
85
+ result_bool = not_empty?(json["state"]) && not_empty?(json["username"])
86
+ puts json unless result_bool
87
+ result_bool
88
+ end
89
+
90
+ def add_project_group
91
+
92
+ @hook_project_android = "#{path}Repository"
93
+ @hook_project_ios = "#{path}Specs"
94
+
95
+ @hook_project_url_ios = "#{@config.host}/#{path}/#{@hook_project_ios}.git"
96
+ @hook_project_url_android = "#{@config.host}/#{path}/#{@hook_project_android}.git"
97
+
98
+ TYCiCore::Git.git_create_empty_repos @hook_project_ios, @hook_project_url_ios
99
+ TYCiCore::Git.git_create_empty_repos @hook_project_android, @hook_project_url_android
100
+ end
101
+
102
+ def get_project_id
103
+ puts 'ODM get project id in group'.green
104
+
105
+ result = `curl #{@config.host}/api/v4/groups/#{@group_id}/projects?private_token=#{@config.private_token}&id=#{@group_id}`
106
+
107
+ json = JSON result
108
+
109
+ get_project_id_temp json, 0
110
+ get_project_id_temp json, 1
111
+
112
+ puts "Project iOS id is: #{@hook_project_id_ios}, android id is #{@hook_project_id_android}"
113
+ end
114
+
115
+ def get_project_id_temp(json, index)
116
+ temp_name = json[index]['name']
117
+ temp_id = json[index]['id']
118
+ if temp_name == @hook_project_android
119
+ @hook_project_id_android = temp_id
120
+ else
121
+ @hook_project_id_ios = temp_id
122
+ end
123
+ end
124
+
125
+ def add_project_hook(id, url)
126
+ puts "ODM add hook url:#{url} to project #{id}".green
127
+ result = `curl #{@config.host}/api/v4/projects/#{id}/hooks?private_token=#{@config.private_token} -X POST -d "id=#{id}&url=#{url}&push_events=true"`
128
+ json = JSON result
129
+ puts json
130
+ end
131
+
132
+ def not_empty?(str)
133
+ if str.nil?
134
+ return false
135
+ else
136
+ if str.empty?
137
+ return false
138
+ end
139
+ return true
140
+ end
141
+ end
142
+ end
143
+ end