fastlane 0.0.1 → 0.1.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.
@@ -0,0 +1,39 @@
1
+ module Fastlane
2
+ # Guides the new user through creating a new action
3
+ module NewAction
4
+ def self.run
5
+ name = self.fetch_name
6
+ self.generate_action(name)
7
+ end
8
+
9
+ def self.fetch_name
10
+ puts "Must be lower case, and use a'_' between words. Do not use a '.'".green
11
+ puts "examples: 'testflight', 'upload_to_s3'".green
12
+ name = ask("Name of your action: ")
13
+ while not name_valid?name
14
+ puts "Name invalid!"
15
+ name = ask("Name of your action: ")
16
+ end
17
+ name
18
+ end
19
+
20
+ def self.generate_action(name)
21
+ template = File.read("#{Helper.gem_path}/lib/assets/custom_action_template.rb")
22
+ template.gsub!('[[NAME]]', name)
23
+ template.gsub!('[[NAME_UP]]', name.upcase)
24
+ template.gsub!('[[NAME_CLASS]]', name.classify + "Action")
25
+
26
+ actions_path = File.join(FastlaneFolder.path, "actions")
27
+ FileUtils.mkdir_p(actions_path) unless File.directory?actions_path
28
+
29
+ path = File.join(actions_path, "#{name}.rb")
30
+ File.write(path, template)
31
+ Helper.log.info "Created new action file '#{path}'. Edit it to implement your custom action.".green
32
+ end
33
+
34
+ private
35
+ def self.name_valid?(name)
36
+ name == name.downcase and name.length > 0 and not name.include?"."
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,58 @@
1
+ module Fastlane
2
+ class Runner
3
+
4
+ def execute(key)
5
+ key = key.to_sym
6
+ Helper.log.info "Driving the lane '#{key}'".green
7
+ Actions.lane_context[Actions::SharedValues::LANE_NAME] = key
8
+
9
+ return_val = nil
10
+
11
+ Dir.chdir(Fastlane::FastlaneFolder.path || Dir.pwd) do # the file is located in the fastlane folder
12
+ @before_all.call if @before_all
13
+
14
+ return_val = nil
15
+
16
+ if blocks[key]
17
+ return_val = blocks[key].call
18
+ else
19
+ raise "Could not find lane for type '#{key}'. Available lanes: #{available_lanes.join(', ')}".red
20
+ end
21
+
22
+ @after_all.call(key) if @after_all # this is only called if no exception was raised before
23
+ end
24
+
25
+ return return_val
26
+ rescue => ex
27
+ @error.call(key, ex) if @error # notify the block
28
+ raise ex
29
+ end
30
+
31
+ def available_lanes
32
+ blocks.keys
33
+ end
34
+
35
+ # Called internally
36
+ def set_before_all(block)
37
+ @before_all = block
38
+ end
39
+
40
+ def set_after_all(block)
41
+ @after_all = block
42
+ end
43
+
44
+ def set_error(block)
45
+ @error = block
46
+ end
47
+
48
+ def set_block(key, block)
49
+ raise "Lane '#{key}' was defined multiple times!".red if blocks[key]
50
+ blocks[key] = block
51
+ end
52
+
53
+ private
54
+ def blocks
55
+ @blocks ||= {}
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,157 @@
1
+ module Fastlane
2
+ class Setup
3
+ def run
4
+ raise "Fastlane already set up at path #{folder}".yellow if FastlaneFolder.setup?
5
+
6
+ show_infos
7
+ response = agree("Do you want to get started? This will move your Deliverfile and Snapfile (if they exist) (y/n)".yellow, true)
8
+
9
+ if response
10
+ response = agree("Do you have everything commited in version control? If not please do so! (y/n)".yellow, true)
11
+ if response
12
+ begin
13
+ FastlaneFolder.create_folder!
14
+ copy_existing_files
15
+ generate_app_metadata
16
+ detect_installed_tools # after copying the existing files
17
+ ask_to_enable_other_tools
18
+ FileUtils.mkdir(File.join(folder, "actions"))
19
+ generate_fastfile
20
+ Helper.log.info "Successfully finished setting up fastlane".green
21
+ rescue Exception => ex # this will also be caused by Ctrl + C
22
+ # Something went wrong with the setup, clear the folder again
23
+ # and restore previous files
24
+ Helper.log.fatal "Error occured with the setup program! Reverting changes now!".red
25
+ restore_previous_state
26
+ raise ex
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def show_infos
33
+ Helper.log.info "This setup will help you get up and running in no time.".green
34
+ Helper.log.info "First, it will move the config files from `deliver` and `snapshot`".green
35
+ Helper.log.info "into the subfolder `fastlane`.\n".green
36
+ Helper.log.info "Fastlane will check what tools you're already using and set up".green
37
+ Helper.log.info "the tool automatically for you. Have fun! ".green
38
+ end
39
+
40
+ def files_to_copy
41
+ ['Deliverfile', 'Snapfile', 'deliver', 'snapshot.js', 'SnapshotHelper.js', 'screenshots']
42
+ end
43
+
44
+ def copy_existing_files
45
+ files_to_copy.each do |current|
46
+ if File.exists?current
47
+ file_name = File.basename(current)
48
+ to_path = File.join(folder, file_name)
49
+ Helper.log.info "Moving '#{current}' to '#{to_path}'".green
50
+ FileUtils.mv(current, to_path)
51
+ end
52
+ end
53
+ end
54
+
55
+ def generate_app_metadata
56
+ Helper.log.info "------------------------------"
57
+ Helper.log.info "To not re-enter your username and app identifier every time you run one of the fastlane tools or fastlane, these will be stored from now on.".green
58
+ app_identifier = ask("App Identifier (com.krausefx.app): ".yellow)
59
+ apple_id = ask("Your Apple ID: ".yellow)
60
+ template = File.read("#{Helper.gem_path}/lib/assets/AppfileTemplate")
61
+ template.gsub!('[[APP_IDENTIFIER]]', app_identifier)
62
+ template.gsub!('[[APPLE_ID]]', apple_id)
63
+ path = File.join(folder, "Appfile")
64
+ File.write(path, template)
65
+ Helper.log.info "Created new file '#{path}'. Edit it to manage your preferred app metadata information.".green
66
+ end
67
+
68
+ def detect_installed_tools
69
+ @tools = {}
70
+ @tools[:deliver] = File.exists?(File.join(folder, 'Deliverfile'))
71
+ @tools[:snapshot] = File.exists?(File.join(folder, 'Snapfile'))
72
+ @tools[:xctool] = File.exists?('./.xctool-args')
73
+ @tools[:cocoapods] = File.exists?('./Podfile')
74
+ @tools[:sigh] = false
75
+ end
76
+
77
+ def ask_to_enable_other_tools
78
+ unless @tools[:deliver]
79
+ if agree("Do you want to setup 'deliver', which is used to upload app screenshots, app metadata and app updates to the App Store or Apple TestFlight? (y/n)".yellow, true)
80
+ Helper.log.info "Loading up 'deliver', this might take a few seconds"
81
+ require 'deliver'
82
+ Deliver::DeliverfileCreator.create(folder)
83
+ @tools[:deliver] = true
84
+ end
85
+ else
86
+ # deliver already enabled
87
+ Helper.log.info "-------------------------------------------------------------------------------------------"
88
+ Helper.log.info "Since all files are moved into the `fastlane` subfolder, you have to adapt your Deliverfile".yellow
89
+ Helper.log.info "Update your `ipa` and `beta_ipa` block of your Deliverfile to go a folder up before building".yellow
90
+ Helper.log.info "e.g. `system('cd ..; ipa build')`".yellow
91
+ Helper.log.info "Please read the above carefully and click Enter to confirm.".green
92
+ STDIN.gets
93
+ end
94
+
95
+ unless @tools[:snapshot]
96
+ if agree("Do you want to setup 'snapshot', which will help you to automatically take screenshots of your iOS app in all languages/devices? (y/n)".yellow, true)
97
+ Helper.log.info "Loading up 'snapshot', this might take a few seconds"
98
+
99
+ require 'snapshot' # we need both requires
100
+ require 'snapshot/snapfile_creator'
101
+ Snapshot::SnapfileCreator.create(folder)
102
+ @tools[:snapshot] = true
103
+ end
104
+ end
105
+
106
+ if @tools[:snapshot] and @tools[:deliver]
107
+ # Deliver is already installed
108
+ Helper.log.info "The 'screenshots' folder inside the 'deliver' folder will not be used.".yellow
109
+ Helper.log.info "Instead the 'screenshots' folder inside the 'fastlane' folder will be used.".yellow
110
+ Helper.log.info "Click Enter to confirm".green
111
+ STDIN.gets
112
+ end
113
+
114
+ if agree("Do you want to use 'sigh', which will maintain and download the provisioning profile for your app? (y/n)".yellow, true)
115
+ @tools[:sigh] = true
116
+ end
117
+ end
118
+
119
+ def generate_fastfile
120
+ template = File.read("#{Helper.gem_path}/lib/assets/FastfileTemplate")
121
+
122
+ template.gsub!('deliver', '# deliver') unless @tools[:deliver]
123
+ template.gsub!('snapshot', '# snapshot') unless @tools[:snapshot]
124
+ template.gsub!('sigh', '# sigh') unless @tools[:sigh]
125
+ template.gsub!('xctool', '# xctool') unless @tools[:xctool]
126
+ template.gsub!('cocoapods', '# cocoapods') unless @tools[:cocoapods]
127
+
128
+ @tools.each do |key, value|
129
+ Helper.log.info "'#{key}' enabled.".magenta if value
130
+ Helper.log.info "'#{key}' not enabled.".yellow unless value
131
+ end
132
+
133
+ path = File.join(folder, "Fastfile")
134
+ File.write(path, template)
135
+ Helper.log.info "Created new file '#{path}'. Edit it to manage your own deployment lanes.".green
136
+ end
137
+
138
+ def folder
139
+ FastlaneFolder.path
140
+ end
141
+
142
+ def restore_previous_state
143
+ # Move all moved files back
144
+ files_to_copy.each do |current|
145
+ from_path = File.join(folder, current)
146
+ to_path = File.basename(current)
147
+ if File.exists?from_path
148
+ Helper.log.info "Moving '#{from_path}' to '#{to_path}'".yellow
149
+ FileUtils.mv(from_path, to_path)
150
+ end
151
+ end
152
+
153
+ Helper.log.info "Deleting the 'fastlane' folder".yellow
154
+ FileUtils.rm_rf(folder)
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,44 @@
1
+ require 'open-uri'
2
+
3
+ module Fastlane
4
+ # Verifies, the user runs the latest version of this gem
5
+ class UpdateChecker
6
+ # This method will check if the latest version is installed and show a warning if that's not the case
7
+ def self.verify_latest_version
8
+ if self.update_available?
9
+ v = fetch_latest
10
+ puts '#######################################################################'.green
11
+ puts "# fastlane #{v} is available.".green
12
+ puts "# It is recommended to use the latest version.".green
13
+ puts "# Update using '(sudo) gem update fastlane'.".green
14
+ puts "# To see what's new, open https://github.com/KrauseFx/fastlane/releases.".green
15
+ puts '#######################################################################'.green
16
+ return true
17
+ end
18
+ false
19
+ end
20
+
21
+ # Is a new official release available (this does not include pre-releases)
22
+ def self.update_available?
23
+ begin
24
+ latest = fetch_latest
25
+ if latest and Gem::Version.new(latest) > Gem::Version.new(current_version)
26
+ return true
27
+ end
28
+ rescue => ex
29
+ Helper.log.error("Could not check if 'fastlane' is up to date.")
30
+ end
31
+ return false
32
+ end
33
+
34
+ # The currently used version of this gem
35
+ def self.current_version
36
+ Fastlane::VERSION
37
+ end
38
+
39
+ private
40
+ def self.fetch_latest
41
+ JSON.parse(open("http://rubygems.org/api/v1/gems/fastlane.json").read)["version"]
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,3 @@
1
+ module Fastlane
2
+ VERSION = "0.1.0"
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-01 00:00:00.000000000 Z
11
+ date: 2015-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: security
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ~>
32
- - !ruby/object:Gem::Version
33
- version: 0.1.3
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ~>
39
- - !ruby/object:Gem::Version
40
- version: 0.1.3
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: highline
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +67,35 @@ dependencies:
81
67
  - !ruby/object:Gem::Version
