motion-swifty 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 813fa05d52f83aab5b418daa5d3a63ffbbfb895b
4
+ data.tar.gz: c4e2d8c746d3c5862833e5a041efd78dad2abb51
5
+ SHA512:
6
+ metadata.gz: b7fd61b1a1ae5fea2a1e25c48a8939d35f8d2ff0c99d63c0bf2f507c2b1653656c98a4062349c8db83b6185ec32914af3bf3ebb1bcb36dd87bd5edea05d9be57
7
+ data.tar.gz: d2d9aeff083df3fcb769ab6d8a42ea9313a7d32af9938a8160e660802dc6dfe5d86797cfbe00e0ac469bcade8e2c9fb06cfff201b7ec532532558200b7377239
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # Swifty
2
+
3
+ A simple and clean way to use Swift dependencies in your RubyMotion project.
4
+
5
+
6
+ ## Setup
7
+
8
+ - brew install carthage
9
+ - brew install swiftlint
10
+ - add 'motion-swifty' to your Gemfile
11
+ - bundle install
12
+
13
+ Define your dependencies inside your Rakefile:
14
+
15
+ ```ruby
16
+ ###
17
+ app.cartfile do
18
+ cart 'github "nickoneill/PermissionScope" "master"'
19
+ cart '"file:///directory/to/project" "branch"', name: "MyFramework"
20
+ end
21
+ ```
22
+
23
+ - rake swifty:install
24
+ - rake
25
+
26
+
27
+ ## Todo
28
+
29
+ - Support other platforms than iOS, if you need it please open an issue
30
+
31
+
32
+ ## Thanks
33
+
34
+ Thanks to [Mark Villacampa](https://twitter.com/MarkVillacampa) who did all the hard work in RubyMotion to make this possible.
@@ -0,0 +1,21 @@
1
+ unless defined?(Motion::Project::Config)
2
+ raise "This file must be required within a RubyMotion project Rakefile."
3
+ end
4
+
5
+ if Motion::Project::App.template != :ios
6
+ fail('This file must be required within a RubyMotion iOS project.')
7
+ end
8
+
9
+ module Motion::Project
10
+ class Config
11
+ variable :swifty
12
+
13
+ def swifty
14
+ @swifty ||= MotionSwifty::Swifty.new(self)
15
+ end
16
+
17
+ def cartfile(&block)
18
+ swifty.instance_eval(&block) if block
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ namespace :build do
2
+ task :device => 'swifty:build_device'
3
+ task :simulator => 'swifty:build_sim'
4
+ end
5
+
6
+ namespace :clean do
7
+ task :all => 'swifty:clean'
8
+ end
9
+
10
+ namespace :swifty do
11
+ desc 'Download and build dependencies'
12
+ task :install do
13
+ App.config.swifty.setup
14
+ end
15
+
16
+ task :build_sim do
17
+ App.config.swifty.configure_platform("iPhoneSimulator")
18
+ end
19
+ task :build_device do
20
+ App.config.swifty.configure_platform("iPhoneOS")
21
+ end
22
+
23
+ task :clean do
24
+ paths = ["./vendor/Carts", "./Carthage", "Cartfile"]
25
+ paths.each do |path|
26
+ if File.exist?(path)
27
+ App.info('Delete', path)
28
+ rm_rf path
29
+ end
30
+ end
31
+ App.info('Info', 'You will need to run `rake swifty:install` to reinstall your swift dependencies')
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ module MotionSwifty
2
+ class Cart
3
+ attr_accessor :definition
4
+ attr_accessor :options
5
+
6
+ def initialize(definition, options = {})
7
+ @definition = definition
8
+ @options = options
9
+ end
10
+
11
+ def name
12
+ self.options.fetch(:name) do
13
+ if match = @definition.match(/.* ".*\/(.*?)"/i)
14
+ match.captures.first
15
+ else
16
+ raise "Couldn’t extract cart name from its Cartfile definition"
17
+ end
18
+ end
19
+ end
20
+
21
+ def path(plaform = "iOS")
22
+ File.expand_path("./Carthage/Build/#{plaform}/#{name}.framework")
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,100 @@
1
+ module MotionSwifty
2
+ class Swifty
3
+ attr_reader :config
4
+ attr_accessor :carts
5
+
6
+ def initialize(config)
7
+ @config = config
8
+ @carts = []
9
+ end
10
+
11
+ def cartfile(&block)
12
+ self.instance_eval(&block)
13
+ end
14
+
15
+ def cart(cart, options = {})
16
+ @carts << Cart.new(cart, options)
17
+ end
18
+
19
+ def setup
20
+ generate_cartfile(self.carts)
21
+ pull_frameworks(carthage_platform(config.template))
22
+ copy_frameworks(self.config.archs, self.carts)
23
+ end
24
+
25
+ def configure_platform(platform)
26
+ frameworks = File.join(self.config.app_bundle(platform), "Frameworks")
27
+ update_swift_dlybs("./Cartfile", frameworks) do
28
+ clean_swift_dlybs(frameworks)
29
+ copy_swift_dlybs(platform)
30
+ end
31
+
32
+ self.config.embedded_frameworks += self.carts.map(&:path)
33
+ end
34
+
35
+ private
36
+
37
+ def update_swift_dlybs(cartfile, frameworks, &block)
38
+ lib_swift = Dir.glob(File.join(frameworks, '**/libswiftCore.dylib')).first
39
+ if !lib_swift || !File.exists?(lib_swift) || File.mtime(cartfile) > File.mtime(lib_swift)
40
+ block.call
41
+ end
42
+ end
43
+
44
+ def pull_frameworks(carthage_platform)
45
+ `carthage update --platform #{carthage_platform} --no-use-binaries`
46
+ end
47
+
48
+ def copy_frameworks(archs, carts)
49
+ ENV["TARGET_BUILD_DIR"] = File.expand_path("./vendor/Carts")
50
+ ENV["BUILT_PRODUCTS_DIR"] = File.expand_path("./vendor/Carts")
51
+
52
+ archs.each do |platform, platform_archs|
53
+ ENV["SCRIPT_INPUT_FILE_COUNT"] = carts.count.to_s
54
+ ENV["FRAMEWORKS_FOLDER_PATH"] = platform_archs.join(" ")
55
+ ENV["VALID_ARCHS"] = platform_archs.join(" ")
56
+
57
+ carts.each_with_index do |cart, index|
58
+ ENV["SCRIPT_INPUT_FILE_#{index}"] = cart.path
59
+ end
60
+
61
+ `carthage copy-frameworks`
62
+ end
63
+ end
64
+
65
+ def clean_swift_dlybs(dlybs_folder)
66
+ FileUtils.rm(Dir.glob(File.join(dlybs_folder, '**/libswift*.dylib')))
67
+ end
68
+
69
+ def carthage_platform(platform)
70
+ case platform
71
+ when :ios
72
+ "iOS"
73
+ else
74
+ "all"
75
+ end
76
+ end
77
+
78
+ def generate_cartfile(carts)
79
+ target = File.open("Cartfile", 'w+')
80
+ target.write(carts.map(&:definition).join("\r\n"))
81
+ target.close
82
+ end
83
+
84
+ def copy_swift_dlybs(platform)
85
+ dlybs = list_swift_dlybs(platform)
86
+ frameworks_path = File.join(File.dirname(self.config.app_bundle_executable(platform)), "Frameworks")
87
+ FileUtils.mkdir_p(frameworks_path)
88
+ dlybs.each do |dlyb|
89
+ FileUtils.cp(dlyb, frameworks_path)
90
+ end
91
+ end
92
+
93
+ def list_swift_dlybs(platform)
94
+ swift_stdlib_tool = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-stdlib-tool"
95
+ archs = self.config.archs[platform].join(' ')
96
+ bundle = Shellwords.escape("./vendor/Carts/#{archs}")
97
+ `#{swift_stdlib_tool} --print --scan-folder #{bundle} --platform #{platform.downcase}`.split
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+ require 'pathname'
3
+ require 'shellwords'
4
+ require 'motion/swifty/swifty'
5
+ require 'motion/swifty/cart'
6
+ require 'motion/project/project'
7
+ require 'motion/project/tasks'
8
+
9
+ module MotionSwifty
10
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: motion-swifty
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Joffrey JAFFEUX
8
+ - Mark VILLACAMPA
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-12-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ description: Swift dependencies in RubyMotion
29
+ email:
30
+ - j.jaffeux@gmail.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - README.md
36
+ - lib/motion-swifty.rb
37
+ - lib/motion/project/project.rb
38
+ - lib/motion/project/tasks.rb
39
+ - lib/motion/swifty/cart.rb
40
+ - lib/motion/swifty/swifty.rb
41
+ homepage: https://github.com/jjaffeux/swifty
42
+ licenses:
43
+ - MIT
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.5.1
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: A simple and clean way to use Swift dependencies in your RubyMotion project.y
65
+ test_files: []