souyuz 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 368484d22e8d6d287966ced20c877224071eb3f2
4
+ data.tar.gz: c3c8638ab220b8c3c46ed778c0f87b7552f5bb5c
5
+ SHA512:
6
+ metadata.gz: 0765c3c1902728fce692fb5ccf8512c09d68b4b7cc1609872598f1e15ca15c98501d03d81a24e10dad3e4a604a2b41da3a3e9af9295beb8ac1bcefae04430555
7
+ data.tar.gz: 26ccd09dc6b46e041f5e83679c880515c29e748b1c25e2a475c99f550e12e359102c3fbb213623f76759297dff77dd59b6e8cdca45d9f0353d6e05b3ba74d355
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Felix Rudat
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # Souyuz
2
+
3
+ A fastlane component to make Xamarin builds a breeze.
4
+
5
+ ## ToDos
6
+
7
+ * replace path concat with `File.join()`
8
+ * automatically determine `:platform`
9
+
10
+ ## Licensing
11
+
12
+ Souyuz is licensed under the MIT License. See [LICENSE](LICENSE) for the full license text.
data/bin/souyuz ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.push File.expand_path("../../lib", __FILE__)
3
+
4
+ require "souyuz"
5
+ require "souyuz/commands_generator"
6
+ Souyuz::CommandsGenerator.start
@@ -0,0 +1,47 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require "commander"
3
+ require "fastlane_core"
4
+
5
+ HighLine.track_eof = false
6
+
7
+ module Souyuz
8
+ class CommandsGenerator
9
+ include Commander::Methods
10
+ UI = FastlaneCore::UI
11
+
12
+ FastlaneCore::CommanderGenerator.new.generate(Souyuz::Options.available_options)
13
+
14
+ def self.start
15
+ new.run
16
+ end
17
+
18
+ def convert_options(options)
19
+ o = options.__hash__.dup
20
+ o.delete(:verbose)
21
+ o
22
+ end
23
+
24
+ def run
25
+ program :version, Souyuz::VERSION
26
+ program :description, Souyuz::DESCRIPTION
27
+ program :help, "Author", "Felix Rudat <voydz@hotmail.com>"
28
+ program :help_formatter, :compact
29
+
30
+ global_option("--verbose") { $verbose = true }
31
+
32
+ command :build do |c|
33
+ c.syntax = "souyuz"
34
+ c.description = "Just builds your app"
35
+ c.action do |_args, options|
36
+ config = FastlaneCore::Configuration.create(Souyuz::Options.available_options,
37
+ convert_options(options))
38
+ Souyuz::Manager.new.work(config)
39
+ end
40
+ end
41
+
42
+ default_command :build
43
+
44
+ run!
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,126 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'nokogiri'
3
+
4
+ module Souyuz
5
+ # This class detects all kinds of default values
6
+ class DetectValues
7
+ # This is needed as these are more complex default values
8
+ # Returns the finished config object
9
+ def self.set_additional_default_values
10
+ config = Souyuz.config
11
+
12
+ # TODO detect_platform automatically for :platform config
13
+
14
+ # set correct implicit build platform for android
15
+ if config[:platform] == Platform::ANDROID
16
+ config[:build_platform] = 'AnyCPU'
17
+ end
18
+
19
+ # Detect the project
20
+ Souyuz.project = Msbuild::Project.new(config)
21
+ detect_solution
22
+ detect_project # we can only do that *after* we detected the solution
23
+
24
+ doc_csproj = get_parser_handle config[:project_path]
25
+
26
+ detect_output_path doc_csproj
27
+ detect_manifest doc_csproj
28
+ detect_assembly_name doc_csproj # we can only do that for android *after* we detected the android manitfest
29
+
30
+ return config
31
+ end
32
+
33
+ # Helper Methods
34
+
35
+ def self.detect_solution
36
+ return if Souyuz.config[:solution_path]
37
+ itr = 0
38
+ query = '*.sln'
39
+
40
+ begin
41
+ files = Dir.glob(query)
42
+ query = "../#{query}"
43
+ itr += 1
44
+ end until files.any? or itr > 3
45
+
46
+ sln = files.first # pick first file as solution
47
+ UI.user_error! 'Not able to find solution file automatically, try to specify it via `solution_path` parameter.' unless sln
48
+
49
+ Souyuz.config[:solution_path] = abs_path sln
50
+ end
51
+
52
+ def self.detect_project
53
+ return if Souyuz.config[:project_path]
54
+
55
+ path = Souyuz.config[:solution_path]
56
+ projects = Msbuild::SolutionParser.parse(path)
57
+ .get_platform Souyuz.config[:platform]
58
+
59
+ UI.user_error! "Not able to find any project in solution, that matches the platform `#{Souyuz.config[:platform]}`." unless projects.any?
60
+
61
+ project = projects.first
62
+ csproj = fix_path_relative project.project_path # get path relative to project root
63
+ UI.user_error! 'Not able to find project file automatically, try to specify it via `project_path` parameter.' unless csproj
64
+
65
+ Souyuz.config[:project_name] = project.project_name
66
+ Souyuz.config[:project_path] = abs_path csproj
67
+ end
68
+
69
+ def self.detect_output_path(doc_csproj)
70
+ return if Souyuz.config[:output_path]
71
+
72
+ configuration = Souyuz.config[:build_configuration]
73
+ platform = Souyuz.config[:build_platform]
74
+
75
+ doc_node = doc_csproj.xpath("/*[local-name()='Project']/*[local-name()='PropertyGroup'][translate(@*[local-name() = 'Condition'],'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = \" '$(configuration)|$(platform)' == '#{configuration.downcase}|#{platform.downcase}' \"]/*[local-name()='OutputPath']/text()")
76
+ Souyuz.config[:output_path] = abs_project_path doc_node.text
77
+ end
78
+
79
+ def self.detect_manifest(doc_csproj)
80
+ return if Souyuz.config[:manifest_path] or Souyuz.config[:platform] != Platform::ANDROID
81
+
82
+ doc_node = doc_csproj.css('PropertyGroup > AndroidManifest')
83
+ Souyuz.config[:manifest_path] = abs_project_path doc_node.text
84
+ end
85
+
86
+ def self.detect_assembly_name(doc_csproj)
87
+ return if Souyuz.config[:assembly_name]
88
+
89
+ if [ Platform::IOS, Platform::MAC ].include? Souyuz.config[:platform]
90
+ Souyuz.config[:assembly_name] = doc_csproj.css('PropertyGroup > AssemblyName').text
91
+ elsif Souyuz.config[:platform] == Platform::ANDROID
92
+ doc = get_parser_handle Souyuz.config[:manifest_path] # explicitly for this call, no cache needed
93
+ Souyuz.config[:assembly_name] = doc.xpath('string(//manifest/@package)')
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ def self.get_parser_handle(filename)
100
+ f = File::open(filename)
101
+ doc = Nokogiri::XML(f)
102
+ f.close
103
+
104
+ return doc
105
+ end
106
+
107
+ def self.fix_path_relative(path)
108
+ root = File.dirname Souyuz.config[:solution_path] # failsafe to __FILE__ and __DIR__
109
+ path = "#{root}/#{path}"
110
+ path
111
+ end
112
+
113
+ def self.abs_project_path(path)
114
+ path = path.gsub('\\', '/') # dir separator fix
115
+ platform_path = Souyuz.config[:project_path]
116
+ path = "#{File.dirname platform_path}/#{path}"
117
+ path
118
+ end
119
+
120
+ def self.abs_path(path)
121
+ path = path.gsub('\\', '/') # dir separator fix
122
+ path = File.expand_path(path) # absolute dir
123
+ path
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,44 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Souyuz
3
+ # Responsible for building the zipalign command
4
+ # TODO implement
5
+ class AndroidZipalignCommandGenerator
6
+ class << self
7
+ def generate
8
+
9
+ parts = prefix
10
+ parts += pipe
11
+
12
+ parts
13
+ end
14
+
15
+ def detect_build_tools
16
+ # determine latest buildtool version
17
+ buildtools = File.join(ENV['ANDROID_HOME'], 'build-tools')
18
+ version = Dir.entries(buildtools).sort.last
19
+
20
+ UI.success "Using Buildtools Version: #{version}..."
21
+
22
+ [buildtools, version]
23
+ end
24
+
25
+ def zipalign_apk
26
+ buildtools, version = detect_build_tools
27
+ zipalign = ENV['ANDROID_HOME'] ? File.join(buildtools, version, 'zipalign') : 'zipalign'
28
+
29
+ sh "\"#{zipalign}\" -f -v 4 #{signed_apk} #{aligned_apk}"
30
+ Helper.backticks(command, print: !Souyuz.config[:silent])
31
+ end
32
+
33
+ def prefix
34
+ ["set -o pipefail &&"]
35
+ end
36
+
37
+ def pipe
38
+ pipe = []
39
+
40
+ pipe
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,58 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Souyuz
3
+ # Responsible for building the fully working xbuild command
4
+ class BuildCommandGenerator
5
+ class << self
6
+ def generate
7
+ parts = prefix
8
+ parts << "xbuild"
9
+ parts += options
10
+ parts += targets
11
+ parts << project
12
+ parts += pipe
13
+
14
+ parts
15
+ end
16
+
17
+ def prefix
18
+ ["set -o pipefail &&"]
19
+ end
20
+
21
+ def options
22
+ config = Souyuz.config
23
+
24
+ options = []
25
+ options << "/p:Configuration=#{config[:build_configuration]}" if config[:build_configuration]
26
+ options << "/p:Platform=#{config[:build_platform]}" if Souyuz.project.ios? and config[:build_platform]
27
+ options << "/p:BuildIpa=true" if Souyuz.project.ios?
28
+
29
+ options
30
+ end
31
+
32
+ def build_targets
33
+ Souyuz.config[:build_target].map! { |t| "/t:#{t}" }
34
+ end
35
+
36
+ def targets
37
+ targets = []
38
+ targets += build_targets
39
+ targets << "/t:SignAndroidPackage" if Souyuz.project.android?
40
+
41
+ targets
42
+ end
43
+
44
+ def project
45
+ config = Souyuz.config
46
+
47
+ Souyuz.config[:project_path] if Souyuz.project.android?
48
+ Souyuz.config[:solution_path] if Souyuz.project.ios? or Souyuz.project.mac?
49
+ end
50
+
51
+ def pipe
52
+ pipe = []
53
+
54
+ pipe
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,54 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Souyuz
3
+ # Responsible for building the jarsigner command
4
+ # TODO implement
5
+ class JavaSignCommandGenerator
6
+ class << self
7
+ def generate
8
+ build_apk_path = Souyuz.cache[:build_apk_path]
9
+ signed_apk_path = "#{build_apk_path}-unaligned.apk"
10
+
11
+ parts = prefix
12
+ parts << detect_jarsigner_executable
13
+ parts += options
14
+ parts << build_apk_path
15
+ parts << Souyuz.config[:keystore_alias]
16
+ parts += pipe
17
+
18
+ parts
19
+ end
20
+
21
+ def prefix
22
+ ["set -o pipefail &&"]
23
+ end
24
+
25
+ def detect_jarsigner_executable
26
+ jarsigner = ENV['JAVA_HOME'] ? File.join(ENV['JAVA_HOME'], 'bin', 'jarsigner') : 'jarsigner'
27
+ UI.user_error! 'Jarsigner executable not found, check if your `JAVA_HOME` env is set' unless system jarsigner
28
+
29
+ jarsigner
30
+ end
31
+
32
+ def options
33
+ config = Souyuz.config
34
+
35
+ options = []
36
+ options << "-verbose" if $verbose
37
+ options << "-sigalg MD5withRSA"
38
+ options << "-digestalg SHA1"
39
+ options << "-storepass #{config[:keystore_password]}"
40
+ options << "-keystore #{config[:keystore_path]}"
41
+ options << "-tsa #{config[:keystore_tsa]}"
42
+ options << "-signedjar #{Souyuz.cache[:build_apk_path]}"
43
+
44
+ options
45
+ end
46
+
47
+ def pipe
48
+ pipe = []
49
+
50
+ pipe
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,16 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require "fastlane_core"
3
+
4
+ module Souyuz
5
+ class Manager
6
+ def work(options)
7
+ Souyuz.config = options
8
+
9
+ FastlaneCore::PrintTable.print_values(config: Souyuz.config,
10
+ hide_keys: [],
11
+ title: "Summary for souyuz #{Souyuz::VERSION}")
12
+
13
+ return Runner.new.run
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,44 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Souyuz
3
+ module Msbuild
4
+ class Project
5
+ attr_accessor :options
6
+
7
+ def initialize(options)
8
+ @options = options
9
+ end
10
+
11
+ def project_name
12
+ @options[:project_name]
13
+ end
14
+
15
+ def project_path
16
+ @options[:project_path]
17
+ end
18
+
19
+ def ios?
20
+ is_platform? Souyuz::Platform::IOS
21
+ end
22
+
23
+ def mac?
24
+ is_platform? Souyuz::Platform::MAC
25
+ end
26
+
27
+ def android?
28
+ is_platform? Souyuz::Platform::ANDROID
29
+ end
30
+
31
+ def is_platform?(platform)
32
+ return case platform
33
+ when Souyuz::Platform::IOS
34
+ then self.project_name.downcase.include? 'ios'
35
+ when Souyuz::Platform::MAC
36
+ then self.project_name.downcase.include? 'mac'
37
+ when Souyuz::Platform::ANDROID
38
+ then self.project_name.downcase.include? 'droid'
39
+ else false
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Souyuz
3
+ module Msbuild
4
+ class Solution
5
+ attr_accessor :projects
6
+
7
+ def initialize
8
+ @projects = []
9
+ end
10
+
11
+ def add_project(project)
12
+ @projects << project
13
+ end
14
+
15
+ def get_platform(platform)
16
+ @projects.select { |p| p.is_platform? platform }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Souyuz
3
+ module Msbuild
4
+ class SolutionParser
5
+ def self.parse(filename)
6
+ solution = Solution.new
7
+
8
+ File::open(filename) do |f|
9
+ f.read.split("\n").each do |line|
10
+ if line.start_with? "Project"
11
+ options = parse_line line
12
+ solution.add_project Project.new(options) #maybe we should not use the project class for this
13
+ end
14
+ end
15
+ end
16
+
17
+ return solution
18
+ end
19
+
20
+ def self.parse_line(line)
21
+ name = get_project_name line
22
+ project_file = get_project_file line
23
+ return { project_name: name, project_path: project_file }
24
+ end
25
+
26
+ def self.get_project_name(project_line)
27
+ project_line.split("\"")[3]
28
+ end
29
+
30
+ def self.get_project_file(project_line)
31
+ project_line.split("\"")[5].gsub('\\', '/')
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,58 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require "fastlane_core"
3
+ require "credentials_manager"
4
+
5
+ module Souyuz
6
+ class Options
7
+ def self.available_options
8
+ [
9
+ FastlaneCore::ConfigItem.new(key: :silent,
10
+ env_name: "SOUYUZ_SILENT",
11
+ description: "Hide all information that's not necessary while building",
12
+ default_value: false,
13
+ is_string: false),
14
+ FastlaneCore::ConfigItem.new(key: :build_configuration,
15
+ env_name: "SOUYUZ_BUILD_CONFIGURATION",
16
+ description: "Xbuild configuration value",
17
+ default_value: 'Release'),
18
+ FastlaneCore::ConfigItem.new(key: :build_platform,
19
+ env_name: "SOUYUZ_BUILD_PLATFORM",
20
+ description: "Xbuild platform value",
21
+ default_value: 'iPhone'),
22
+ FastlaneCore::ConfigItem.new(key: :build_target,
23
+ env_name: "SOUYUZ_BUILD_TARGET",
24
+ description: "Xbuild targets to build",
25
+ default_value: [ 'Build' ],
26
+ type: Array),
27
+ FastlaneCore::ConfigItem.new(key: :output_path,
28
+ env_name: "SOUYUZ_BUILD_OUTPUT_PATH",
29
+ description: "Xbuild output path",
30
+ optional: true),
31
+ FastlaneCore::ConfigItem.new(key: :project_name,
32
+ env_name: "SOUYUZ_BUILD_PROJECT_NAME",
33
+ description: "Xbuild project name",
34
+ optional: true),
35
+ FastlaneCore::ConfigItem.new(key: :assembly_name,
36
+ env_name: "SOUYUZ_BUILD_ASSEMBLY_NAME",
37
+ description: "Xbuild assembly name",
38
+ optional: true),
39
+ FastlaneCore::ConfigItem.new(key: :platform,
40
+ env_name: "SOUYUZ_PLATFORM",
41
+ description: "Targeted device platform (i.e. android, ios, mac)",
42
+ optional: false),
43
+ FastlaneCore::ConfigItem.new(key: :solution_path,
44
+ env_name: "SOUYUZ_SOLUTION_PATH",
45
+ description: "Path to the xbuild solution (sln) file",
46
+ optional: true),
47
+ FastlaneCore::ConfigItem.new(key: :project_path,
48
+ env_name: "SOUYUZ_PROJECT_PATH",
49
+ description: "Path to the xbuild project (csproj) file",
50
+ optional: true),
51
+ FastlaneCore::ConfigItem.new(key: :manifest_path,
52
+ env_name: "SOUYUZ_ANDROID_MANIFEST_PATH",
53
+ description: "Path to the android manifest (xml) file",
54
+ optional: true),
55
+ ]
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,8 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Souyuz
3
+ module Platform
4
+ IOS = 'ios'
5
+ MAC = 'mac'
6
+ ANDROID = 'android'
7
+ end
8
+ end
@@ -0,0 +1,87 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Souyuz
3
+ class Runner
4
+ def run
5
+ build_app
6
+
7
+ if Souyuz.project.ios? or Souyuz.project.mac?
8
+ compress_and_move_dsym
9
+ path = ipa_file
10
+
11
+ path
12
+ elsif Souyuz.project.android?
13
+ path = apk_file
14
+ # jarsign_and_zipalign TODO implement later
15
+
16
+ path
17
+ end
18
+ end
19
+
20
+ def build_app
21
+ command = BuildCommandGenerator.generate
22
+ FastlaneCore::CommandExecutor.execute(command: command,
23
+ print_all: true,
24
+ print_command: !Souyuz.config[:silent])
25
+ end
26
+
27
+ #
28
+ # android build stuff to follow..
29
+ #
30
+
31
+ def apk_file
32
+ build_path = Souyuz.project.options[:output_path]
33
+ assembly_name = Souyuz.project.options[:assembly_name]
34
+
35
+ "#{build_path}/#{assembly_name}.apk"
36
+ end
37
+
38
+ def jarsign_and_zipalign
39
+ command = JavaSignCommandGenerator.generate
40
+ FastlaneCore::CommandExecutor.execute(command: command,
41
+ print_all: true,
42
+ print_command: !Souyuz.config[:silent])
43
+
44
+ command = AndroidZipalignCommandGenerator.generate
45
+ FastlaneCore::CommandExecutor.execute(command: command,
46
+ print_all: true,
47
+ print_command: !Souyuz.config[:silent])
48
+ end
49
+
50
+ #
51
+ # ios build stuff to follow..
52
+ #
53
+
54
+ def package_path
55
+ build_path = Souyuz.project.options[:output_path]
56
+ assembly_name = Souyuz.project.options[:assembly_name]
57
+
58
+ package_path = Dir.glob("#{build_path}/#{assembly_name} *").sort.last
59
+ end
60
+
61
+ def ipa_file
62
+ assembly_name = Souyuz.project.options[:assembly_name]
63
+
64
+ "#{package_path}/#{assembly_name}.ipa"
65
+ end
66
+
67
+ def compress_and_move_dsym
68
+ require 'fileutils'
69
+ build_path = Souyuz.project.options[:output_path]
70
+ assembly_name = Souyuz.project.options[:assembly_name]
71
+ dsym_path = "#{build_path}/#{assembly_name}.app.dSYM"
72
+
73
+ # compress dsym using zip
74
+ if File.exists? dsym_path
75
+ zip = ENV['SOUYUZ_ZIP_PATH'] || 'zip'
76
+ command = "#{zip} -r #{dsym_path}.zip #{dsym_path}"
77
+ Helper.backticks(command, print: !Souyuz.config[:silent])
78
+ dsym_path = "#{dsym_path}.zip"
79
+ end
80
+
81
+ # move dsym aside ipa
82
+ if File.exists? dsym_path
83
+ FileUtils.mv(dsym_path, "#{package_path}/#{File.basename dsym_path}")
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,5 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Souyuz
3
+ VERSION = "0.1.0"
4
+ DESCRIPTION = "A fastlane component to make Xamarin builds a breeze"
5
+ end
data/lib/souyuz.rb ADDED
@@ -0,0 +1,32 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'souyuz/version'
3
+ require 'souyuz/platform'
4
+ require 'souyuz/manager'
5
+ require 'souyuz/generators/build_command_generator'
6
+ require 'souyuz/runner'
7
+ require 'souyuz/options'
8
+ require 'souyuz/detect_values'
9
+ require 'souyuz/msbuild/project'
10
+ require 'souyuz/msbuild/solution'
11
+ require 'souyuz/msbuild/solution_parser'
12
+
13
+ require 'fastlane_core'
14
+
15
+ module Souyuz
16
+ class << self
17
+ attr_accessor :config
18
+
19
+ attr_accessor :project
20
+
21
+ attr_accessor :cache
22
+
23
+ def config=(value)
24
+ @config = value
25
+ DetectValues.set_additional_default_values
26
+ @cache = {}
27
+ end
28
+ end
29
+
30
+ Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
31
+ UI = FastlaneCore::UI
32
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: souyuz
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Felix Rudat
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: fastlane_core
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.41.2
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: 1.0.0
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.41.2
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: magic_encoding
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: bundler
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rake
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 3.1.0
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 3.1.0
103
+ description: A fastlane component to make Xamarin builds a breeze
104
+ email: voydz@hotmail.com
105
+ executables:
106
+ - souyuz
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - LICENSE
111
+ - README.md
112
+ - bin/souyuz
113
+ - lib/souyuz.rb
114
+ - lib/souyuz/commands_generator.rb
115
+ - lib/souyuz/detect_values.rb
116
+ - lib/souyuz/generators/android_zipalign_command_generator.rb
117
+ - lib/souyuz/generators/build_command_generator.rb
118
+ - lib/souyuz/generators/java_sign_command_generator.rb
119
+ - lib/souyuz/manager.rb
120
+ - lib/souyuz/msbuild/project.rb
121
+ - lib/souyuz/msbuild/solution.rb
122
+ - lib/souyuz/msbuild/solution_parser.rb
123
+ - lib/souyuz/options.rb
124
+ - lib/souyuz/platform.rb
125
+ - lib/souyuz/runner.rb
126
+ - lib/souyuz/version.rb
127
+ homepage: http://rubygems.org/gems/souyuz
128
+ licenses:
129
+ - MIT
130
+ metadata: {}
131
+ post_install_message:
132
+ rdoc_options: []
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: 2.0.0
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ requirements: []
146
+ rubyforge_project:
147
+ rubygems_version: 2.5.0
148
+ signing_key:
149
+ specification_version: 4
150
+ summary: A fastlane component to make Xamarin builds a breeze
151
+ test_files: []