fastlane 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: