fwtoolkit 2.0.2 → 2.0.3

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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/lib/fwtoolkit/cli.rb +0 -11
  3. data/lib/fwtoolkit/cli/project.rb +3 -2
  4. data/lib/fwtoolkit/version.rb +1 -1
  5. data/templates/{swift_project/xcode/.DS_Store → .DS_Store} +0 -0
  6. data/templates/objc_project/xcode/%project_name%/%project_name%.xcodeproj/project.pbxproj.tt +5 -1
  7. data/templates/objc_project/xcode/%project_name%/%project_name%.xcodeproj/xcshareddata/xcschemes/%project_name%.xcscheme.tt +1 -1
  8. data/templates/objc_project/xcode/%project_name%/%target_name%/%class_prefix%AppDelegate.h.tt +1 -2
  9. data/templates/objc_project/xcode/%project_name%/%target_name%/%class_prefix%AppDelegate.m.tt +1 -2
  10. data/templates/objc_project/xcode/%project_name%/%target_name%/%class_prefix%ViewController.h.tt +1 -2
  11. data/templates/objc_project/xcode/%project_name%/%target_name%/%class_prefix%ViewController.m.tt +1 -2
  12. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +91 -7
  13. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
  14. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
  15. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
  16. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
  17. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
  18. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
  19. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
  20. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
  21. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
  22. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png +0 -0
  23. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png +0 -0
  24. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
  25. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
  26. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png +0 -0
  27. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png +0 -0
  28. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
  29. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
  30. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
  31. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@1x.png +0 -0
  32. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@2x.png +0 -0
  33. data/templates/objc_project/xcode/%project_name%/%target_name%/Supporting Files/main.m.tt +1 -2
  34. data/templates/objc_project/xcode/%project_name%/%target_name%Tests/%class_prefix%%project_name%Tests.m.tt +1 -3
  35. data/templates/swift_project/xcode/%project_name%/%project_name%.xcodeproj/project.pbxproj.tt +12 -1
  36. data/templates/swift_project/xcode/%project_name%/%project_name%.xcodeproj/xcshareddata/xcschemes/%project_name%.xcscheme.tt +1 -1
  37. data/templates/swift_project/xcode/%project_name%/%target_name%/AppDelegate.swift.tt +7 -8
  38. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +87 -8
  39. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
  40. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
  41. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
  42. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
  43. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
  44. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
  45. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
  46. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
  47. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
  48. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png +0 -0
  49. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png +0 -0
  50. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
  51. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
  52. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png +0 -0
  53. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png +0 -0
  54. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
  55. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
  56. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
  57. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@1x.png +0 -0
  58. data/templates/swift_project/xcode/%project_name%/%target_name%/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@2x.png +0 -0
  59. data/templates/swift_project/xcode/%project_name%/%target_name%/ViewController.swift.tt +1 -2
  60. data/templates/swift_project/xcode/%project_name%/%tests_target_name%/%project_name%Tests.swift.tt +2 -3
  61. metadata +44 -55
  62. data/lib/fwtoolkit/cli/bootstrap.rb +0 -75
  63. data/lib/fwtoolkit/cli/ci.rb +0 -52
  64. data/lib/fwtoolkit/cli/frank.rb +0 -113
  65. data/lib/fwtoolkit/cli/ota.rb +0 -109
  66. data/lib/fwtoolkit/cli/ota_client/hockeyapp_client.rb +0 -70
  67. data/templates/objc_project/git/.gitignore +0 -31
  68. data/templates/objc_project/rvm/Gemfile +0 -3
  69. data/templates/objc_project/xcode/%project_name%/%target_name%/AppDelegate.swift.tt +0 -46
  70. data/templates/objc_project/xcode/%project_name%/%target_name%/Resources/Base.lproj/Main.storyboard +0 -26
  71. data/templates/objc_project/xcode/%project_name%/%target_name%/ViewController.swift.tt +0 -25
  72. data/templates/objc_project/xcode/%project_name%/%target_name%Tests/%project_name%Tests.m.tt +0 -39
  73. data/templates/objc_project/xcode/%project_name%/%tests_target_name%/%project_name%Tests.swift.tt +0 -36
  74. data/templates/objc_project/xcode/%project_name%/%tests_target_name%/Supporting Files/Info.plist +0 -24
  75. data/templates/swift_project/git/.gitignore +0 -31
  76. data/templates/swift_project/rvm/Gemfile +0 -3
  77. data/templates/swift_project/xcode/%project_name%/%target_name%/%class_prefix%AppDelegate.h.tt +0 -18
  78. data/templates/swift_project/xcode/%project_name%/%target_name%/%class_prefix%AppDelegate.m.tt +0 -45
  79. data/templates/swift_project/xcode/%project_name%/%target_name%/%class_prefix%ViewController.h.tt +0 -15
  80. data/templates/swift_project/xcode/%project_name%/%target_name%/%class_prefix%ViewController.m.tt +0 -27
  81. data/templates/swift_project/xcode/%project_name%/%target_name%/Supporting Files/main.m.tt +0 -16
  82. data/templates/swift_project/xcode/%project_name%/%target_name%Tests/%project_name%Tests.m.tt +0 -39
  83. data/templates/swift_project/xcode/%project_name%/%target_name%Tests/Resources/Info.plist +0 -24
  84. data/templates/swift_project/xcode/%project_name%/.DS_Store +0 -0
