branch_io_cli 0.2.2 → 0.3.0

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
  SHA1:
3
- metadata.gz: 3e44ff16984837cc68abcc18111323a33b52cd1f
4
- data.tar.gz: 81f3b075bb26b8037754313ee745269c26d2c224
3
+ metadata.gz: 6ed6a08fd41a779e66e95b3d4bbfd60b73f9f1a7
4
+ data.tar.gz: 86d0ab68a447fa963a9bb40810aec4c9e7a54d13
5
5
  SHA512:
6
- metadata.gz: 1482aad528f89e1d23d031719fab36d10611104c39edb0e113e099bdbfaee5d533855a5555d8a50dc12d056c6b14b388f6842c8f98f96802826b694bbd06cb3e
7
- data.tar.gz: a664d4adfebdacd3e9e5874a47ce01a469d3d9224c32c7ccff9e3464c4d169ecf106fbcbb292800d77d3d3a7cae6f9bdbf7734d485c144bcfe61a68882730832
6
+ metadata.gz: 6853fe36957e1364ee1d3cfabfc43126d49570c8799838648619ddba431f62a0ddab9de3bdb641a9907d5f48d2fd3968226cb91b7e2001b65496dafdc5629ba2
7
+ data.tar.gz: f37d61ba24b28fb17663d2ae71d7c38c800458fb58c12fb68ef2381e4e243c4688936b5ee4a9d16cfe1d57bfa87378d9ed24ab37ee04840bc3167974d1068d69
data/README.md CHANGED
@@ -11,6 +11,11 @@ This is a command-line tool to integrate the Branch SDK into mobile app projects
11
11
 
12
12
  This is a preliminary release of this gem. Please report any problems by opening issues in this repo.
13
13
 
14
+ ### Using Fastlane?
15
+
16
+ See also the [Branch Fastlane plugin](https://github.com/BranchMetrics/fastlane-plugin-branch), which offers
17
+ the same support via Fastlane.
18
+
14
19
  ## Getting started
15
20
 
16
21
  ```bash
@@ -125,3 +130,8 @@ and no Universal Link domain is present that does not pass validation.
125
130
  #### Return value
126
131
 
127
132
  If validation passes, this command returns 0. If validation fails, it returns 1.
133
+
134
+ ## Examples
135
+
136
+ See the [examples](./examples) folder for several example projects that can be
137
+ used to exercise the CLI.
@@ -1,15 +1,16 @@
1
+ require "pathname"
1
2
  require "xcodeproj"
2
3
 
3
4
  module BranchIOCLI
4
5
  class Command
5
6
  class << self
6
7
  def setup(options)
7
- options = Helper::ConfigurationHelper.validate_setup_options options
8
+ config_helper.validate_setup_options options
8
9
 
9
- @keys = Helper::ConfigurationHelper.keys
10
- @domains = Helper::ConfigurationHelper.all_domains
11
- @xcodeproj_path = options.xcodeproj
12
- xcodeproj = Helper::ConfigurationHelper.xcodeproj
10
+ @keys = config_helper.keys
11
+ @domains = config_helper.all_domains
12
+ @xcodeproj_path = config_helper.xcodeproj_path
13
+ xcodeproj = config_helper.xcodeproj
13
14
 
14
15
  update_podfile(options) || update_cartfile(options, xcodeproj)
15
16
 
@@ -38,14 +39,17 @@ module BranchIOCLI
38
39
 
39
40
  return unless options.commit
40
41
 
41
- `git commit #{helper.changes.to_a.join(" ")} -m '[branch_io_cli] Branch SDK integration'`
42
+ current_pathname = Pathname.new File.expand_path "."
43
+ changes = helper.changes.to_a.map { |c| Pathname.new(File.expand_path(c)).relative_path_from(current_pathname).to_s }
44
+
45
+ `git commit #{changes.join(" ")} -m '[branch_io_cli] Branch SDK integration'`
42
46
  end
43
47
 
44
48
  def validate(options)
45
- options = Helper::ConfigurationHelper.validate_validation_options options
49
+ config_helper.validate_validation_options options
46
50
 
47
51
  # raises
48
- xcodeproj = Helper::ConfigurationHelper.xcodeproj
52
+ xcodeproj = config_helper.xcodeproj
49
53
 
50
54
  valid = true
51
55
 
@@ -80,45 +84,15 @@ module BranchIOCLI
80
84
  end
81
85
 
82
86
  def helper
83
- BranchIOCLI::Helper::BranchHelper
87
+ Helper::BranchHelper
84
88
  end
85
89
 
86
- def podfile_path(options)
87
- # Disable Podfile update if add_sdk: false is present
88
- return nil if options.no_add_sdk
89
-
90
- # Use the :podfile parameter if present
91
- if options.podfile
92
- raise "--podfile argument must specify a path ending in '/Podfile'" unless options.podfile =~ %r{/Podfile$}
93
- podfile_path = File.expand_path options.podfile, "."
94
- return podfile_path if File.exist? podfile_path
95
- raise "#{podfile_path} not found"
96
- end
97
-
98
- # Look in the same directory as the project (typical setup)
99
- podfile_path = File.expand_path "../Podfile", @xcodeproj_path
100
- return podfile_path if File.exist? podfile_path
101
- end
102
-
103
- def cartfile_path(options)
104
- # Disable Cartfile update if add_sdk: false is present
105
- return nil if options.no_add_sdk
106
-
107
- # Use the :cartfile parameter if present
108
- if options.cartfile
109
- raise "--cartfile argument must specify a path ending in '/Cartfile'" unless options.cartfile =~ %r{/Cartfile$}
110
- cartfile_path = File.expand_path options.cartfile, "."
111
- return cartfile_path if File.exist? cartfile_path
112
- raise "#{cartfile_path} not found"
113
- end
114
-
115
- # Look in the same directory as the project (typical setup)
116
- cartfile_path = File.expand_path "../Cartfile", @xcodeproj_path
117
- return cartfile_path if File.exist? cartfile_path
90
+ def config_helper
91
+ Helper::ConfigurationHelper
118
92
  end
119
93
 
120
94
  def update_podfile(options)
121
- podfile_path = podfile_path options
95
+ podfile_path = config_helper.podfile_path
122
96
  return false if podfile_path.nil?
123
97
 
124
98
  # 1. Patch Podfile. Return if no change (Branch pod already present).
@@ -138,7 +112,8 @@ module BranchIOCLI
138
112
  helper.add_change "#{podfile_path}.lock"
139
113
 
140
114
  # 4. Check if Pods folder is under SCM
141
- pods_folder_path = File.expand_path "../Pods", podfile_path
115
+ current_pathname = Pathname.new File.expand_path "."
116
+ pods_folder_path = Pathname.new(File.expand_path("../Pods", podfile_path)).relative_path_from current_pathname
142
117
  `git ls-files #{pods_folder_path} --error-unmatch > /dev/null 2>&1`
143
118
  return true unless $?.exitstatus == 0
144
119
 
@@ -150,7 +125,7 @@ module BranchIOCLI
150
125
  end
151
126
 
152
127
  def update_cartfile(options, project)
153
- cartfile_path = cartfile_path options
128
+ cartfile_path = config_helper.cartfile_path
154
129
  return false if cartfile_path.nil?
155
130
 
156
131
  # 1. Patch Cartfile. Return if no change (Branch already present).
@@ -158,7 +133,7 @@ module BranchIOCLI
158
133
 
159
134
  # 2. carthage update
160
135
  Dir.chdir(File.dirname(cartfile_path)) do
161
- system "carthage update"
136
+ system "carthage update --platform ios"
162
137
  end
163
138
 
164
139
  # 3. Add Cartfile and Cartfile.resolved to commit (in case :commit param specified)
@@ -166,7 +141,7 @@ module BranchIOCLI
166
141
  helper.add_change "#{cartfile_path}.resolved"
167
142
 
168
143
  # 4. Add to target depependencies
169
- frameworks_group = project['Frameworks']
144
+ frameworks_group = project.frameworks_group
170
145
  branch_framework = frameworks_group.new_file "Carthage/Build/iOS/Branch.framework"
171
146
  target = helper.target_from_project project, options.target
172
147
  target.frameworks_build_phase.add_file_reference branch_framework
@@ -182,11 +157,12 @@ module BranchIOCLI
182
157
  end
183
158
 
184
159
  # 6. Check if Carthage folder is under SCM
185
- carthage_folder_path = File.expand_path "../Carthage", cartfile_path
160
+ current_pathname = Pathname.new File.expand_path "."
161
+ carthage_folder_path = Pathname.new(File.expand_path("../Carthage", cartfile_path)).relative_path_from current_pathname
186
162
  `git ls-files #{carthage_folder_path} --error-unmatch > /dev/null 2>&1`
187
163
  return true unless $?.exitstatus == 0
188
164
 
189
- # 7. If so, add the Pods folder to the commit (in case :commit param specified)
165
+ # 7. If so, add the Carthage folder to the commit (in case :commit param specified)
190
166
  helper.add_change carthage_folder_path
191
167
  `git add #{carthage_folder_path}` if options.commit
192
168
 
@@ -1,23 +1,33 @@
1
+ require "json"
2
+ require "net/http"
3
+ require "pathname"
1
4
  require "xcodeproj"
5
+ require "zip"
2
6
 
3
7
  module BranchIOCLI
4
8
  module Helper
5
9
  class ConfigurationHelper
6
10
  class << self
11
+ attr_accessor :xcodeproj_path
7
12
  attr_accessor :xcodeproj
8
13
  attr_accessor :keys
9
14
  attr_accessor :all_domains
15
+ attr_accessor :podfile_path
16
+ attr_accessor :cartfile_path
10
17
 
11
18
  def validate_setup_options(options)
12
- options.xcodeproj = xcodeproj_path options
19
+ say "--force is ignored when --no_validate is used." if options.no_validate && options.force
20
+
21
+ validate_xcodeproj_path options
13
22
  validate_keys_from_setup_options options
14
23
  validate_all_domains options
15
- options
24
+ validate_buildfile_path options, "Podfile"
25
+ validate_buildfile_path options, "Cartfile"
26
+ validate_sdk_addition options
16
27
  end
17
28
 
18
29
  def validate_validation_options(options)
19
- options.xcodeproj = xcodeproj_path options
20
- options
30
+ validate_xcodeproj_path options
21
31
  end
22
32
 
23
33
  def validate_keys_from_setup_options(options)
@@ -50,14 +60,20 @@ module BranchIOCLI
50
60
  # 1. Look for options.xcodeproj.
51
61
  # 2. If not specified, look for projects under . (excluding anything in Pods or Carthage folder).
52
62
  # 3. If none or more than one found, prompt the user.
53
- def xcodeproj_path(options)
63
+ def validate_xcodeproj_path(options)
54
64
  if options.xcodeproj
55
65
  path = options.xcodeproj
56
66
  else
57
67
  all_xcodeproj_paths = Dir[File.expand_path(File.join(".", "**/*.xcodeproj"))]
58
68
  # find an xcodeproj (ignoring the Pods and Carthage folders)
59
69
  # TODO: Improve this filter
60
- xcodeproj_paths = all_xcodeproj_paths.reject { |p| p =~ /Pods|Carthage/ }
70
+ xcodeproj_paths = all_xcodeproj_paths.select do |p|
71
+ valid = true
72
+ Pathname.new(p).each_filename do |f|
73
+ valid = false && break if f == "Carthage" || f == "Pods"
74
+ end
75
+ valid
76
+ end
61
77
 
62
78
  path = xcodeproj_paths.first if xcodeproj_paths.count == 1
63
79
  end
@@ -67,9 +83,11 @@ module BranchIOCLI
67
83
  # TODO: Allow the user to choose if xcodeproj_paths.count > 0
68
84
  begin
69
85
  @xcodeproj = Xcodeproj::Project.open path
70
- return path
86
+ @xcodeproj_path = path
87
+ return
71
88
  rescue StandardError => e
72
89
  say e.message
90
+ path = nil
73
91
  end
74
92
  end
75
93
  end
@@ -96,6 +114,244 @@ module BranchIOCLI
96
114
  end
97
115
  domains
98
116
  end
117
+
118
+ def validate_buildfile_path(options, filename)
119
+ # Disable Podfile/Cartfile update if --no_add_sdk is present
120
+ return if options.no_add_sdk
121
+
122
+ buildfile_path = filename == "Podfile" ? options.podfile : options.cartfile
123
+
124
+ # Was --podfile/--cartfile used?
125
+ if buildfile_path
126
+ # Yes: Validate. Prompt if not valid.
127
+ loop do
128
+ valid = buildfile_path =~ %r{/?#{filename}$}
129
+ say "#{filename} path must end in /#{filename}." unless valid
130
+
131
+ if valid
132
+ valid = File.exist? buildfile_path
133
+ say "#{buildfile_path} not found." unless valid
134
+ end
135
+
136
+ if valid
137
+ if filename == "Podfile"
138
+ @podfile_path = buildfile_path
139
+ else
140
+ @cartfile_path = buildfile_path
141
+ end
142
+ return
143
+ end
144
+
145
+ buildfile_path = ask "Please enter the path to your #{filename}: "
146
+ end
147
+ end
148
+
149
+ # No: Check for Podfile/Cartfile next to @xcodeproj_path
150
+ buildfile_path = File.expand_path "../#{filename}", @xcodeproj_path
151
+ return unless File.exist? buildfile_path
152
+
153
+ # Exists: Use it (valid if found)
154
+ if filename == "Podfile"
155
+ @podfile_path = buildfile_path
156
+ else
157
+ @cartfile_path = buildfile_path
158
+ end
159
+ end
160
+
161
+ def validate_sdk_addition(options)
162
+ return if options.no_add_sdk || @podfile_path || @cartfile_path
163
+
164
+ # If no CocoaPods or Carthage, check to see if the framework is linked.
165
+ target = BranchHelper.target_from_project @xcodeproj, options.target
166
+ return if target.frameworks_build_phase.files.map(&:file_ref).map(&:path).any? { |p| p =~ %r{/Branch.framework$} }
167
+
168
+ # --podfile, --cartfile not specified. No Podfile found. No Cartfile found. No Branch.framework in project.
169
+ # Prompt the user:
170
+ selected = choose do |menu|
171
+ menu.header = "No Podfile or Cartfile specified or found. Here are your options"
172
+
173
+ SDK_OPTIONS.each_key { |k| menu.choice k }
174
+
175
+ menu.prompt = "What would you like to do?"
176
+ end
177
+
178
+ option = SDK_OPTIONS[selected]
179
+
180
+ case option
181
+ when :skip
182
+ return
183
+ else
184
+ send "add_#{option}", options
185
+ end
186
+ end
187
+
188
+ def add_cocoapods(options)
189
+ @podfile_path = File.expand_path "../Podfile", @xcodeproj_path
190
+ target = BranchHelper.target_from_project @xcodeproj, options.target
191
+
192
+ File.open(@podfile_path, "w") do |file|
193
+ file.write <<EOF
194
+ platform :ios, "#{target.deployment_target}"
195
+
196
+ pod "Branch"
197
+
198
+ #{@xcodeproj.targets.map { |t| "target \"#{t.name}\"" }.join("\n")}
199
+ EOF
200
+ end
201
+
202
+ command = "pod install"
203
+ command += " --repo-update" unless options.no_pod_repo_update
204
+ Dir.chdir(File.dirname(@podfile_path)) do
205
+ system command
206
+ end
207
+
208
+ BranchHelper.add_change @podfile_path
209
+ BranchHelper.add_change "#{@podfile_path}.lock"
210
+
211
+ # For now, add Pods folder to SCM.
212
+ current_pathname = Pathname.new File.expand_path "."
213
+ pods_folder_path = Pathname.new(File.expand_path("../Pods", podfile_path)).relative_path_from current_pathname
214
+ workspace_path = Pathname.new(File.expand_path(@xcodeproj_path.sub(/.xcodeproj$/, ".xcworkspace"))).relative_path_from current_pathname
215
+ podfile_pathname = Pathname.new(@podfile_path).relative_path_from current_pathname
216
+ BranchHelper.add_change pods_folder_path
217
+ BranchHelper.add_change workspace_path
218
+ `git add #{podfile_pathname} #{podfile_pathname}.lock #{pods_folder_path} #{workspace_path}` if options.commit
219
+ end
220
+
221
+ def add_carthage(options)
222
+ # TODO: Collapse this and Command::update_cartfile
223
+
224
+ # 1. Generate Cartfile
225
+ @cartfile_path = File.expand_path "../Cartfile", @xcodeproj_path
226
+ File.open(@cartfile_path, "w") do |file|
227
+ file.write <<EOF
228
+ github "BranchMetrics/ios-branch-deep-linking"
229
+ EOF
230
+ end
231
+
232
+ # 2. carthage update
233
+ Dir.chdir(File.dirname(@cartfile_path)) do
234
+ system "carthage update --platform ios"
235
+ end
236
+
237
+ # 3. Add Cartfile and Cartfile.resolved to commit (in case :commit param specified)
238
+ BranchHelper.add_change cartfile_path
239
+ BranchHelper.add_change "#{cartfile_path}.resolved"
240
+
241
+ # 4. Add to target depependencies
242
+ frameworks_group = @xcodeproj.frameworks_group
243
+ branch_framework = frameworks_group.new_file "Carthage/Build/iOS/Branch.framework"
244
+ target = BranchHelper.target_from_project @xcodeproj, options.target
245
+ target.frameworks_build_phase.add_file_reference branch_framework
246
+
247
+ # 5. Create a copy-frameworks build phase
248
+ carthage_build_phase = target.new_shell_script_build_phase "carthage copy-frameworks"
249
+ carthage_build_phase.shell_script = "/usr/local/bin/carthage copy-frameworks"
250
+
251
+ carthage_build_phase.input_paths << "$(SRCROOT)/Carthage/Build/iOS/Branch.framework"
252
+ carthage_build_phase.output_paths << "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Branch.framework"
253
+
254
+ @xcodeproj.save
255
+
256
+ # For now, add Carthage folder to SCM
257
+
258
+ # 6. Add the Carthage folder to the commit (in case :commit param specified)
259
+ current_pathname = Pathname.new File.expand_path "."
260
+ carthage_folder_path = Pathname.new(File.expand_path("../Carthage", cartfile_path)).relative_path_from(current_pathname)
261
+ cartfile_pathname = Pathname.new(@cartfile_path).relative_path_from current_pathname
262
+ BranchHelper.add_change carthage_folder_path
263
+ `git add #{cartfile_pathname} #{cartfile_pathname}.resolved #{carthage_folder_path}` if options.commit
264
+ end
265
+
266
+ def add_direct(options)
267
+ # TODO: Put these intermediates in a temp directory until Branch.framework is unzipped
268
+ # (and validated?). For now dumped in the current directory.
269
+ File.unlink "Branch.framework.zip" if File.exist? "Branch.framework.zip"
270
+ remove_directory "Branch.framework"
271
+
272
+ say "Finding current framework release..."
273
+
274
+ # Find the latest release from GitHub.
275
+ releases = JSON.parse fetch "https://api.github.com/repos/BranchMetrics/ios-branch-deep-linking/releases"
276
+ current_release = releases.first
277
+ # Get the download URL for the framework.
278
+ framework_asset = current_release["assets"][0]
279
+ framework_url = framework_asset["browser_download_url"]
280
+
281
+ say "Downloading Branch.framework v. #{current_release['tag_name']} (#{framework_asset['size']} bytes zipped)..."
282
+
283
+ # Download the framework zip
284
+ File.open("Branch.framework.zip", "w") do |file|
285
+ file.write fetch framework_url
286
+ end
287
+
288
+ say "Unzipping Branch.framework..."
289
+
290
+ # Unzip
291
+ Zip::File.open "Branch.framework.zip" do |zip_file|
292
+ # Start with just the framework and add dSYM, etc., later
293
+ zip_file.glob "Carthage/Build/iOS/Branch.framework/**/*" do |entry|
294
+ filename = entry.name.sub %r{^Carthage/Build/iOS/}, ""
295
+ ensure_directory File.dirname filename
296
+ entry.extract filename
297
+ end
298
+ end
299
+
300
+ # Remove intermediate zip file
301
+ File.unlink "Branch.framework.zip"
302
+
303
+ # Now the current framework is in ./Branch.framework
304
+
305
+ say "Adding to #{@xcodeproj_path}..."
306
+
307
+ # Add as a dependency in the Frameworks group
308
+ frameworks_group = @xcodeproj.frameworks_group
309
+ framework = frameworks_group.new_file "Branch.framework"
310
+ target = BranchHelper.target_from_project @xcodeproj, options.target
311
+ target.frameworks_build_phase.add_file_reference framework, true
312
+ @xcodeproj.save
313
+
314
+ BranchHelper.add_change File.expand_path "Branch.framework"
315
+ `git add Branch.framework` if options.commit
316
+
317
+ say "Done. ✅"
318
+ end
319
+
320
+ def fetch(url)
321
+ response = Net::HTTP.get_response URI(url)
322
+
323
+ case response
324
+ when Net::HTTPRedirection
325
+ fetch response['location']
326
+ else
327
+ response.body
328
+ end
329
+ end
330
+
331
+ def ensure_directory(path)
332
+ return if path == "/" || path == "."
333
+ parent = File.dirname path
334
+ ensure_directory parent
335
+ return if Dir.exist? path
336
+ Dir.mkdir path
337
+ end
338
+
339
+ def remove_directory(path)
340
+ return unless File.exist? path
341
+
342
+ Dir["#{path}/*"].each do |file|
343
+ remove_directory(file) and next if File.directory?(file)
344
+ File.unlink file
345
+ end
346
+ end
347
+
348
+ SDK_OPTIONS =
349
+ {
350
+ "Set this project up to use CocoaPods and add the Branch SDK." => :cocoapods,
351
+ "Set this project up to use Carthage and add the Branch SDK." => :carthage,
352
+ "Add Branch.framework directly to the project's dependencies." => :direct,
353
+ "Skip adding the framework to the project." => :skip
354
+ }
99
355
  end
100
356
  end
101
357
  end
@@ -1,3 +1,3 @@
1
1
  module BranchIOCLI
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  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.2.2
4
+ version: 0.3.0
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-16 00:00:00.000000000 Z
12
+ date: 2017-10-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: commander
@@ -53,6 +53,20 @@ dependencies:
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rubyzip
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
56
70
  - !ruby/object:Gem::Dependency
57
71
  name: xcodeproj
58
72
  requirement: !ruby/object:Gem::Requirement
@@ -81,6 +95,20 @@ dependencies:
81
95
  - - ">="
82
96
  - !ruby/object:Gem::Version
83
97
  version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: cocoapods
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
84
112
  - !ruby/object:Gem::Dependency
85
113
  name: pry
86
114
  requirement: !ruby/object:Gem::Requirement
@@ -155,16 +183,16 @@ dependencies:
155
183
  name: rubocop
156
184
  requirement: !ruby/object:Gem::Requirement
157
185
  requirements:
158
- - - ">="
186
+ - - "~>"
159
187
  - !ruby/object:Gem::Version
160
- version: '0'
188
+ version: 0.50.0
161
189
  type: :development
162
190
  prerelease: false
163
191
  version_requirements: !ruby/object:Gem::Requirement
164
192
  requirements:
165
- - - ">="
193
+ - - "~>"
166
194
  - !ruby/object:Gem::Version
167
- version: '0'
195
+ version: 0.50.0
168
196
  - !ruby/object:Gem::Dependency
169
197
  name: simplecov
170
198
  requirement: !ruby/object:Gem::Requirement