yk_command 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.idea/vcs.xml +2 -0
- data/.idea/yk_command.iml +6 -6
- data/Gemfile.lock +3 -3
- data/lib/yk_command/analyze/analyze.rb +4 -0
- data/lib/yk_command/bot/wx_bot.rb +0 -10
- data/lib/yk_command/module/module_handler.rb +119 -0
- data/lib/yk_command/module/template/objc/CategoryHeader.h +1 -1
- data/lib/yk_command/module/template/objc/RouterRegister.m +6 -5
- data/lib/yk_command/module/template/objc/ServiceRegister.m +1 -1
- data/lib/yk_command/module/yk_module.rb +138 -144
- data/lib/yk_command/project/YKProjectTemplate/.gitignore +37 -0
- data/lib/yk_command/project/YKProjectTemplate/CODE_OF_CONDUCT.md +40 -0
- data/lib/yk_command/project/YKProjectTemplate/LICENSE +21 -0
- data/lib/yk_command/project/YKProjectTemplate/NAME-osx.podspec +43 -0
- data/lib/yk_command/project/YKProjectTemplate/NAME.podspec +27 -0
- data/lib/yk_command/project/YKProjectTemplate/POD_LICENSE +19 -0
- data/lib/yk_command/project/YKProjectTemplate/POD_README.md +29 -0
- data/lib/yk_command/project/YKProjectTemplate/Pod/Assets/.gitkeep +0 -0
- data/lib/yk_command/project/YKProjectTemplate/Pod/Classes/.gitkeep +0 -0
- data/lib/yk_command/project/YKProjectTemplate/README.md +22 -0
- data/lib/yk_command/project/YKProjectTemplate/configure +12 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/Base.lproj/LaunchScreen.storyboard +31 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/Base.lproj/Main.storyboard +79 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/CPDAppDelegate.h +15 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/CPDAppDelegate.m +46 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/CPDViewController.h +13 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/CPDViewController.m +60 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/Images.xcassets/AppIcon.appiconset/Contents.json +98 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/PROJECT-Info.plist +49 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/PROJECT-Prefix.pch +16 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/en.lproj/InfoPlist.strings +2 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT/main.m +17 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT.xcodeproj/project.pbxproj +500 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/PROJECT.xcodeproj/xcshareddata/xcschemes/PROJECT.xcscheme +101 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/Podfile +19 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/Tests/Tests-Info.plist +22 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/Tests/Tests-Prefix.pch +7 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/Tests/Tests.m +9 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/ios/Example/Tests/en.lproj/InfoPlist.strings +2 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/PROJECT/AppDelegate.swift +26 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/PROJECT/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/PROJECT/Base.lproj/Main.storyboard +717 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/PROJECT/Info.plist +30 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/PROJECT/PROJECT.entitlements +10 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/PROJECT/ViewController.swift +27 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/PROJECT.xcodeproj/project.pbxproj +444 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/PROJECT.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/PROJECT.xcodeproj/xcshareddata/xcschemes/PROJECT.xcscheme +103 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/Podfile +11 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/Tests/Info.plist +22 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/macos-swift/Example/Tests/Tests.swift +1 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/PROJECT/AppDelegate.swift +46 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/PROJECT/Base.lproj/LaunchScreen.xib +46 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/PROJECT/Base.lproj/Main.storyboard +86 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/PROJECT/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/PROJECT/Info.plist +39 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/PROJECT/ViewController.swift +37 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/PROJECT.xcodeproj/project.pbxproj +468 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/PROJECT.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/PROJECT.xcodeproj/xcshareddata/xcschemes/PROJECT.xcscheme +117 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/Podfile +20 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/Tests/Info.plist +24 -0
- data/lib/yk_command/project/YKProjectTemplate/templates/swift/Example/Tests/Tests.swift +1 -0
- data/lib/yk_command/project/setup/ConfigureMacOSSwift.rb +46 -0
- data/lib/yk_command/project/setup/ConfigureSwift.rb +40 -0
- data/lib/yk_command/project/setup/ConfigureiOS.rb +107 -0
- data/lib/yk_command/project/setup/MessageBank.rb +113 -0
- data/lib/yk_command/project/setup/ProjectManipulator.rb +141 -0
- data/lib/yk_command/project/setup/TemplateConfigurator.rb +253 -0
- data/lib/yk_command/project/test_examples/kiwi.m +36 -0
- data/lib/yk_command/project/test_examples/quick.swift +50 -0
- data/lib/yk_command/project/test_examples/specta.m +39 -0
- data/lib/yk_command/project/test_examples/xctest.m +26 -0
- data/lib/yk_command/project/test_examples/xctest.swift +28 -0
- data/lib/yk_command/project/yk_project.rb +86 -0
- data/lib/yk_command/version.rb +1 -1
- data/yk_command.gemspec +2 -1
- metadata +76 -11
- data/.YKModuleFilesConfig.yml +0 -5
- data//345/275/222/346/241/243.zip +0 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
module Pod
|
2
|
+
|
3
|
+
class ConfigureSwift
|
4
|
+
attr_reader :configurator
|
5
|
+
|
6
|
+
def self.perform(options)
|
7
|
+
new(options).perform
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(options)
|
12
|
+
@configurator = options.fetch(:configurator)
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform
|
16
|
+
# keep_demo = configurator.ask_with_answers("Would you like to include a demo application with your library", ["Yes", "No"]).to_sym
|
17
|
+
|
18
|
+
keep_demo = :yes
|
19
|
+
|
20
|
+
Pod::ProjectManipulator.new({
|
21
|
+
:configurator => @configurator,
|
22
|
+
# :xcodeproj_path => "templates/swift/Example/PROJECT.xcodeproj",
|
23
|
+
:xcodeproj_path => "#{$current_dir}/templates/swift/Example/PROJECT.xcodeproj",
|
24
|
+
:platform => :ios,
|
25
|
+
:remove_demo_project => (keep_demo == :no),
|
26
|
+
:prefix => @configurator.prefix
|
27
|
+
}).run
|
28
|
+
|
29
|
+
# There has to be a single file in the Classes dir
|
30
|
+
# or a framework won't be created
|
31
|
+
`touch #{$current_dir}/Pod/Classes/ReplaceMe.swift`
|
32
|
+
|
33
|
+
`mv #{$current_dir}/templates/swift/* #{$current_dir}`
|
34
|
+
|
35
|
+
# remove podspec for osx
|
36
|
+
`rm #{$current_dir}/NAME-osx.podspec`
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module Pod
|
2
|
+
|
3
|
+
class ConfigureIOS
|
4
|
+
attr_reader :configurator
|
5
|
+
|
6
|
+
def self.perform(options)
|
7
|
+
new(options).perform
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(options)
|
11
|
+
@configurator = options.fetch(:configurator)
|
12
|
+
$current_dir = @configurator.temp_path
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform
|
16
|
+
|
17
|
+
|
18
|
+
# keep_demo = configurator.ask_with_answers("Would you like to include a demo application with your library", ["Yes", "No"]).to_sym
|
19
|
+
keep_demo = :yes
|
20
|
+
# framework = configurator.ask_with_answers("Which testing frameworks will you use", ["Specta", "Kiwi", "None"]).to_sym
|
21
|
+
# case framework
|
22
|
+
# when :specta
|
23
|
+
# configurator.add_pod_to_podfile "Specta"
|
24
|
+
# configurator.add_pod_to_podfile "Expecta"
|
25
|
+
|
26
|
+
# configurator.add_line_to_pch "@import Specta;"
|
27
|
+
# configurator.add_line_to_pch "@import Expecta;"
|
28
|
+
|
29
|
+
# configurator.set_test_framework("specta", "m", "ios")
|
30
|
+
|
31
|
+
# when :kiwi
|
32
|
+
# configurator.add_pod_to_podfile "Kiwi"
|
33
|
+
# configurator.add_line_to_pch "@import Kiwi;"
|
34
|
+
# configurator.set_test_framework("kiwi", "m", "ios")
|
35
|
+
|
36
|
+
# when :none
|
37
|
+
# configurator.set_test_framework("xctest", "m", "ios")
|
38
|
+
# end
|
39
|
+
|
40
|
+
# snapshots = configurator.ask_with_answers("Would you like to do view based testing", ["Yes", "No"]).to_sym
|
41
|
+
# case snapshots
|
42
|
+
# when :yes
|
43
|
+
# configurator.add_pod_to_podfile "FBSnapshotTestCase"
|
44
|
+
# configurator.add_line_to_pch "@import FBSnapshotTestCase;"
|
45
|
+
|
46
|
+
# if keep_demo == :no
|
47
|
+
# puts " Putting demo application back in, you cannot do view tests without a host application."
|
48
|
+
# keep_demo = :yes
|
49
|
+
# end
|
50
|
+
|
51
|
+
# if framework == :specta
|
52
|
+
# configurator.add_pod_to_podfile "Expecta+Snapshots"
|
53
|
+
# configurator.add_line_to_pch "@import Expecta_Snapshots;"
|
54
|
+
# end
|
55
|
+
# end
|
56
|
+
|
57
|
+
# prefix = nil
|
58
|
+
prefix = ''
|
59
|
+
# loop do
|
60
|
+
# prefix = configurator.ask("What is your class prefix").upcase
|
61
|
+
|
62
|
+
# if prefix.include?(' ')
|
63
|
+
# puts 'Your class prefix cannot contain spaces.'.red
|
64
|
+
# else
|
65
|
+
# break
|
66
|
+
# end
|
67
|
+
# end
|
68
|
+
|
69
|
+
# Pod::ProjectManipulator.new({
|
70
|
+
# :configurator => @configurator,
|
71
|
+
# :xcodeproj_path => "templates/ios/Example/PROJECT.xcodeproj",
|
72
|
+
# :platform => :ios,
|
73
|
+
# :remove_demo_project => (keep_demo == :no),
|
74
|
+
# :prefix => prefix
|
75
|
+
# }).run
|
76
|
+
|
77
|
+
Pod::ProjectManipulator.new({
|
78
|
+
:configurator => @configurator,
|
79
|
+
# :xcodeproj_path => "templates/swift/Example/PROJECT.xcodeproj",
|
80
|
+
:xcodeproj_path => "#{$current_dir}/templates/ios/Example/PROJECT.xcodeproj",
|
81
|
+
:platform => :ios,
|
82
|
+
:remove_demo_project => (keep_demo == :no),
|
83
|
+
:prefix => @configurator.prefix
|
84
|
+
}).run
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
# There has to be a single file in the Classes dir
|
89
|
+
# or a framework won't be created, which is now default
|
90
|
+
# `touch Pod/Classes/ReplaceMe.m`
|
91
|
+
|
92
|
+
# `mv ./templates/ios/* ./`
|
93
|
+
|
94
|
+
# # remove podspec for osx
|
95
|
+
# `rm ./NAME-osx.podspec`
|
96
|
+
|
97
|
+
`touch #{$current_dir}/Pod/Classes/ReplaceMe.swift`
|
98
|
+
|
99
|
+
`mv #{$current_dir}/templates/ios/* #{$current_dir}`
|
100
|
+
|
101
|
+
# remove podspec for osx
|
102
|
+
`rm #{$current_dir}/NAME-osx.podspec`
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module Pod
|
2
|
+
class MessageBank
|
3
|
+
attr_reader :configurator
|
4
|
+
|
5
|
+
def initialize(config)
|
6
|
+
@configurator = config
|
7
|
+
end
|
8
|
+
|
9
|
+
def show_prompt
|
10
|
+
print " > ".green
|
11
|
+
end
|
12
|
+
|
13
|
+
def yellow_bang
|
14
|
+
"! ".yellow
|
15
|
+
end
|
16
|
+
|
17
|
+
def green_bang
|
18
|
+
"! ".green
|
19
|
+
end
|
20
|
+
|
21
|
+
def red_bang
|
22
|
+
"! ".red
|
23
|
+
end
|
24
|
+
|
25
|
+
def run_command command, output_command=nil
|
26
|
+
output_command ||= command
|
27
|
+
|
28
|
+
puts " " + output_command.magenta
|
29
|
+
system command
|
30
|
+
end
|
31
|
+
|
32
|
+
def welcome_message
|
33
|
+
unless @configurator.validate_user_details
|
34
|
+
run_setup_questions
|
35
|
+
end
|
36
|
+
|
37
|
+
puts "\n------------------------------"
|
38
|
+
puts ""
|
39
|
+
puts "To get you started we need to ask a few questions, this should only take a minute."
|
40
|
+
puts ""
|
41
|
+
|
42
|
+
has_run_before = `defaults read org.cocoapods.pod-template HasRunBefore`.chomp == "1"
|
43
|
+
|
44
|
+
puts "If this is your first time we recommend running through with the guide: "
|
45
|
+
puts " - " + "https://guides.cocoapods.org/making/using-pod-lib-create.html".blue.underlined
|
46
|
+
|
47
|
+
if ENV["TERM_PROGRAM"] == "iTerm.app"
|
48
|
+
puts " ( hold cmd and click links to open in a browser. )".magenta
|
49
|
+
else
|
50
|
+
puts " ( hold cmd and double click links to open in a browser. )".magenta
|
51
|
+
end
|
52
|
+
|
53
|
+
unless has_run_before
|
54
|
+
puts "\n Press return to continue."
|
55
|
+
`defaults write org.cocoapods.pod-template HasRunBefore -bool true`
|
56
|
+
end
|
57
|
+
|
58
|
+
puts ""
|
59
|
+
end
|
60
|
+
|
61
|
+
def farewell_message
|
62
|
+
puts ""
|
63
|
+
|
64
|
+
puts " Ace! you're ready to go!"
|
65
|
+
puts " We will start you off by opening your project in Xcode"
|
66
|
+
pod_name = @configurator.pod_name
|
67
|
+
run_command "open '#{$current_dir}/Example/#{pod_name}.xcworkspace'", "open '#{$current_dir}/Example/#{pod_name}.xcworkspace'"
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def run_setup_questions
|
72
|
+
|
73
|
+
puts yellow_bang + "Before you can create a new library we need to setup your git credentials."
|
74
|
+
|
75
|
+
unless @configurator.user_name.length > 0
|
76
|
+
puts "\n What is your name? "
|
77
|
+
answer = ""
|
78
|
+
|
79
|
+
loop do
|
80
|
+
show_prompt
|
81
|
+
|
82
|
+
answer = gets.chomp
|
83
|
+
break if answer.length > 0
|
84
|
+
|
85
|
+
puts red_bang + "Please enter a name."
|
86
|
+
end
|
87
|
+
|
88
|
+
puts ""
|
89
|
+
puts green_bang + "Setting your name in git to " + answer
|
90
|
+
run_command('git config user.name "' + answer + '"')
|
91
|
+
end
|
92
|
+
|
93
|
+
unless @configurator.user_email.length > 0
|
94
|
+
puts "\n What is your email?"
|
95
|
+
answer = ""
|
96
|
+
|
97
|
+
loop do
|
98
|
+
show_prompt
|
99
|
+
answer = gets.downcase.chomp
|
100
|
+
break if answer.length > 0
|
101
|
+
|
102
|
+
puts red_bang + "Please enter a email."
|
103
|
+
end
|
104
|
+
|
105
|
+
puts ""
|
106
|
+
puts green_bang + "Setting your email in git to " + answer
|
107
|
+
run_command('git config user.email "' + answer + '"')
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'xcodeproj'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
|
5
|
+
class ProjectManipulator
|
6
|
+
attr_reader :configurator, :xcodeproj_path, :platform, :remove_demo_target, :string_replacements, :prefix
|
7
|
+
|
8
|
+
def self.perform(options)
|
9
|
+
new(options).perform
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(options)
|
13
|
+
@xcodeproj_path = options.fetch(:xcodeproj_path)
|
14
|
+
@configurator = options.fetch(:configurator)
|
15
|
+
@platform = options.fetch(:platform)
|
16
|
+
@remove_demo_target = options.fetch(:remove_demo_project)
|
17
|
+
@prefix = options.fetch(:prefix)
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
@string_replacements = {
|
22
|
+
"PROJECT_OWNER" => @configurator.user_name,
|
23
|
+
"TODAYS_DATE" => @configurator.date,
|
24
|
+
"TODAYS_YEAR" => @configurator.year,
|
25
|
+
"PROJECT" => @configurator.pod_name,
|
26
|
+
"CPD" => @prefix
|
27
|
+
}
|
28
|
+
replace_internal_project_settings
|
29
|
+
|
30
|
+
@project = Xcodeproj::Project.open(@xcodeproj_path)
|
31
|
+
add_podspec_metadata
|
32
|
+
remove_demo_project if @remove_demo_target
|
33
|
+
@project.save
|
34
|
+
|
35
|
+
rename_files
|
36
|
+
rename_project_folder
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_podspec_metadata
|
40
|
+
project_metadata_item = @project.root_object.main_group.children.select { |group| group.name == "Podspec Metadata" }.first
|
41
|
+
project_metadata_item.new_file "../" + @configurator.pod_name + ".podspec"
|
42
|
+
project_metadata_item.new_file "../README.md"
|
43
|
+
project_metadata_item.new_file "../LICENSE"
|
44
|
+
end
|
45
|
+
|
46
|
+
def remove_demo_project
|
47
|
+
app_project = @project.native_targets.find { |target| target.product_type == "com.apple.product-type.application" }
|
48
|
+
test_target = @project.native_targets.find { |target| target.product_type == "com.apple.product-type.bundle.unit-test" }
|
49
|
+
test_target.name = @configurator.pod_name + "_Tests"
|
50
|
+
|
51
|
+
# Remove the implicit dependency on the app
|
52
|
+
test_dependency = test_target.dependencies.first
|
53
|
+
test_dependency.remove_from_project
|
54
|
+
app_project.remove_from_project
|
55
|
+
|
56
|
+
# Remove the build target on the unit tests
|
57
|
+
test_target.build_configuration_list.build_configurations.each do |build_config|
|
58
|
+
build_config.build_settings.delete "BUNDLE_LOADER"
|
59
|
+
end
|
60
|
+
|
61
|
+
# Remove the references in xcode
|
62
|
+
project_app_group = @project.root_object.main_group.children.select { |group| group.display_name.end_with? @configurator.pod_name }.first
|
63
|
+
project_app_group.remove_from_project
|
64
|
+
|
65
|
+
# Remove the product reference
|
66
|
+
product = @project.products.select { |product| product.path == @configurator.pod_name + "_Example.app" }.first
|
67
|
+
product.remove_from_project
|
68
|
+
|
69
|
+
# Remove the actual folder + files for both projects
|
70
|
+
`rm -rf templates/ios/Example/PROJECT`
|
71
|
+
`rm -rf templates/swift/Example/PROJECT`
|
72
|
+
|
73
|
+
# Replace the Podfile with a simpler one with only one target
|
74
|
+
podfile_path = project_folder + "/Podfile"
|
75
|
+
podfile_text = <<-RUBY
|
76
|
+
use_frameworks!
|
77
|
+
target '#{test_target.name}' do
|
78
|
+
pod '#{@configurator.pod_name}', :path => '../'
|
79
|
+
|
80
|
+
${INCLUDED_PODS}
|
81
|
+
end
|
82
|
+
RUBY
|
83
|
+
File.open(podfile_path, "w") { |file| file.puts podfile_text }
|
84
|
+
end
|
85
|
+
|
86
|
+
def project_folder
|
87
|
+
File.dirname @xcodeproj_path
|
88
|
+
end
|
89
|
+
|
90
|
+
def rename_files
|
91
|
+
# shared schemes have project specific names
|
92
|
+
scheme_path = project_folder + "/PROJECT.xcodeproj/xcshareddata/xcschemes/"
|
93
|
+
File.rename(scheme_path + "PROJECT.xcscheme", scheme_path + @configurator.pod_name + "-Example.xcscheme")
|
94
|
+
|
95
|
+
# rename xcproject
|
96
|
+
File.rename(project_folder + "/PROJECT.xcodeproj", project_folder + "/" + @configurator.pod_name + ".xcodeproj")
|
97
|
+
|
98
|
+
unless @remove_demo_target
|
99
|
+
# change app file prefixes
|
100
|
+
["CPDAppDelegate.h", "CPDAppDelegate.m", "CPDViewController.h", "CPDViewController.m"].each do |file|
|
101
|
+
before = project_folder + "/PROJECT/" + file
|
102
|
+
next unless File.exists? before
|
103
|
+
|
104
|
+
after = project_folder + "/PROJECT/" + file.gsub("CPD", prefix)
|
105
|
+
File.rename before, after
|
106
|
+
end
|
107
|
+
|
108
|
+
# rename project related files
|
109
|
+
["PROJECT-Info.plist", "PROJECT-Prefix.pch", "PROJECT.entitlements"].each do |file|
|
110
|
+
before = project_folder + "/PROJECT/" + file
|
111
|
+
next unless File.exists? before
|
112
|
+
|
113
|
+
after = project_folder + "/PROJECT/" + file.gsub("PROJECT", @configurator.pod_name)
|
114
|
+
File.rename before, after
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
def rename_project_folder
|
121
|
+
if Dir.exist? project_folder + "/PROJECT"
|
122
|
+
File.rename(project_folder + "/PROJECT", project_folder + "/" + @configurator.pod_name)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def replace_internal_project_settings
|
127
|
+
Dir.glob(project_folder + "/**/**/**/**").each do |name|
|
128
|
+
next if Dir.exists? name
|
129
|
+
text = File.read(name)
|
130
|
+
|
131
|
+
for find, replace in @string_replacements
|
132
|
+
text = text.gsub(find, replace)
|
133
|
+
end
|
134
|
+
|
135
|
+
File.open(name, "w") { |file| file.puts text }
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
@@ -0,0 +1,253 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'colored2'
|
3
|
+
|
4
|
+
require_relative 'MessageBank'
|
5
|
+
require_relative 'ConfigureIOS'
|
6
|
+
require_relative 'ProjectManipulator'
|
7
|
+
|
8
|
+
module Pod
|
9
|
+
class TemplateConfigurator
|
10
|
+
|
11
|
+
attr_reader :pod_name, :pods_for_podfile, :prefix,:prefixes, :test_example_file, :username, :email,:temp_path
|
12
|
+
|
13
|
+
def initialize(pod_name,framework,prefix,author,temp_path)
|
14
|
+
@temp_path = temp_path
|
15
|
+
@pod_name = pod_name
|
16
|
+
@framework = framework
|
17
|
+
@prefix = prefix
|
18
|
+
@author = author
|
19
|
+
|
20
|
+
@pods_for_podfile = []
|
21
|
+
@prefixes = []
|
22
|
+
@message_bank = MessageBank.new(self)
|
23
|
+
end
|
24
|
+
|
25
|
+
def ask(question)
|
26
|
+
answer = ""
|
27
|
+
loop do
|
28
|
+
puts "\n#{question}?"
|
29
|
+
|
30
|
+
@message_bank.show_prompt
|
31
|
+
answer = gets.chomp
|
32
|
+
|
33
|
+
break if answer.length > 0
|
34
|
+
|
35
|
+
print "\nYou need to provide an answer."
|
36
|
+
end
|
37
|
+
answer
|
38
|
+
end
|
39
|
+
|
40
|
+
def ask_with_answers(question, possible_answers)
|
41
|
+
|
42
|
+
print "\n#{question}? ["
|
43
|
+
|
44
|
+
print_info = Proc.new {
|
45
|
+
|
46
|
+
possible_answers_string = possible_answers.each_with_index do |answer, i|
|
47
|
+
_answer = (i == 0) ? answer.underlined : answer
|
48
|
+
print " " + _answer
|
49
|
+
print(" /") if i != possible_answers.length-1
|
50
|
+
end
|
51
|
+
print " ]\n"
|
52
|
+
}
|
53
|
+
print_info.call
|
54
|
+
|
55
|
+
answer = ""
|
56
|
+
|
57
|
+
loop do
|
58
|
+
@message_bank.show_prompt
|
59
|
+
answer = STDIN.gets.downcase.chomp
|
60
|
+
|
61
|
+
answer = "yes" if answer == "y"
|
62
|
+
answer = "no" if answer == "n"
|
63
|
+
|
64
|
+
# default to first answer
|
65
|
+
if answer == ""
|
66
|
+
answer = possible_answers[0].downcase
|
67
|
+
print answer.yellow
|
68
|
+
end
|
69
|
+
|
70
|
+
break if possible_answers.map { |a| a.downcase }.include? answer
|
71
|
+
|
72
|
+
print "\nPossible answers are ["
|
73
|
+
print_info.call
|
74
|
+
end
|
75
|
+
|
76
|
+
answer
|
77
|
+
end
|
78
|
+
|
79
|
+
def run
|
80
|
+
# @message_bank.welcome_message
|
81
|
+
|
82
|
+
if @framework == "swift"
|
83
|
+
ConfigureSwift.perform(configurator: self)
|
84
|
+
else
|
85
|
+
ConfigureIOS.perform(configurator: self)
|
86
|
+
end
|
87
|
+
|
88
|
+
replace_variables_in_files
|
89
|
+
clean_template_files
|
90
|
+
rename_template_files
|
91
|
+
|
92
|
+
add_yk_pods
|
93
|
+
|
94
|
+
add_pods_to_podfile
|
95
|
+
|
96
|
+
customise_prefix
|
97
|
+
rename_classes_folder
|
98
|
+
ensure_carthage_compatibility
|
99
|
+
reinitialize_git_repo
|
100
|
+
run_pod_install
|
101
|
+
|
102
|
+
# @message_bank.farewell_message
|
103
|
+
end
|
104
|
+
|
105
|
+
def add_yk_pods
|
106
|
+
self.add_pod_to_podfile "YKCategoryComponent"
|
107
|
+
self.add_pod_to_podfile "YKModuleLifeCircleComponent"
|
108
|
+
self.add_pod_to_podfile "YKRouterComponent"
|
109
|
+
self.add_pod_to_podfile "YKModuleServiceComponent"
|
110
|
+
|
111
|
+
if @framework == "swift"
|
112
|
+
self.add_pod_to_podfile "SnapKit"
|
113
|
+
else
|
114
|
+
self.add_pod_to_podfile "YKModuleServiceComponent"
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
#----------------------------------------#
|
119
|
+
|
120
|
+
def ensure_carthage_compatibility
|
121
|
+
# FileUtils.ln_s("#{$current_dir}/Example/Pods/Pods.xcodeproj", "#{$current_dir}/_Pods.xcodeproj")
|
122
|
+
end
|
123
|
+
|
124
|
+
def run_pod_install
|
125
|
+
puts "\nRunning " + "pod install".magenta + " on your new library."
|
126
|
+
puts ""
|
127
|
+
|
128
|
+
Dir.chdir("#{$current_dir}/Example") do
|
129
|
+
# system "pod install"
|
130
|
+
end
|
131
|
+
|
132
|
+
# `git add #{$current_dir}/Example/#{pod_name}.xcodeproj/project.pbxproj`
|
133
|
+
# `git commit -m "Initial commit"`
|
134
|
+
end
|
135
|
+
|
136
|
+
def clean_template_files
|
137
|
+
["./**/.gitkeep", "configure", "_CONFIGURE.rb", "README.md", "LICENSE", "templates", "setup", "CODE_OF_CONDUCT.md"].each do |asset|
|
138
|
+
`rm -rf #{$current_dir}/#{asset}`
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def replace_variables_in_files
|
143
|
+
file_names = ['POD_LICENSE', 'POD_README.md', 'NAME.podspec', '.travis.yml', podfile_path]
|
144
|
+
file_names.each do |file_name|
|
145
|
+
# text = File.read(file_name)
|
146
|
+
text = File.read("#{$current_dir}/#{file_name}")
|
147
|
+
# text = File.read("./#{file_name}")
|
148
|
+
text.gsub!("${POD_NAME}", @pod_name)
|
149
|
+
text.gsub!("${REPO_NAME}", @pod_name.gsub('+', '-'))
|
150
|
+
text.gsub!("${USER_NAME}", user_name)
|
151
|
+
text.gsub!("${USER_EMAIL}", user_email)
|
152
|
+
text.gsub!("${YEAR}", year)
|
153
|
+
text.gsub!("${DATE}", date)
|
154
|
+
# File.open(file_name, "w") { |file| file.puts text }
|
155
|
+
File.open("#{$current_dir}/#{file_name}", "w") { |file| file.puts text }
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def add_pod_to_podfile podname
|
160
|
+
@pods_for_podfile << podname
|
161
|
+
end
|
162
|
+
|
163
|
+
def add_pods_to_podfile
|
164
|
+
podfile = File.read "#{$current_dir}/#{podfile_path}"
|
165
|
+
podfile_content = @pods_for_podfile.map do |pod|
|
166
|
+
"pod '" + pod + "'"
|
167
|
+
end.join("\n ")
|
168
|
+
podfile.gsub!("${INCLUDED_PODS}", podfile_content)
|
169
|
+
File.open("#{$current_dir}/#{podfile_path}", "w") { |file| file.puts podfile }
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
def add_line_to_pch line
|
174
|
+
@prefixes << line
|
175
|
+
end
|
176
|
+
|
177
|
+
def customise_prefix
|
178
|
+
prefix_path = "Example/Tests/Tests-Prefix.pch"
|
179
|
+
return unless File.exists? prefix_path
|
180
|
+
|
181
|
+
pch = File.read prefix_path
|
182
|
+
pch.gsub!("${INCLUDED_PREFIXES}", @prefixes.join("\n ") )
|
183
|
+
File.open(prefix_path, "w") { |file| file.puts pch }
|
184
|
+
end
|
185
|
+
|
186
|
+
def set_test_framework(test_type, extension, folder)
|
187
|
+
content_path = "setup/test_examples/" + test_type + "." + extension
|
188
|
+
tests_path = "templates/" + folder + "/Example/Tests/Tests." + extension
|
189
|
+
tests = File.read tests_path
|
190
|
+
tests.gsub!("${TEST_EXAMPLE}", File.read(content_path) )
|
191
|
+
File.open(tests_path, "w") { |file| file.puts tests }
|
192
|
+
end
|
193
|
+
|
194
|
+
def rename_template_files
|
195
|
+
FileUtils.mv "#{$current_dir}/POD_README.md", "#{$current_dir}/README.md"
|
196
|
+
FileUtils.mv "#{$current_dir}/POD_LICENSE", "#{$current_dir}/LICENSE"
|
197
|
+
FileUtils.mv "#{$current_dir}/NAME.podspec", "#{$current_dir}/#{pod_name}.podspec"
|
198
|
+
end
|
199
|
+
|
200
|
+
def rename_classes_folder
|
201
|
+
# FileUtils.mv "#{@pod_name}/Pod", @pod_name
|
202
|
+
FileUtils.mv "#{$current_dir}/Pod", "#{$current_dir}/#{@pod_name}"
|
203
|
+
end
|
204
|
+
|
205
|
+
|
206
|
+
def reinitialize_git_repo
|
207
|
+
Dir.chdir("#{$current_dir}") do
|
208
|
+
`rm -rf .git`
|
209
|
+
`git init`
|
210
|
+
`git add -A`
|
211
|
+
end
|
212
|
+
|
213
|
+
|
214
|
+
end
|
215
|
+
|
216
|
+
def validate_user_details
|
217
|
+
return (user_email.length > 0) && (user_name.length > 0)
|
218
|
+
end
|
219
|
+
|
220
|
+
#----------------------------------------#
|
221
|
+
|
222
|
+
def user_name
|
223
|
+
# (ENV['GIT_COMMITTER_NAME'] || github_user_name || `git config user.name` || `<GITHUB_USERNAME>` ).strip
|
224
|
+
(ENV['GIT_COMMITTER_NAME'] || `git config user.name` || `<GITHUB_USERNAME>` ).strip
|
225
|
+
|
226
|
+
end
|
227
|
+
|
228
|
+
|
229
|
+
def github_user_name
|
230
|
+
github_user_name = `security find-internet-password -s github.com | grep acct | sed 's/"acct"<blob>="//g' | sed 's/"//g'`.strip
|
231
|
+
is_valid = github_user_name.empty? or github_user_name.include? '@'
|
232
|
+
return is_valid ? nil : github_user_name
|
233
|
+
end
|
234
|
+
|
235
|
+
def user_email
|
236
|
+
(ENV['GIT_COMMITTER_EMAIL'] || `git config user.email`).strip
|
237
|
+
end
|
238
|
+
|
239
|
+
def year
|
240
|
+
Time.now.year.to_s
|
241
|
+
end
|
242
|
+
|
243
|
+
def date
|
244
|
+
Time.now.strftime "%m/%d/%Y"
|
245
|
+
end
|
246
|
+
|
247
|
+
def podfile_path
|
248
|
+
'Example/Podfile'
|
249
|
+
end
|
250
|
+
|
251
|
+
#----------------------------------------#
|
252
|
+
end
|
253
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
// https://github.com/kiwi-bdd/Kiwi
|
2
|
+
|
3
|
+
SPEC_BEGIN(InitialTests)
|
4
|
+
|
5
|
+
describe(@"My initial tests", ^{
|
6
|
+
|
7
|
+
context(@"will fail", ^{
|
8
|
+
|
9
|
+
it(@"can do maths", ^{
|
10
|
+
[[@1 should] equal:@2];
|
11
|
+
});
|
12
|
+
|
13
|
+
it(@"can read", ^{
|
14
|
+
[[@"number" should] equal:@"string"];
|
15
|
+
});
|
16
|
+
|
17
|
+
it(@"will wait and fail", ^{
|
18
|
+
NSObject *object = [[NSObject alloc] init];
|
19
|
+
[[expectFutureValue(object) shouldEventually] receive:@selector(autoContentAccessingProxy)];
|
20
|
+
});
|
21
|
+
});
|
22
|
+
|
23
|
+
context(@"will pass", ^{
|
24
|
+
|
25
|
+
it(@"can do maths", ^{
|
26
|
+
[[@1 should] beLessThan:@23];
|
27
|
+
});
|
28
|
+
|
29
|
+
it(@"can read", ^{
|
30
|
+
[[@"team" shouldNot] containString:@"I"];
|
31
|
+
});
|
32
|
+
});
|
33
|
+
|
34
|
+
});
|
35
|
+
|
36
|
+
SPEC_END
|