@@ -1,75 +0,0 @@
1
- require 'thor'
2
- require 'fwtoolkit/config'
3
- require 'fwtoolkit/cli/cocoapods'
4
-
5
- module FWToolkit
6
- class Bootstrap < Thor::Group
7
- include Thor::Actions
8
-
9
- def xcode_check
10
- if File::exists?('/Applications/Xcode.app')
11
- say_status :skip, 'Xcode is already installed', :blue
12
- elsif
13
- say_status :error, 'Xcode is not installed. Please download it from developer.apple.com', :red
14
- end
15
- end
16
-
17
- def git_check
18
- if File.available_in_path?('git')
19
- say_status :skip, 'Git is already installed', :blue
20
- elsif
21
- say_status :error, 'Git is not installed. Please review your system configuration', :red
22
- end
23
- end
24
-
25
- def rvm_check
26
- if File.available_in_path?('rvm')
27
- say_status :skip, 'Rvm is already installed', :blue
28
- elsif
29
- say_status :install, 'Installing rvm from https://get.rvm.io', :green
30
- Dir.mktmpdir do |dir|
31
- installer_path = File.join(dir, 'rvm_install.sh');
32
- get 'https://get.rvm.io', installer_path
33
- run! "bash -s stable #{installer_path}", {:capture => true}
34
- end
35
- end
36
- end
37
-
38
- def ruby_ver_check
39
- default_rvm_ruby = run! 'rvm list default string', {:capture => true}
40
- if default_rvm_ruby.include? Config.ruby_version
41
- say_status :skip, "Ruby is already at the last version (#{Config.ruby_version})", :blue
42
- end
43
- say_status :install, "Installing ruby version #{Config.ruby_version} (through rvm)", :green
44
- run! "rvm use --install #{Config.ruby_version}", {:with => 'bash -lc', :capture => true}
45
- end
46
-
47
- def cocoapods_check
48
- if File.available_in_path?('pods')
49
- say_status :skip, 'Cocoapods is already installed', :blue
50
- elsif
51
- invoke FWToolkit::Cocoapods, 'install', []
52
- end
53
- end
54
- end
55
- end
56
-
57
- class File
58
-
59
- def available_in_path?(prog_name)
60
- which(prog_name)!=nil
61
- end
62
-
63
- private
64
-
65
- def which cmd
66
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
67
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
68
- exts.each do |ext|
69
- exe = "#{path}/#{cmd}#{ext}"
70
- return exe if File.executable? exe
71
- end
72
- end
73
- return nil
74
- end
75
- end
@@ -1,52 +0,0 @@
1
- require 'thor'
2
- require 'net/http'
3
- require 'uri'
4
- require 'fwtoolkit/git_client'
5
- require 'fwtoolkit/config'
6
-
7
- module FWToolkit
8
- class Ci < Thor
9
- include Thor::Actions
10
-
11
- desc 'add [PROJECT_NAME] [PROJECT_DIR]', 'Add a project to the CI environment'
12
- def add(project_name, project_root)
13
- raise Thor::Error, "\"#{project_root}\" doesn't contain a valid git repository" unless repository.initialized?
14
-
15
- if project_exists_on_ci? project_name
16
- say_status :skip, "There's already a project named \"#{project_name}\" on the ci at #{Config.ci_server_url}"
17
- return
18
- end
19
-
20
- remotes = repository.remotes
21
- raise Thor::Error, "\"#{project_root}\" is a local-only repository" if remotes.to_a.size == 0
22
-
23
- remotes = repository.remotes
24
- if remotes.keys.count == 1
25
- remote_name = remotes.values.first
26
- else
27
- remote_name = ask 'There\'s more than one remote configured for this repository. Select one:', {:limited_to => remotes.keys }
28
- end
29
-
30
- remote_url = remotes[remote_name]
31
-
32
- response = Net::HTTP.post_form(URI.parse("#{Config.ci_server_url}/projects"),
33
- {'project[name]' => project_name,
34
- 'project[source_control][repository]' => remote_url,
35
- 'project[source_control][source_contro]' => 'Git',
36
- 'project[source_control][branch]' => 'dev'})
37
- if response.kind_of? Net::HTTPSuccess
38
- say_status :add, "Project \"#{project_name}\" successfully added to the CI environment", :green
39
- elsif
40
- raise Thor::Error, "Failed to add project \"#{project_name}\" to the CI"
41
- end
42
-
43
- end
44
-
45
- private
46
- def project_exists_on_ci?(project_name)
47
- response = Net::HTTP.request_get URI.parse("#{Config.ci_server_url}/builds/#{project_name}")
48
- response.kind_if? Net::HTTPSuccess
49
- end
50
-
51
- end
52
- end
@@ -1,113 +0,0 @@
1
- require 'thor'
2
- require 'xcodeproj'
3
- require 'core_data'
4
- require 'fwtoolkit/ext/gem'
5
- require 'fwtoolkit/projectfile'
6
- require 'fwtoolkit/cli/fw_actions'
7
- require 'fwtoolkit/cli/thorutils'
8
-
9
- module Xcodeproj
10
- class Project
11
- def core_data_files(target_name=nil)
12
- mom_files = Array.new
13
- targets_list = target_name ? self.targets.select { |t| t.name == target_name } : self.targets
14
- targets_list.each do |t|
15
- mom_files << t.source_build_phase.files.select{ |f| f.display_name =~ /.*?\.xcdatamodeld/ }.map{ |f| f.file_ref.current_version.path }
16
- end
17
- end
18
- end
19
- end
20
-
21
- class String
22
- def ruby_format
23
- self.gsub(/(.)([A-Z])/,'\1_\2').downcase
24
- end
25
-
26
- def ruby_format!
27
- replace ruby_format
28
- end
29
- end
30
-
31
- module FWToolkit
32
- class Frank < Thor
33
- include Thor::Actions
34
- include FWToolkit::ThorUtils
35
- source_root_templates!
36
-
37
- add_runtime_options!
38
-
39
- desc 'setup [PROJECT_DIR]', 'Sets up Frank for the project at project_dir and on the given target'
40
- option :target,
41
- :banner => 'Xcode target',
42
- :desc => 'Specify the build target that Frank should use. Default: the one specified by :target in the FWProjectFile'
43
- def setup(project_dir)
44
- destination_root = project_dir
45
- Projectfile.load!(project_dir)
46
-
47
- if !options[:force] && frank_alredy_set_up?(project_dir)
48
- say_status :skip, 'Frank is already set up for the project'
49
- return
50
- end
51
- say 'Setting up Frank'
52
-
53
- template_conf = Projectfile.config
54
- Projectfile.config[:target_name] ||= options[:target] if options[:target]
55
-
56
- inside(File.join(destination_root, template_conf[:project_name])) { run! "frank setup --target #{Projectfile.target_name}" }
57
-
58
- #remove files we're going to overwrite
59
- FileUtils.rm File.join(destination_root, template_conf[:project_name], 'Frank', 'features', 'step_definitions', 'launch_steps.rb')
60
- FileUtils.rm File.join(destination_root, template_conf[:project_name], 'Frank', 'features', 'support', 'env.rb')
61
-
62
- template_directory 'templates/default_project/frank', destination_root, template_conf
63
- end
64
-
65
- desc 'model [PROJECT_DIR]', 'Creates Frank model files from CoreData for the project at project_dir'
66
- option :modelfile,
67
- :banner => 'core data xcdatamodel file',
68
- :desc => 'Specify the position of the xcdatamodel file you want to extract the Core Data entity from. By default, fwtoolkit searches recursively inside project_dir for all *.xcdatamodel files'
69
- def model(project_dir)
70
- say 'Creating model files out of core data entities'
71
- destination_root = project_dir
72
- Projectfile.load!(project_dir)
73
-
74
- if options[:modelfile].nil?
75
- mom_files = Dir.glob(File.join(project_dir, '**/*.xcdatamodel'))
76
-
77
- if mom_files.size > 1
78
- mom_file = ask('I\'ve found more than one core data model, which one would you like to use?', mom_files)
79
- elsif mom_files.size == 1
80
- mom_file = mom_files[0]
81
- else
82
- raise Thor::Error, "Can't locate a valid core data model for #{mom_file}"
83
- end
84
- end
85
-
86
- template_conf = Projectfile.config
87
-
88
- model = CoreData::DataModel.new File.join(mom_file, 'contents')
89
-
90
- model.entities.each do |entity|
91
- seed_conf = template_conf.clone
92
- seed_conf[:class_name] = remove_prefix(template_conf[:class_prefix], entity.name).ruby_format
93
- seed_conf[:model] = entity
94
- directory 'templates/default_project/frank_seed_core_data', destination_root, seed_conf
95
- end
96
-
97
- template_conf[:models] = model.entities
98
- directory 'templates/default_project/frank_seed_support', destination_root, template_conf
99
- end
100
-
101
- private
102
-
103
- def remove_prefix(prefix, entity)
104
- entity[/^#{prefix}/] = '' if entity[/^#{prefix}/]
105
- entity
106
- end
107
-
108
- def frank_alredy_set_up?(project_dir)
109
- File.exists? File.join(project_dir, File.basename(project_dir), 'Frank')
110
- end
111
-
112
- end
113
- end
@@ -1,109 +0,0 @@
1
- require 'thor'
2
- require 'rake'
3
- require 'fwtoolkit/projectfile'
4
- require 'fwtoolkit/xcode'
5
- require 'fwtoolkit/config'
6
- require 'fwtoolkit/hockeyapp_client'
7
- require 'fwtoolkit/hash_yaml'
8
-
9
- module XcodedBuild
10
- def self.create_ipa(xcarchive_path, ipa_output, dev_id=nil, provisionin_profile=nil)
11
- provisioning_profile = File.expand_path provisioning_profile
12
- raise Thor::Error, "Unable to locate the provisioning profile: #{provisioning_profile}" unless File.exists?(provisioning_profile)
13
-
14
- app_path = find_unique! xcarchive_path, '*.app'
15
- raise Thor::Error, "Unable to find any .app file at path: #{xcarchive_path}" unless app_path
16
-
17
- ipa_output = File.expand_path ipa_output
18
-
19
- cmd_line = "xcrun -sdk iphoneos PackageApplication -v #{app_path} -o #{ipa_output}"
20
- cmd_line += "--sign #{dev_id}" if dev_id
21
- cmd_line += "--embed #{provisioning_profile}" if provisioning_profile
22
- run! "xcrun -sdk iphoneos PackageApplication -v #{app_path} -o #{ipa_output}"
23
- end
24
-
25
- def self.find_unique!(root, file)
26
- files_in_root = Dir["#{root}/**/#{file}"]
27
- raise Thor::Error, "Found more than one \"#{file}\" at path: #{root}" if apps_in_root.size > 1
28
- files_in_root.size > 0 ? File.expand_path(files_in_root.first) : nil
29
- end
30
- end
31
-
32
- module FWToolkit
33
- class Ota < Thor
34
- include Thor::Actions
35
-
36
- desc 'ipa [PROJECT_ROOT]', 'Creates an ipa file signed with the credentials defined in the FWProjectfile for the project at project_root'
37
- option :sign,
38
- :type => :boolean,
39
- :default => :true,
40
- :desc => 'If true, the dev_id defined in the project file is ignored and the app is signed with the dev_id defined on FWProjectfile. Default: true'
41
- def sign(project_root)
42
- invoke FWToolkit::Xcode, 'build', [project_root], :clean => true, :archive => true, :type => 'testing', :sdk => 'iphoneos'
43
- Projectfile.load! project_root
44
-
45
- if options[:sign]
46
- XcodeBuild.create_ipa xcarchive_path, ipa_path, Projectfile.dev_id, Projectfile.provisioning_profile
47
- else
48
- XcodeBuild.create_ipa xcarchive_path, ipa_path
49
- end
50
-
51
- say_status :created, "IPA at: #{ipa_path} signed with developer id: #{dev_id}", :green
52
- end
53
-
54
- desc 'upload [PROJECT_ROOT]', 'Upload a new build to FW\'s Hockeyapp account'
55
- option :sign,
56
- :type => :boolean,
57
- :default => true,
58
- :desc => 'If true, the dev_id defined in the project file is ignored and the app is signed with the dev_id defined on FWProjectfile. Default: true'
59
- def upload(project_root)
60
- if options[:sign]
61
- invoke('sign')
62
- else
63
- invoke FWToolkit::Xcode, 'build', [project_root], :clean => true, :archive => true, :type => 'testing', :sdk => 'iphoneos'
64
- end
65
-
66
- Projectfile.load! project_root
67
-
68
- raise Thor::Error, "Unable to find the xcarchive file at path: #{ipa}" unless File.exists?(ipa_path)
69
- raise Thor::Error, "Unable to find the dSYM file at path: #{dsym}" unless File.exists?(dsym_path)
70
-
71
- uploader = FWToolkit::OTA::HockeyappClient.new(Config.hockeyapp_api_token, Projectfile.app_token)
72
-
73
- begin
74
- uploader.upload_build ipa_path, dsym_path
75
- rescue StandardError => e
76
- say_status :error, "Error uploading to hockeyapp: #{e.message}", :red
77
- end
78
-
79
- say_status :upload, "Uploaded a new version to Hockeyapp", :green
80
- end
81
-
82
-
83
- private
84
-
85
- def ipa_path
86
- File.join xcarchive_path, "#{Projectfile.project_name}.ipa"
87
- end
88
-
89
- def dsym_path
90
- File.join xcarchive_path, 'dSYMs' "#{Projectfile.project_name}.app.dSYM"
91
- end
92
-
93
- def artifacts_dir
94
- File.join Config.artifacts_tmp_dir, Projectfile.project_name
95
- end
96
-
97
- def xcarchive_path
98
- if @xcarchive_path.nil
99
- build_conf = Hash.hash_from_yaml File.join(Config.artifacts_tmp_dir, Projectfile.project_name, 'env.log')
100
-
101
- @xcarchive_path = build_conf[:ARCHIVE_PATH]
102
- raise Thor::Error, "Cannot locate the xcarchive for the project" unless File.exists?(xcarchive)
103
- end
104
- @xcarchive_path
105
- end
106
-
107
-
108
- end
109
- end
@@ -1,70 +0,0 @@
1
- require 'hockeyapp'
2
- require 'fwtoolkit/config'
3
- require 'rubyzip'
4
-
5
- module FWToolkit
6
- module OTA
7
- class HockeyappClient
8
-
9
- class CmdUploader
10
- def initialize(api_token, app_id)
11
- HockeyApp::Config.configure { |config| config.token = api_token }
12
- @client = HockeyApp.build_client
13
- @app = HockeyApp::App.from_hash({"public_identifier" => app_id}, @client)
14
- end
15
-
16
- def upload_build(bin_file, dsym_file = nil, notes = nil)
17
- raise ArgumentError, "No valid ipa file exists at path #{bin_file}" unless bin_file.exists?
18
- raise ArgumentError, "No valid dsym_file file exists at path #{dsym_file}" unless (dsym_file.nil? || dsym_file.exists?)
19
- zip_dsym = zipped_dsym(dsym_file) if dsym_file
20
- new_version = HockeyApp::Version.new(@app, @client)
21
- new_version.ipa = bin_file
22
- new_version.dsym = zipped_dsym(zip_dsym)
23
- new_version.notes = notes
24
- @client.post_new_version new_version
25
- end
26
-
27
- def dsym_path_from_xcarchive(xcarchive_path)
28
-
29
- end
30
-
31
- def
32
- end
33
-
34
- # class GuiUploader
35
- # def initialize(api_token, app_id)
36
- # @api_token = api_token
37
- # @app_id = app_id
38
- # end
39
-
40
- # def upload_build(bin_file, dsym_file = nil, notes = nil)
41
- # raise ArgumentError, 'Not implemented'
42
- # end
43
- # end
44
-
45
- # There are two kind of uploader: internal and gui. The second one utilizes hockeyapp's mac app to provide
46
- def initialize(api_token, app_id, uploader=:cmd_uploader)
47
- @uploader = uploader==:cmd_uploader ? CmdUploader.new(api_token, app_id) : GuiUploader.new(api_token, app_id)
48
- end
49
-
50
- def upload_build(bin_file, dsym_file = nil, notes = nil)
51
- @uploader.upload_build bin_file, dsym_file, notes
52
- raise ArgumentError, "No valid ipa file exists at path #{bin_file}" unless bin_file.exists?
53
- raise ArgumentError, "No valid dsym_file file exists at path #{dsym_file}" unless (dsym_file.nil? || dsym_file.exists?)
54
- zip_dsym = zipped_dsym(dsym_file) if dsym_file
55
- new_version = HockeyApp::Version.new(@app, @client)
56
- new_version.ipa = bin_file
57
- new_version.dsym = zipped_dsym(zip_dsym)
58
- new_version.notes = notes
59
- @client.post_new_version new_version
60
- end
61
-
62
- def zipped_dsym(dsym_file)
63
- zip_file = "#{dsym_file}.zip"
64
- Zip::ZipFile.open(zip_file, Zip::ZipFile::CREATE) do |zipfile|
65
- zipfile.add(dsym_file)
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,31 +0,0 @@
1
- # Ruby
2
- tmp/
3
- log/
4
- db/production.sqlite3
5
- db/development.sqlite3
6
-
7
- # Xcode
8
- build/*
9
- *.pbxuser
10
- !default.pbxuser
11
- *.mode1v3
12
- !default.mode1v3
13
- *.mode2v3
14
- !default.mode2v3
15
- *.perspectivev3
16
- !default.perspectivev3
17
- !default.xcworkspace
18
- xcuserdata
19
- profile
20
- *.moved-aside
21
- # Finder
22
- .DS_Store
23
- .svn
24
- *.swp
25
- *.~nib
26
-
27
- # Frank
28
- Frank/frankified_build/
29
-
30
- # Cocoapods
31
- /Pods/