spinjector 0.0.6 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +21 -0
- data/CHANGELOG.md +20 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +53 -0
- data/README.md +17 -1
- data/Rakefile +11 -0
- data/lib/spinjector/entity/script.rb +2 -0
- data/lib/spinjector/entity/target.rb +4 -0
- data/lib/spinjector/logger.rb +16 -0
- data/lib/spinjector/project_service.rb +126 -55
- data/lib/spinjector/runner.rb +32 -0
- data/lib/spinjector/yaml_parser.rb +24 -6
- data/lib/spinjector.rb +10 -14
- data/spinjector.gemspec +8 -2
- metadata +89 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 770afb3d2da618abf0c2f12be01a8638d6190c5b21085d8ee6cbc89a05159e50
|
4
|
+
data.tar.gz: 6d371c30b8a6fa185a7775bf5b63e34f76269b25beb63cd738d0a0627ca48237
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f627ae1db194c15105e591e3d7f1c43000df84b72b47701e3c587b6962f6ba25978ad6b52763be3f11d1550eebc454bbd5b858adfa112557f1e1f4bbc8583d6e
|
7
|
+
data.tar.gz: 884f0b622a6f4bc9c3d421200e0651970f961831fc4cada4dc87c3e1814ed0cc2d8f85a7ccf4b3adc293f6a57b48a2428241452d4edce84202301aee0a54fc11
|
@@ -0,0 +1,21 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
strategy:
|
9
|
+
matrix:
|
10
|
+
ruby: ["2.6.6", "2.7.3", "3.0.1"]
|
11
|
+
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v2
|
14
|
+
- uses: ruby/setup-ruby@v1
|
15
|
+
with:
|
16
|
+
ruby-version: ${{ matrix.ruby }}
|
17
|
+
- name: Build and test with Rake
|
18
|
+
run: |
|
19
|
+
gem install bundler
|
20
|
+
bundle install --jobs 4 --retry 3
|
21
|
+
bundle exec rake test
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Change Log
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
`spinjector` adheres to [Semantic Versioning](http://semver.org/).
|
4
|
+
|
5
|
+
## [NEXT] - Date
|
6
|
+
|
7
|
+
### Created
|
8
|
+
|
9
|
+
### Fixed
|
10
|
+
|
11
|
+
### Removed
|
12
|
+
|
13
|
+
## [1.0.0] - 2022-12-19
|
14
|
+
|
15
|
+
### Created
|
16
|
+
|
17
|
+
- Make the script idempotent. Successive calls to configure don’t modify the pbxproj file anymore
|
18
|
+
- Added tests
|
19
|
+
|
20
|
+
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
spinjector (0.0.6)
|
5
|
+
optparse (~> 0.1)
|
6
|
+
xcodeproj (~> 1.21)
|
7
|
+
yaml (~> 0.2)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
CFPropertyList (3.0.5)
|
13
|
+
rexml
|
14
|
+
ansi (1.5.0)
|
15
|
+
atomos (0.1.3)
|
16
|
+
builder (3.2.4)
|
17
|
+
claide (1.1.0)
|
18
|
+
colored2 (3.1.2)
|
19
|
+
minitest (5.15.0)
|
20
|
+
minitest-hooks (1.5.0)
|
21
|
+
minitest (> 5.3)
|
22
|
+
minitest-reporters (1.5.0)
|
23
|
+
ansi
|
24
|
+
builder
|
25
|
+
minitest (>= 5.0)
|
26
|
+
ruby-progressbar
|
27
|
+
nanaimo (0.3.0)
|
28
|
+
optparse (0.2.0)
|
29
|
+
rake (12.3.3)
|
30
|
+
rexml (3.2.5)
|
31
|
+
ruby-progressbar (1.11.0)
|
32
|
+
xcodeproj (1.21.0)
|
33
|
+
CFPropertyList (>= 2.3.3, < 4.0)
|
34
|
+
atomos (~> 0.1.3)
|
35
|
+
claide (>= 1.0.2, < 2.0)
|
36
|
+
colored2 (~> 3.1)
|
37
|
+
nanaimo (~> 0.3.0)
|
38
|
+
rexml (~> 3.2.4)
|
39
|
+
yaml (0.2.0)
|
40
|
+
|
41
|
+
PLATFORMS
|
42
|
+
x86_64-darwin-18
|
43
|
+
|
44
|
+
DEPENDENCIES
|
45
|
+
bundler (>= 1.12.0, < 3.0.0)
|
46
|
+
minitest (~> 5.11)
|
47
|
+
minitest-hooks (~> 1.5)
|
48
|
+
minitest-reporters (~> 1.3)
|
49
|
+
rake (~> 12.3)
|
50
|
+
spinjector!
|
51
|
+
|
52
|
+
BUNDLED WITH
|
53
|
+
2.2.26
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# spinjector
|
2
|
+
|
2
3
|
Inject Script phase in your Xcode project easily.
|
3
4
|
|
4
5
|
# How to install
|
@@ -8,7 +9,9 @@ gem install spinjector
|
|
8
9
|
```
|
9
10
|
|
10
11
|
# How to use
|
12
|
+
|
11
13
|
## Global configuration file
|
14
|
+
|
12
15
|
First, create a YAML configuration file under `./Configuration/spinjector_configuration.yaml` (default path where spinjector looks for a configuration file).
|
13
16
|
|
14
17
|
```
|
@@ -31,7 +34,9 @@ targets:
|
|
31
34
|
```
|
32
35
|
|
33
36
|
## Script configuration file
|
37
|
+
|
34
38
|
Then, for each script you want to inject in your Xcode project:
|
39
|
+
|
35
40
|
- You can use `scripts` section in the global configuration file to define your script directly (eg. `foo`)...
|
36
41
|
|
37
42
|
- ...Or create a script configuration file (eg. `helloworld.yaml`)
|
@@ -60,16 +65,19 @@ output_file_list_paths: # optional.
|
|
60
65
|
|
61
66
|
dependency_file: # optional.
|
62
67
|
|
63
|
-
execution_position: # optional. [:
|
68
|
+
execution_position: # optional. [:before_compile | :after_compile | :before_headers | :after_headers | :after_all].
|
64
69
|
```
|
65
70
|
|
66
71
|
- If you use the `script_path option`, create the script file
|
72
|
+
|
67
73
|
```
|
68
74
|
echo Hello World
|
69
75
|
```
|
70
76
|
|
71
77
|
## Execution
|
78
|
+
|
72
79
|
Finally, inject script phases
|
80
|
+
|
73
81
|
```
|
74
82
|
spinjector [-c] <path-to-your-global-configuration-file>
|
75
83
|
```
|
@@ -86,3 +94,11 @@ Enjoy your build phases
|
|
86
94
|
4. Execute `make publish`
|
87
95
|
|
88
96
|
You may need to configure your account at step `4.` if you've never pushed any gem. You can find all the informations you need on [the official documentation](https://guides.rubygems.org/make-your-own-gem/#your-first-gem).
|
97
|
+
|
98
|
+
## Tests
|
99
|
+
|
100
|
+
To run the tests, simply run:
|
101
|
+
|
102
|
+
```sh
|
103
|
+
rake test
|
104
|
+
```
|
data/Rakefile
ADDED
@@ -12,65 +12,131 @@ class ProjectService
|
|
12
12
|
|
13
13
|
# @param [Xcodeproj::Project] project
|
14
14
|
#
|
15
|
-
def initialize(project)
|
15
|
+
def initialize(project, logger)
|
16
16
|
@project = project
|
17
|
+
@logger = logger
|
17
18
|
end
|
18
19
|
|
19
|
-
#
|
20
|
+
# @param [Configuration] configuration containing all scripts to add in each target
|
20
21
|
#
|
21
|
-
def
|
22
|
+
def update_scripts_in_targets(configuration)
|
22
23
|
@project.targets.each do |target|
|
23
|
-
|
24
|
+
@insertion_offset_after_compile = 0
|
25
|
+
@insertion_offset_after_headers = 0
|
26
|
+
target_configuration = configuration.targets.find { |conf_target| conf_target.name == target.name }
|
27
|
+
if target_configuration == nil
|
28
|
+
@logger.log "No Spinjector managed build phases in target #{target}"
|
29
|
+
remove_all_scripts(target)
|
30
|
+
next
|
31
|
+
end
|
32
|
+
@logger.log "Configurating target #{target}"
|
33
|
+
scripts_to_apply = target_configuration.scripts_names.map { |name| BUILD_PHASE_PREFIX + name }.to_set
|
24
34
|
native_target_script_phases = target.shell_script_build_phases.select do |bp|
|
25
35
|
!bp.name.nil? && bp.name.start_with?(BUILD_PHASE_PREFIX)
|
26
36
|
end
|
27
37
|
native_target_script_phases.each do |script_phase|
|
28
|
-
|
38
|
+
if scripts_to_apply.include?(script_phase.name)
|
39
|
+
# Update existing script phase with new values
|
40
|
+
script_configuration = target_configuration.scripts.find { |script|
|
41
|
+
BUILD_PHASE_PREFIX + script.name == script_phase.name
|
42
|
+
}
|
43
|
+
update_script_in_target(script_phase, script_configuration, target)
|
44
|
+
scripts_to_apply.delete(script_phase.name)
|
45
|
+
elsif
|
46
|
+
target.build_phases.delete(script_phase)
|
47
|
+
# Remove now defunct script phase
|
48
|
+
end
|
29
49
|
end
|
50
|
+
# We may miss scripts that are yet to be added to the pbxproj target, this is fixed in the following method
|
51
|
+
reorder_and_add_missing_script_phases_of(target, target_configuration)
|
30
52
|
end
|
31
53
|
end
|
32
54
|
|
33
|
-
|
55
|
+
private
|
56
|
+
|
57
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target to remove the script phases
|
58
|
+
# @return [<Xcodeproj::Project::Object::PBXShellScriptBuildPhase>] the newly created build phase
|
34
59
|
#
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
add_scripts_in_target(target.scripts, xcode_target)
|
60
|
+
def spinjector_managed_phases(target)
|
61
|
+
spinjector_managed_phases = target.shell_script_build_phases.select do |bp|
|
62
|
+
!bp.name.nil? && bp.name.start_with?(BUILD_PHASE_PREFIX)
|
39
63
|
end
|
64
|
+
return spinjector_managed_phases
|
40
65
|
end
|
41
66
|
|
42
|
-
|
43
|
-
|
44
|
-
# @param [String] target_name
|
45
|
-
# @return [Xcodeproj::Project::Object::PBXNativeTarget] the target named by target_name
|
67
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target to remove the script phases
|
46
68
|
#
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
69
|
+
def remove_all_scripts(target)
|
70
|
+
# Delete all the spinjector managed scripts from the selected target
|
71
|
+
spinjector_managed_phases(target).each do |script_phase|
|
72
|
+
target.build_phases.delete(script_phase)
|
73
|
+
end
|
51
74
|
end
|
52
75
|
|
53
|
-
# @param [Array<Script>] scripts the script phases defined in configuration files
|
54
76
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target to add the script phases
|
77
|
+
# @param [Target] the target configuration describing the scripts to be added
|
55
78
|
#
|
56
|
-
def
|
57
|
-
scripts.each do |script|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
phase.shell_path = script.shell_path
|
62
|
-
phase.input_paths = script.input_paths
|
63
|
-
phase.output_paths = script.output_paths
|
64
|
-
phase.input_file_list_paths = script.input_file_list_paths
|
65
|
-
phase.output_file_list_paths = script.output_file_list_paths
|
66
|
-
phase.dependency_file = script.dependency_file
|
67
|
-
# At least with Xcode 10 `showEnvVarsInLog` is *NOT* set to any value even if it's checked and it only
|
68
|
-
# gets set to '0' if the user has explicitly disabled this.
|
69
|
-
if script.show_env_vars_in_log == '0'
|
70
|
-
phase.show_env_vars_in_log = script.show_env_vars_in_log
|
79
|
+
def reorder_and_add_missing_script_phases_of(target, target_configuration)
|
80
|
+
target_configuration.scripts.each do |script|
|
81
|
+
current_phase = spinjector_managed_phases(target).find { |phase| phase.name == BUILD_PHASE_PREFIX + script.name }
|
82
|
+
if current_phase == nil && should_add_script_in_target(script, target)
|
83
|
+
current_phase = add_script_in_target(script, target)
|
71
84
|
end
|
72
85
|
execution_position = script.execution_position
|
73
|
-
reorder_script_phase(target,
|
86
|
+
reorder_script_phase(target, current_phase, execution_position)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Checks If the target contains a build phase associated to the script execution position
|
91
|
+
# For instance, it checks if the Headers build phase is present when the script has a :after_headers position
|
92
|
+
# @param [Script] script the script phase defined in configuration files to add to the target
|
93
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target to add the script phases
|
94
|
+
# @return [Boolean] If the script should be added to the target
|
95
|
+
#
|
96
|
+
def should_add_script_in_target(script, target)
|
97
|
+
return true if script.execution_position === :after_all
|
98
|
+
|
99
|
+
target_phase_type = case script.execution_position
|
100
|
+
when :before_compile, :after_compile
|
101
|
+
Xcodeproj::Project::Object::PBXSourcesBuildPhase
|
102
|
+
when :before_headers, :after_headers
|
103
|
+
Xcodeproj::Project::Object::PBXHeadersBuildPhase
|
104
|
+
else
|
105
|
+
nil
|
106
|
+
end
|
107
|
+
|
108
|
+
found_phase_in_target = target.build_phases.find { |bp| bp.is_a?(target_phase_type) }
|
109
|
+
@logger.log("Can't find build phase associated to execution position #{script.execution_position} in target #{target.name}") if found_phase_in_target.nil?
|
110
|
+
return !found_phase_in_target.nil?
|
111
|
+
end
|
112
|
+
|
113
|
+
# @param [Script] script the script phase defined in configuration files to add to the target
|
114
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target to add the script phases
|
115
|
+
# @return [Xcodeproj::Project::Object::PBXShellScriptBuildPhase] the newly created build phase
|
116
|
+
#
|
117
|
+
def add_script_in_target(script, target)
|
118
|
+
name_with_prefix = BUILD_PHASE_PREFIX + script.name
|
119
|
+
phase = target.new_shell_script_build_phase(name_with_prefix)
|
120
|
+
update_script_in_target(phase, script, target)
|
121
|
+
return phase
|
122
|
+
end
|
123
|
+
|
124
|
+
# @param [Xcodeproj::Project::Object::PBXShellScriptBuildPhase] phase to update with the values from the script
|
125
|
+
# @param [Script] script the script phase defined in configuration files to add to the target
|
126
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target to add the script phase
|
127
|
+
#
|
128
|
+
def update_script_in_target(existing_phase, script_configuration, target)
|
129
|
+
existing_phase.shell_script = script_configuration.source_code
|
130
|
+
existing_phase.shell_path = script_configuration.shell_path
|
131
|
+
existing_phase.input_paths = script_configuration.input_paths
|
132
|
+
existing_phase.output_paths = script_configuration.output_paths
|
133
|
+
existing_phase.input_file_list_paths = script_configuration.input_file_list_paths
|
134
|
+
existing_phase.output_file_list_paths = script_configuration.output_file_list_paths
|
135
|
+
existing_phase.dependency_file = script_configuration.dependency_file
|
136
|
+
# At least with Xcode 10 `showEnvVarsInLog` is *NOT* set to any value even if it's checked and it only
|
137
|
+
# gets set to '0' if the user has explicitly disabled this.
|
138
|
+
if script_configuration.show_env_vars_in_log == '0'
|
139
|
+
existing_phase.show_env_vars_in_log = script_configuration.show_env_vars_in_log
|
74
140
|
end
|
75
141
|
end
|
76
142
|
|
@@ -79,42 +145,47 @@ class ProjectService
|
|
79
145
|
# @param [Symbol] execution_position could be :before_compile, :after_compile, :before_headers, :after_headers
|
80
146
|
#
|
81
147
|
def reorder_script_phase(target, script_phase, execution_position)
|
82
|
-
return if execution_position == :any || execution_position.to_s.empty?
|
83
|
-
|
148
|
+
return if execution_position == :any || execution_position.to_s.empty? || script_phase.nil?
|
149
|
+
if execution_position == :after_all
|
150
|
+
target.build_phases.move(script_phase, target.build_phases.count - 1)
|
151
|
+
return
|
152
|
+
end
|
153
|
+
|
154
|
+
offset = -1
|
84
155
|
# Find the point P where to add the script phase
|
85
156
|
target_phase_type = case execution_position
|
86
|
-
when :before_compile
|
157
|
+
when :before_compile
|
158
|
+
Xcodeproj::Project::Object::PBXSourcesBuildPhase
|
159
|
+
when :after_compile
|
160
|
+
offset = @insertion_offset_after_compile
|
161
|
+
@insertion_offset_after_compile += 1
|
87
162
|
Xcodeproj::Project::Object::PBXSourcesBuildPhase
|
88
|
-
when :before_headers
|
163
|
+
when :before_headers
|
164
|
+
Xcodeproj::Project::Object::PBXHeadersBuildPhase
|
165
|
+
when :after_headers
|
166
|
+
offset = @insertion_offset_after_headers
|
167
|
+
@insertion_offset_after_headers += 1
|
89
168
|
Xcodeproj::Project::Object::PBXHeadersBuildPhase
|
90
169
|
else
|
91
170
|
raise ArgumentError, "Unknown execution position `#{execution_position}`"
|
92
171
|
end
|
93
|
-
|
94
|
-
# Decide whether to add script_phase before or after point P
|
95
|
-
order_before = case execution_position
|
96
|
-
when :before_compile, :before_headers
|
97
|
-
true
|
98
|
-
when :after_compile, :after_headers
|
99
|
-
false
|
100
|
-
else
|
101
|
-
raise ArgumentError, "Unknown execution position `#{execution_position}`"
|
102
|
-
end
|
103
|
-
|
172
|
+
|
104
173
|
# Get the first build phase index of P
|
105
174
|
target_phase_index = target.build_phases.index do |bp|
|
106
175
|
bp.is_a?(target_phase_type)
|
107
176
|
end
|
108
177
|
return if target_phase_index.nil?
|
109
|
-
|
178
|
+
|
110
179
|
# Get the script phase we want to reorder index
|
111
180
|
script_phase_index = target.build_phases.index do |bp|
|
112
181
|
bp.is_a?(Xcodeproj::Project::Object::PBXShellScriptBuildPhase) && !bp.name.nil? && bp.name == script_phase.name
|
113
182
|
end
|
114
|
-
|
115
|
-
|
116
|
-
if (order_before && script_phase_index > target_phase_index) || (!order_before && script_phase_index < target_phase_index)
|
117
|
-
target.build_phases.move_from(script_phase_index, target_phase_index)
|
183
|
+
if target_phase_index < script_phase_index
|
184
|
+
offset += 1
|
118
185
|
end
|
186
|
+
|
187
|
+
target.build_phases.move_from(script_phase_index, target_phase_index + offset)
|
119
188
|
end
|
189
|
+
|
120
190
|
end
|
191
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Inject script phases into your Xcode project
|
2
|
+
#
|
3
|
+
# @author Guillaume Berthier
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'xcodeproj'
|
7
|
+
require_relative './project_service'
|
8
|
+
require_relative './yaml_parser'
|
9
|
+
|
10
|
+
class Runner
|
11
|
+
|
12
|
+
attr_reader :project
|
13
|
+
|
14
|
+
def initialize(project_path, configuration_file_path, logger)
|
15
|
+
raise "[Error] No xcodeproj found at #{project_path}" unless File.exist?(project_path)
|
16
|
+
@project = Xcodeproj::Project.open(project_path)
|
17
|
+
@configuration_file_path = configuration_file_path
|
18
|
+
@logger = logger
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
configuration = YAMLParser.new(@configuration_file_path, @logger).configuration
|
23
|
+
|
24
|
+
project_service = ProjectService.new(project, @logger)
|
25
|
+
project_service.update_scripts_in_targets(configuration)
|
26
|
+
|
27
|
+
@project.save()
|
28
|
+
@logger.log "Success."
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'set'
|
2
3
|
require_relative 'entity/configuration'
|
3
4
|
require_relative 'entity/script'
|
4
5
|
require_relative 'entity/target'
|
@@ -10,7 +11,12 @@ class YAMLParser
|
|
10
11
|
#
|
11
12
|
attr_reader :configuration
|
12
13
|
|
13
|
-
def initialize(yaml_file_path)
|
14
|
+
def initialize(yaml_file_path, logger)
|
15
|
+
@logger = logger
|
16
|
+
@inlined_scripts_ids = Set[]
|
17
|
+
@inlined_scripts_names = Set[]
|
18
|
+
@other_scripts_paths = Set[]
|
19
|
+
@other_scripts_names = Set[]
|
14
20
|
@configuration_description = load_yml_content(yaml_file_path)
|
15
21
|
@configuration = Configuration.new(targets)
|
16
22
|
end
|
@@ -19,12 +25,12 @@ class YAMLParser
|
|
19
25
|
|
20
26
|
def targets
|
21
27
|
if @configuration_description["targets"].nil?
|
22
|
-
|
28
|
+
@logger.log "[Warning] There is no target in your configuration file."
|
23
29
|
return
|
24
30
|
end
|
25
31
|
@configuration_description["targets"].map do |target_name, script_entries|
|
26
32
|
if script_entries.nil?
|
27
|
-
|
33
|
+
@logger.log "[Warning] There is no scripts in your configuration file under target #{target_name}"
|
28
34
|
return
|
29
35
|
end
|
30
36
|
scripts = script_entries.map do |entry|
|
@@ -35,7 +41,7 @@ class YAMLParser
|
|
35
41
|
end
|
36
42
|
|
37
43
|
def get_script(entry)
|
38
|
-
script =
|
44
|
+
script =
|
39
45
|
if !@configuration_description["scripts"].nil? && !@configuration_description["scripts"][entry].nil?
|
40
46
|
get_script_by_name(entry)
|
41
47
|
elsif File.exist?(entry)
|
@@ -46,13 +52,25 @@ class YAMLParser
|
|
46
52
|
end
|
47
53
|
|
48
54
|
def get_script_by_name(name)
|
55
|
+
@inlined_scripts_ids.add(name)
|
49
56
|
script_description = @configuration_description["scripts"][name]
|
50
|
-
ScriptMapper.new(script_description).map()
|
57
|
+
script = ScriptMapper.new(script_description).map()
|
58
|
+
@inlined_scripts_names.add(script.name)
|
59
|
+
error = "[Error] Multiple scripts with same name \'#{script.name}\'"
|
60
|
+
raise error unless @inlined_scripts_ids.count == @inlined_scripts_names.count
|
61
|
+
raise error unless !@inlined_scripts_names.intersect?(@other_scripts_names)
|
62
|
+
return script
|
51
63
|
end
|
52
64
|
|
53
65
|
def get_script_by_path(path)
|
66
|
+
@other_scripts_paths.add(path)
|
54
67
|
script_description = load_yml_content(path)
|
55
|
-
ScriptMapper.new(script_description).map()
|
68
|
+
script = ScriptMapper.new(script_description).map()
|
69
|
+
@other_scripts_names.add(script.name)
|
70
|
+
error = "[Error] Multiple scripts with same name \'#{script.name}\'"
|
71
|
+
raise error unless @other_scripts_paths.count == @other_scripts_names.count
|
72
|
+
raise error unless !@inlined_scripts_names.intersect?(@other_scripts_names)
|
73
|
+
return script
|
56
74
|
end
|
57
75
|
|
58
76
|
# @param [String] configuration_path
|
data/lib/spinjector.rb
CHANGED
@@ -5,8 +5,8 @@
|
|
5
5
|
|
6
6
|
require 'optparse'
|
7
7
|
require 'xcodeproj'
|
8
|
-
require_relative 'spinjector/
|
9
|
-
require_relative 'spinjector/
|
8
|
+
require_relative 'spinjector/runner'
|
9
|
+
require_relative 'spinjector/logger'
|
10
10
|
|
11
11
|
CONFIGURATION_FILE_PATH = 'Configuration/spinjector_configuration.yaml'.freeze
|
12
12
|
|
@@ -20,15 +20,11 @@ OptionParser.new do |opts|
|
|
20
20
|
end.parse!
|
21
21
|
|
22
22
|
project_path = Dir.glob("*.xcodeproj").first
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
project_service.add_scripts_in_targets(configuration)
|
32
|
-
|
33
|
-
project.save()
|
34
|
-
puts "Success."
|
23
|
+
raise "[Error] No xcodeproj found in #{Dir.pwd}" if project_path.nil?
|
24
|
+
|
25
|
+
runner = Runner.new(
|
26
|
+
project_path,
|
27
|
+
options[:configuration_path] || CONFIGURATION_FILE_PATH,
|
28
|
+
VerboseLogger.new
|
29
|
+
)
|
30
|
+
runner.run
|
data/spinjector.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'spinjector'
|
3
|
-
s.version = '0.0
|
3
|
+
s.version = '1.0.0'
|
4
4
|
s.executables << 'spinjector'
|
5
5
|
s.summary = "Inject script phases into your Xcode project"
|
6
6
|
s.description = ""
|
@@ -14,4 +14,10 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.add_dependency 'optparse', '~> 0.1'
|
15
15
|
s.add_dependency 'xcodeproj', '~> 1.21'
|
16
16
|
s.add_dependency 'yaml', '~> 0.2'
|
17
|
-
|
17
|
+
|
18
|
+
s.add_development_dependency 'bundler', '>= 1.12.0', '< 3.0.0'
|
19
|
+
s.add_development_dependency 'rake', '~> 12.3'
|
20
|
+
s.add_development_dependency 'minitest', '~> 5.11'
|
21
|
+
s.add_development_dependency 'minitest-reporters', '~> 1.3'
|
22
|
+
s.add_development_dependency 'minitest-hooks', '~> 1.5'
|
23
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spinjector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillaume Berthier, Fabernovel
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: optparse
|
@@ -52,6 +52,82 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.12.0
|
62
|
+
- - "<"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 3.0.0
|
65
|
+
type: :development
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 1.12.0
|
72
|
+
- - "<"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 3.0.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rake
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '12.3'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '12.3'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: minitest
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '5.11'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '5.11'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: minitest-reporters
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.3'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '1.3'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: minitest-hooks
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '1.5'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '1.5'
|
55
131
|
description: ''
|
56
132
|
email: guillaume.berthier@fabernovel.com
|
57
133
|
executables:
|
@@ -59,7 +135,9 @@ executables:
|
|
59
135
|
extensions: []
|
60
136
|
extra_rdoc_files: []
|
61
137
|
files:
|
138
|
+
- ".github/workflows/ci.yml"
|
62
139
|
- ".gitignore"
|
140
|
+
- CHANGELOG.md
|
63
141
|
- Examples/Configuration/helloworld.yaml
|
64
142
|
- Examples/Configuration/helloworld_explicit_script.yaml
|
65
143
|
- Examples/Configuration/helloworld_short.yaml
|
@@ -67,14 +145,19 @@ files:
|
|
67
145
|
- Examples/Images/build_phases.png
|
68
146
|
- Examples/Images/hello_world_explicit.png
|
69
147
|
- Examples/Scripts/helloworld.sh
|
148
|
+
- Gemfile
|
149
|
+
- Gemfile.lock
|
70
150
|
- Makefile
|
71
151
|
- README.md
|
152
|
+
- Rakefile
|
72
153
|
- bin/spinjector
|
73
154
|
- lib/spinjector.rb
|
74
155
|
- lib/spinjector/entity/configuration.rb
|
75
156
|
- lib/spinjector/entity/script.rb
|
76
157
|
- lib/spinjector/entity/target.rb
|
158
|
+
- lib/spinjector/logger.rb
|
77
159
|
- lib/spinjector/project_service.rb
|
160
|
+
- lib/spinjector/runner.rb
|
78
161
|
- lib/spinjector/script_mapper.rb
|
79
162
|
- lib/spinjector/yaml_parser.rb
|
80
163
|
- spinjector.gemspec
|
@@ -82,7 +165,7 @@ homepage: https://github.com/faberNovel/spinjector
|
|
82
165
|
licenses:
|
83
166
|
- MIT
|
84
167
|
metadata: {}
|
85
|
-
post_install_message:
|
168
|
+
post_install_message:
|
86
169
|
rdoc_options: []
|
87
170
|
require_paths:
|
88
171
|
- lib
|
@@ -97,8 +180,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
180
|
- !ruby/object:Gem::Version
|
98
181
|
version: '0'
|
99
182
|
requirements: []
|
100
|
-
rubygems_version: 3.
|
101
|
-
signing_key:
|
183
|
+
rubygems_version: 3.3.3
|
184
|
+
signing_key:
|
102
185
|
specification_version: 4
|
103
186
|
summary: Inject script phases into your Xcode project
|
104
187
|
test_files: []
|