branch_io_cli 0.3.1 → 0.3.2
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 +4 -4
- data/README.md +16 -7
- data/lib/branch_io_cli/cli.rb +28 -18
- data/lib/branch_io_cli/command.rb +10 -9
- data/lib/branch_io_cli/helper/configuration_helper.rb +126 -11
- data/lib/branch_io_cli/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 334a3a4f55aeb27b4a683036fb8c26c576c93e0e
|
4
|
+
data.tar.gz: 74ea173bc48c7eedd4868098612064ec6369a21c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49ff44e9f2aa8c44a9df062ce6a650682823c278028aa1ad6be2488d0c6ca603fe8baf60ce8bc23b7c5c316a9339b58d51682a9909e88eb2448c57f02f43f962
|
7
|
+
data.tar.gz: 6efb3a1bf7349f0b8772ef5e6f03e34b5fcd834004eef6799bcbf5de2eb4b4a719fcf3f549fa77304409d528e09ecc300d04475ec839b3bb681452608b04d855
|
data/README.md
CHANGED
@@ -41,25 +41,30 @@ branch_io setup
|
|
41
41
|
Integrates the Branch SDK into a native app project. This currently supports iOS only.
|
42
42
|
It will infer the project location if there is exactly one .xcodeproj anywhere under
|
43
43
|
the current directory, excluding any in a Pods or Carthage folder. Otherwise, specify
|
44
|
-
the project location using the `--xcodeproj` option
|
44
|
+
the project location using the `--xcodeproj` option, or the CLI will prompt you for the
|
45
|
+
location.
|
45
46
|
|
46
47
|
If a Podfile or Cartfile is detected, the Branch SDK will be added to the relevant
|
47
48
|
configuration file and the dependencies updated to include the Branch framework.
|
48
49
|
This behavior may be suppressed using `--no_add_sdk`. If no Podfile or Cartfile
|
49
50
|
is found, and Branch.framework is not already among the project's dependencies,
|
50
|
-
you will be prompted for a number of choices
|
51
|
+
you will be prompted for a number of choices, including setting up CocoaPods or
|
52
|
+
Carthage for the project or directly installing the Branch.framework.
|
51
53
|
|
52
54
|
By default, all supplied Universal Link domains are validated. If validation passes,
|
53
55
|
the setup continues. If validation fails, no further action is taken. Suppress
|
54
56
|
validation using `--no_validate` or force changes when validation fails using
|
55
57
|
`--force`.
|
56
58
|
|
57
|
-
|
59
|
+
By default, this command will look for the first app target in the project. Test
|
60
|
+
targets are not supported. To set up an extension target, supply the `--target` option.
|
61
|
+
|
62
|
+
All relevant target settings are modified. The Branch keys are added to the Info.plist,
|
58
63
|
along with the `branch_universal_link_domains` key for custom domains (when `--domains`
|
59
|
-
is used).
|
60
|
-
An entitlements file is added if none is found.
|
61
|
-
specified, this command can add a list of system
|
62
|
-
AdSupport, CoreSpotlight, SafariServices).
|
64
|
+
is used). For app targets, all domains are added to the project's Associated Domains
|
65
|
+
entitlement. An entitlements file is also added for app targets if none is found.
|
66
|
+
Optionally, if `--frameworks` is specified, this command can add a list of system
|
67
|
+
frameworks to the target's dependencies (e.g., AdSupport, CoreSpotlight, SafariServices).
|
63
68
|
|
64
69
|
A language-specific patch is applied to the AppDelegate (Swift or Objective-C).
|
65
70
|
This can be suppressed using `--no_patch_source`.
|
@@ -114,6 +119,10 @@ signing team identifiers in the project as well as the app's Associated Domains.
|
|
114
119
|
It requests the apple-app-site-association file for each domain and validates
|
115
120
|
the file against the project's settings.
|
116
121
|
|
122
|
+
Only app targets are supported for this command. By default, it will validate the first.
|
123
|
+
If your project has multiple app targets, specify the <%= color('--target', BOLD) %> option to validate other
|
124
|
+
targets.
|
125
|
+
|
117
126
|
#### Options
|
118
127
|
|
119
128
|
|Option|Description|
|
data/lib/branch_io_cli/cli.rb
CHANGED
@@ -20,25 +20,30 @@ EOF
|
|
20
20
|
Integrates the Branch SDK into a native app project. This currently supports iOS only.
|
21
21
|
It will infer the project location if there is exactly one .xcodeproj anywhere under
|
22
22
|
the current directory, excluding any in a Pods or Carthage folder. Otherwise, specify
|
23
|
-
the project location using the <%= color('--xcodeproj', BOLD) %> option
|
23
|
+
the project location using the <%= color('--xcodeproj', BOLD) %> option, or the CLI will prompt you for the
|
24
|
+
location.
|
24
25
|
|
25
26
|
If a Podfile or Cartfile is detected, the Branch SDK will be added to the relevant
|
26
27
|
configuration file and the dependencies updated to include the Branch framework.
|
27
28
|
This behavior may be suppressed using <%= color('--no_add_sdk', BOLD) %>. If no Podfile or Cartfile
|
28
29
|
is found, and Branch.framework is not already among the project's dependencies,
|
29
|
-
you will be prompted for a number of choices
|
30
|
+
you will be prompted for a number of choices, including setting up CocoaPods or
|
31
|
+
Carthage for the project or directly installing the Branch.framework.
|
30
32
|
|
31
33
|
By default, all supplied Universal Link domains are validated. If validation passes,
|
32
34
|
the setup continues. If validation fails, no further action is taken. Suppress
|
33
35
|
validation using <%= color('--no_validate', BOLD) %> or force changes when validation fails using
|
34
36
|
<%= color('--force', BOLD) %>.
|
35
37
|
|
36
|
-
|
38
|
+
By default, this command will look for the first app target in the project. Test
|
39
|
+
targets are not supported. To set up an extension target, supply the <%= color('--target', BOLD) %> option.
|
40
|
+
|
41
|
+
All relevant target settings are modified. The Branch keys are added to the Info.plist,
|
37
42
|
along with the <%= color('branch_universal_link_domains', BOLD) %> key for custom domains (when <%= color('--domains', BOLD) %>
|
38
|
-
is used).
|
39
|
-
An entitlements file is added if none is found.
|
40
|
-
specified, this command can add a list of system
|
41
|
-
AdSupport, CoreSpotlight, SafariServices).
|
43
|
+
is used). For app targets, all domains are added to the project's Associated Domains
|
44
|
+
entitlement. An entitlements file is also added for app targets if none is found.
|
45
|
+
Optionally, if <%= color('--frameworks', BOLD) %> is specified, this command can add a list of system
|
46
|
+
frameworks to the target's dependencies (e.g., AdSupport, CoreSpotlight, SafariServices).
|
42
47
|
|
43
48
|
A language-specific patch is applied to the AppDelegate (Swift or Objective-C).
|
44
49
|
This can be suppressed using <%= color('--no_patch_source', BOLD) %>.
|
@@ -94,17 +99,22 @@ EOF
|
|
94
99
|
c.syntax = "branch_io validate [OPTIONS]"
|
95
100
|
c.summary = "Validates all Universal Link domains configured in a project"
|
96
101
|
c.description = <<EOF
|
97
|
-
This command validates all Universal Link domains configured in a project without making any
|
98
|
-
It validates both Branch and non-Branch domains. Unlike web-based Universal
|
99
|
-
this command operates directly on the project. It finds the bundle and
|
100
|
-
signing team identifiers in the project as well as the app's Associated Domains.
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
102
|
+
This command validates all Universal Link domains configured in a project without making any
|
103
|
+
modification. It validates both Branch and non-Branch domains. Unlike web-based Universal
|
104
|
+
Link validators, this command operates directly on the project. It finds the bundle and
|
105
|
+
signing team identifiers in the project as well as the app's Associated Domains. It requests
|
106
|
+
the apple-app-site-association file for each domain and validates the file against the
|
107
|
+
project's settings.
|
108
|
+
|
109
|
+
Only app targets are supported for this command. By default, it will validate the first.
|
110
|
+
If your project has multiple app targets, specify the <%= color('--target', BOLD) %> option to validate other
|
111
|
+
targets.
|
112
|
+
|
113
|
+
All parameters are optional. If <%= color('--domains', BOLD) %> is specified, the list of Universal Link domains in
|
114
|
+
the Associated Domains entitlement must exactly match this list, without regard to order. If
|
115
|
+
no <%= color('--domains', BOLD) %> are provided, validation passes if at least one Universal Link domain is
|
116
|
+
configured and passes validation, and no Universal Link domain is present that does not pass
|
117
|
+
validation.
|
108
118
|
|
109
119
|
See https://github.com/BranchMetrics/branch_io_cli#validate-command for more information.
|
110
120
|
EOF
|
@@ -14,24 +14,25 @@ module BranchIOCLI
|
|
14
14
|
|
15
15
|
update_podfile(options) || update_cartfile(options, xcodeproj)
|
16
16
|
|
17
|
-
|
17
|
+
target_name = options.target # may be nil
|
18
|
+
is_app_target = !Helper::ConfigurationHelper.target.extension_target_type?
|
18
19
|
|
19
|
-
if !options.no_validate &&
|
20
|
-
!helper.validate_team_and_bundle_ids_from_aasa_files(xcodeproj,
|
20
|
+
if is_app_target && !options.no_validate &&
|
21
|
+
!helper.validate_team_and_bundle_ids_from_aasa_files(xcodeproj, target_name, @domains)
|
21
22
|
say "Universal Link configuration failed validation."
|
22
23
|
helper.errors.each { |error| say " #{error}" }
|
23
24
|
return unless options.force
|
24
|
-
elsif !options.no_validate
|
25
|
+
elsif is_app_target && !options.no_validate
|
25
26
|
say "Universal Link configuration passed validation. ✅"
|
26
27
|
end
|
27
28
|
|
28
29
|
# the following calls can all raise IOError
|
29
|
-
helper.add_keys_to_info_plist xcodeproj,
|
30
|
-
helper.add_branch_universal_link_domains_to_info_plist xcodeproj,
|
31
|
-
new_path = helper.add_universal_links_to_project xcodeproj,
|
30
|
+
helper.add_keys_to_info_plist xcodeproj, target_name, @keys
|
31
|
+
helper.add_branch_universal_link_domains_to_info_plist xcodeproj, target_name, @domains if is_app_target
|
32
|
+
new_path = helper.add_universal_links_to_project xcodeproj, target_name, @domains, false if is_app_target
|
32
33
|
`git add #{new_path}` if options.commit && new_path
|
33
34
|
|
34
|
-
helper.add_system_frameworks xcodeproj,
|
35
|
+
helper.add_system_frameworks xcodeproj, target_name, options.frameworks unless options.frameworks.nil? || options.frameworks.empty?
|
35
36
|
|
36
37
|
xcodeproj.save
|
37
38
|
|
@@ -143,7 +144,7 @@ module BranchIOCLI
|
|
143
144
|
# 4. Add to target depependencies
|
144
145
|
frameworks_group = project.frameworks_group
|
145
146
|
branch_framework = frameworks_group.new_file "Carthage/Build/iOS/Branch.framework"
|
146
|
-
target =
|
147
|
+
target = ConfigurationHelper.target
|
147
148
|
target.frameworks_build_phase.add_file_reference branch_framework
|
148
149
|
|
149
150
|
# 5. Add to copy-frameworks build phase
|
@@ -6,28 +6,77 @@ require "zip"
|
|
6
6
|
|
7
7
|
module BranchIOCLI
|
8
8
|
module Helper
|
9
|
+
# rubocop: disable Metrics/ClassLength
|
9
10
|
class ConfigurationHelper
|
10
11
|
class << self
|
12
|
+
APP_LINK_REGEXP = /\.app\.link$|\.test-app\.link$/
|
13
|
+
|
11
14
|
attr_accessor :xcodeproj_path
|
12
15
|
attr_accessor :xcodeproj
|
13
16
|
attr_accessor :keys
|
14
17
|
attr_accessor :all_domains
|
15
18
|
attr_accessor :podfile_path
|
16
19
|
attr_accessor :cartfile_path
|
20
|
+
attr_accessor :target
|
17
21
|
|
18
22
|
def validate_setup_options(options)
|
23
|
+
print_identification "setup"
|
24
|
+
|
19
25
|
say "--force is ignored when --no_validate is used." if options.no_validate && options.force
|
20
26
|
|
21
27
|
validate_xcodeproj_path options
|
28
|
+
validate_target options
|
22
29
|
validate_keys_from_setup_options options
|
23
|
-
validate_all_domains options
|
30
|
+
validate_all_domains options, !@target.extension_target_type?
|
24
31
|
validate_buildfile_path options, "Podfile"
|
25
32
|
validate_buildfile_path options, "Cartfile"
|
33
|
+
|
34
|
+
print_setup_configuration
|
35
|
+
|
26
36
|
validate_sdk_addition options
|
27
37
|
end
|
28
38
|
|
29
39
|
def validate_validation_options(options)
|
40
|
+
print_identification "validate"
|
41
|
+
|
30
42
|
validate_xcodeproj_path options
|
43
|
+
validate_target options, false
|
44
|
+
|
45
|
+
print_validation_configuration
|
46
|
+
end
|
47
|
+
|
48
|
+
def print_identification(command)
|
49
|
+
say <<EOF
|
50
|
+
|
51
|
+
<%= color("branch_io #{command} v. #{VERSION}", BOLD) %>
|
52
|
+
|
53
|
+
EOF
|
54
|
+
end
|
55
|
+
|
56
|
+
def print_setup_configuration
|
57
|
+
say <<EOF
|
58
|
+
|
59
|
+
<%= color('Configuration:', BOLD) %>
|
60
|
+
|
61
|
+
<%= color('Xcode project:', BOLD) %> #{@xcodeproj_path}
|
62
|
+
<%= color('Target:', BOLD) %> #{@target.name}
|
63
|
+
<%= color('Live key:', BOLD) %> #{@keys[:live] || '(none)'}
|
64
|
+
<%= color('Test key:', BOLD) %> #{@keys[:test] || '(none)'}
|
65
|
+
<%= color('Domains:', BOLD) %> #{@all_domains}
|
66
|
+
<%= color('Podfile:', BOLD) %> #{@podfile_path || '(none)'}
|
67
|
+
<%= color('Cartfile:', BOLD) %> #{@cartfile_path || '(none)'}
|
68
|
+
|
69
|
+
EOF
|
70
|
+
end
|
71
|
+
|
72
|
+
def print_validation_configuration
|
73
|
+
say <<EOF
|
74
|
+
<%= color('Configuration:', BOLD) %>
|
75
|
+
|
76
|
+
<%= color('Xcode project:', BOLD) %> #{@xcodeproj_path}
|
77
|
+
<%= color('Target:', BOLD) %> #{@target.name}
|
78
|
+
<%= color('Domains:', BOLD) %> #{@all_domains}
|
79
|
+
EOF
|
31
80
|
end
|
32
81
|
|
33
82
|
def validate_keys_from_setup_options(options)
|
@@ -47,13 +96,26 @@ module BranchIOCLI
|
|
47
96
|
end
|
48
97
|
end
|
49
98
|
|
50
|
-
def validate_all_domains(options)
|
51
|
-
|
52
|
-
|
99
|
+
def validate_all_domains(options, required = true)
|
100
|
+
app_link_roots = app_link_roots_from_domains options.domains
|
101
|
+
|
102
|
+
unless options.app_link_subdomain.nil? || app_link_roots.include?(options.app_link_subdomain)
|
103
|
+
app_link_roots << options.app_link_subdomain
|
104
|
+
end
|
105
|
+
|
106
|
+
# app_link_roots now contains options.app_link_subdomain, if supplied, and the roots of any
|
107
|
+
# .app.link or .test-app.link domains provided via options.domains.
|
108
|
+
|
109
|
+
app_link_subdomains = app_link_subdomains_from_roots app_link_roots
|
110
|
+
|
111
|
+
custom_domains = custom_domains_from_domains options.domains
|
112
|
+
|
53
113
|
@all_domains = (app_link_subdomains + custom_domains).uniq
|
54
114
|
|
55
|
-
while @all_domains.empty?
|
56
|
-
|
115
|
+
while required && @all_domains.empty?
|
116
|
+
domains = ask "Please enter domains as a comma-separated list: ", ->(str) { str.split "," }
|
117
|
+
|
118
|
+
@all_domains = all_domains_from_domains domains
|
57
119
|
end
|
58
120
|
end
|
59
121
|
|
@@ -92,13 +154,54 @@ module BranchIOCLI
|
|
92
154
|
end
|
93
155
|
end
|
94
156
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
157
|
+
def validate_target(options, allow_extensions = true)
|
158
|
+
non_test_targets = @xcodeproj.targets.reject(&:test_target_type?)
|
159
|
+
raise "No non-test target found in project" if non_test_targets.empty?
|
160
|
+
|
161
|
+
valid_targets = non_test_targets.reject { |t| !allow_extensions && t.extension_target_type? }
|
162
|
+
|
163
|
+
begin
|
164
|
+
target = BranchHelper.target_from_project @xcodeproj, options.target
|
165
|
+
|
166
|
+
# If a test target was explicitly specified.
|
167
|
+
raise "Cannot use test targets" if target.test_target_type?
|
168
|
+
|
169
|
+
# If an extension target was explicitly specified for validation.
|
170
|
+
raise "Extension targets not allowed for this command" if !allow_extensions && target.extension_target_type?
|
171
|
+
|
172
|
+
@target = target
|
173
|
+
rescue StandardError => e
|
174
|
+
say e.message
|
175
|
+
|
176
|
+
choice = choose do |menu|
|
177
|
+
valid_targets.each { |t| menu.choice t.name }
|
178
|
+
menu.prompt = "Which target do you wish to use? "
|
179
|
+
end
|
180
|
+
|
181
|
+
@target = @xcodeproj.targets.find { |t| t.name = choice }
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def app_link_roots_from_domains(domains)
|
186
|
+
return [] if domains.nil?
|
187
|
+
|
188
|
+
domains.select { |d| d =~ APP_LINK_REGEXP }
|
189
|
+
.map { |d| d.sub(APP_LINK_REGEXP, '').sub(/-alternate$/, '') }
|
190
|
+
.uniq
|
191
|
+
end
|
192
|
+
|
193
|
+
def custom_domains_from_domains(domains)
|
194
|
+
return [] if domains.nil?
|
195
|
+
domains.reject { |d| d =~ APP_LINK_REGEXP }.uniq
|
196
|
+
end
|
197
|
+
|
198
|
+
def app_link_subdomains(root)
|
199
|
+
app_link_subdomain = root
|
100
200
|
return [] if app_link_subdomain.nil?
|
101
201
|
|
202
|
+
live_key = @keys[:live]
|
203
|
+
test_key = @keys[:test]
|
204
|
+
|
102
205
|
domains = []
|
103
206
|
unless live_key.nil?
|
104
207
|
domains += [
|
@@ -115,6 +218,17 @@ module BranchIOCLI
|
|
115
218
|
domains
|
116
219
|
end
|
117
220
|
|
221
|
+
def app_link_subdomains_from_roots(roots)
|
222
|
+
roots.inject([]) { |domains, root| domains + app_link_subdomains(root) }
|
223
|
+
end
|
224
|
+
|
225
|
+
def all_domains_from_domains(domains)
|
226
|
+
app_link_roots = app_link_roots_from_domains domains
|
227
|
+
app_link_subdomains = app_link_subdomains_from_roots app_link_roots
|
228
|
+
custom_domains = custom_domains_from_domains domains
|
229
|
+
custom_domains + app_link_subdomains
|
230
|
+
end
|
231
|
+
|
118
232
|
def validate_buildfile_path(options, filename)
|
119
233
|
# Disable Podfile/Cartfile update if --no_add_sdk is present
|
120
234
|
return if options.no_add_sdk
|
@@ -364,4 +478,5 @@ EOF
|
|
364
478
|
end
|
365
479
|
end
|
366
480
|
end
|
481
|
+
# rubocop enable: Metrics/ClassLength
|
367
482
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: branch_io_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Branch
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-10-
|
12
|
+
date: 2017-10-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: commander
|