82
68
  version: 4.2.0
83
69
  - !ruby/object:Gem::Dependency
84
- name: deliver
70
+ name: nokogiri
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 1.6.5
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 1.6.5
83
+ - !ruby/object:Gem::Dependency
84
+ name: shenzhen
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 0.10.3
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 0.10.3
97
+ - !ruby/object:Gem::Dependency
98
+ name: credentials_manager
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - '>='
@@ -95,33 +109,75 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: capybara
112
+ name: deliver
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ~>
115
+ - - '>='
102
116
  - !ruby/object:Gem::Version
103
- version: 2.4.3
117
+ version: 0.5.0
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ~>
122
+ - - '>='
109
123
  - !ruby/object:Gem::Version
110
- version: 2.4.3
124
+ version: 0.5.0
111
125
  - !ruby/object:Gem::Dependency
112
- name: poltergeist
126
+ name: snapshot
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - ~>
129
+ - - '>='
116
130
  - !ruby/object:Gem::Version
117
- version: 1.5.1
131
+ version: 0.4.0
118
132
  type: :runtime
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - ~>
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: 0.4.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: frameit
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: 0.2.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: 0.2.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: pem
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: 0.3.0
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: 0.3.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: sigh
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.2.0
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
123
179
  - !ruby/object:Gem::Version
124
- version: 1.5.1
180
+ version: 0.2.0
125
181
  - !ruby/object:Gem::Dependency
126
182
  name: bundler
127
183
  requirement: !ruby/object:Gem::Requirement
@@ -220,14 +276,46 @@ dependencies:
220
276
  - - '>='
221
277
  - !ruby/object:Gem::Version
222
278
  version: '0'
223
- description: To be announced
279
+ description: Connect all iOS deployment tools into one streamlined workflow
224
280
  email:
225
- - krausefx@gmail.com
226
- executables: []
281
+ - fastlane@krausefx.com
282
+ executables:
283
+ - fastlane
227
284
  extensions: []
228
285
  extra_rdoc_files: []
229
- files: []
230
- homepage: http://felixkrause.at
286
+ files:
287
+ - LICENSE
288
+ - README.md
289
+ - bin/fastlane
290
+ - lib/assets/AppfileTemplate
291
+ - lib/assets/FastfileTemplate
292
+ - lib/assets/custom_action_template.rb
293
+ - lib/fastlane.rb
294
+ - lib/fastlane/actions/README
295
+ - lib/fastlane/actions/actions_helper.rb
296
+ - lib/fastlane/actions/deliver.rb
297
+ - lib/fastlane/actions/frameit.rb
298
+ - lib/fastlane/actions/hockey.rb
299
+ - lib/fastlane/actions/increment_build_number.rb
300
+ - lib/fastlane/actions/install_cocapods.rb
301
+ - lib/fastlane/actions/say.rb
302
+ - lib/fastlane/actions/sigh.rb
303
+ - lib/fastlane/actions/slack.rb
304
+ - lib/fastlane/actions/snapshot.rb
305
+ - lib/fastlane/actions/testmunk.rb
306
+ - lib/fastlane/actions/xctool.rb
307
+ - lib/fastlane/dependency_checker.rb
308
+ - lib/fastlane/fast_file.rb
309
+ - lib/fastlane/fastlane_folder.rb
310
+ - lib/fastlane/helper.rb
311
+ - lib/fastlane/junit_generator.rb
312
+ - lib/fastlane/lane_manager.rb
313
+ - lib/fastlane/new_action.rb
314
+ - lib/fastlane/runner.rb
315
+ - lib/fastlane/setup.rb
316
+ - lib/fastlane/update_checker.rb
317
+ - lib/fastlane/version.rb
318
+ homepage: https://fastlane.tools
231
319
  licenses:
232
320
  - MIT
233
321
  metadata: {}
@@ -250,6 +338,6 @@ rubyforge_project:
250
338
  rubygems_version: 2.2.2
251
339
  signing_key:
252
340
  specification_version: 4
253
- summary: To be announced
341
+ summary: Connect all iOS deployment tools into one streamlined workflow
254
342
  test_files: []
255
343
  has_rdoc: