motion-env 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +16 -0
- data/README.md +73 -0
- data/Rakefile +36 -0
- data/app/app_delegate.rb +28 -0
- data/lib/motion-env.rb +6 -0
- data/lib/motion-env/builder.rb +35 -0
- data/lib/motion-env/ios.rb +24 -0
- data/motion-env.gemspec +18 -0
- data/resources/Default-568h@2x.png +0 -0
- data/spec/main_spec.rb +9 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5e7939f4f64183ce081230914ff2af9c0a19b905
|
4
|
+
data.tar.gz: 4db4365eade8e759878f088255ff6c4a82ea9807
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a5a30de7157ebb32fa8f2aba8b2e6a37eff27a48cd3b41e732f4adb3074a8a7338b2c759fa7400a3fefda985893e287bf11a3ea4ccd41e4b16939bf579af54ff
|
7
|
+
data.tar.gz: 1ece939c2823090bb9a0f37c58c2801f8b78e776cbacc89e8224a5ac6317acb43106fc1016f8abe795d5ad98b48fba8dc639cc42b4fcab21bad3b29a2f4cbdf5
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/README.md
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# motion-env
|
2
|
+
|
3
|
+
`gem install motion-env`
|
4
|
+
|
5
|
+
In your `Rakefile`:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
require 'motion-env'
|
9
|
+
|
10
|
+
Motion::Project::App.setup do |app|
|
11
|
+
app.env['string'] = "Sup dog"
|
12
|
+
app.env["int"] = 3
|
13
|
+
app.env["bool"] = false
|
14
|
+
app.env['hash'] = {herp: "derp"}
|
15
|
+
app.env["array"] = [1,2,3]
|
16
|
+
app.env["complex"] = [{hello: "world", array: [1,2,3]}, {something: :else}]
|
17
|
+
end
|
18
|
+
```
|
19
|
+
|
20
|
+
(`app.ENV` will also work, if you prefer symmetry)
|
21
|
+
|
22
|
+
In your app:
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
> ENV['string']
|
26
|
+
=> "Sup dog"
|
27
|
+
> ENV['int']
|
28
|
+
=> 3
|
29
|
+
> ENV['bool']
|
30
|
+
=> false
|
31
|
+
(main)> ENV['hash']
|
32
|
+
=> {:herp=>"derp"}
|
33
|
+
> ENV['array']
|
34
|
+
=> [1, 2, 3]
|
35
|
+
> ENV['complex']
|
36
|
+
=> [{:hello=>"world", :array=>[1, 2, 3]}, {:something=>:else}]
|
37
|
+
```
|
38
|
+
|
39
|
+
# How?
|
40
|
+
|
41
|
+
![wtf](http://i.imgur.com/e0nv2G9.gif)
|
42
|
+
|
43
|
+
motion-env takes whatever you put in `app.env` and `Marshal`'s the contents into `ENV` via code generation. At the same time, it swizzles `[](key)` to un-marshal the value (if appropriate). See [builder.rb](lib/motion-env/builder.rb) for implementation.
|
44
|
+
|
45
|
+
That means you can also Marshal POROs, assuming the class exists on both sides of the compilation:
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
class Person
|
49
|
+
attr_accessor :name, :age
|
50
|
+
|
51
|
+
def initialize(name, age)
|
52
|
+
@name = name
|
53
|
+
@age = age
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
Motion::Project::App.setup do |app|
|
58
|
+
app.env["object"] = Person.new("clay", 3)
|
59
|
+
end
|
60
|
+
```
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
> ENV["object"] # assumes you have Person defined somewhere
|
64
|
+
=> #<Person:0x8e62da0 @name="clay" @age=3>
|
65
|
+
```
|
66
|
+
|
67
|
+
# Support
|
68
|
+
|
69
|
+
Big thanks to [motion-my_env](https://github.com/ainame/motion-my_env) and [@ainame](https://twitter.com/ainame) for the inspiration.
|
70
|
+
|
71
|
+
[Clay Allsopp](http://clayallsopp.com/)
|
72
|
+
- [clay@usepropeller.com](mailto:clay@usepropeller.com)
|
73
|
+
- [@clayallsopp](https://twitter.com/clayallsopp)
|
data/Rakefile
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
$:.unshift("/Library/RubyMotion/lib")
|
3
|
+
require 'motion/project/template/ios'
|
4
|
+
|
5
|
+
require "bundler/gem_tasks"
|
6
|
+
require "bundler/setup"
|
7
|
+
|
8
|
+
|
9
|
+
begin
|
10
|
+
require 'bundler'
|
11
|
+
Bundler.require
|
12
|
+
rescue LoadError
|
13
|
+
end
|
14
|
+
|
15
|
+
Motion::Project::App.setup do |app|
|
16
|
+
# Use `rake config' to see complete project settings.
|
17
|
+
app.name = 'motion-env'
|
18
|
+
|
19
|
+
app.ENV['hash'] = {herp: "derp"}
|
20
|
+
app.env['string'] = "Sup dog"
|
21
|
+
app.env["int"] = 3
|
22
|
+
app.env["bool"] = false
|
23
|
+
app.env["array"] = [1,2,3]
|
24
|
+
app.env["complex"] = [{hello: "world", array: [1,2,3]}, {something: :else}]
|
25
|
+
|
26
|
+
class Person
|
27
|
+
attr_accessor :name, :age
|
28
|
+
|
29
|
+
def initialize(name, age)
|
30
|
+
@name = name
|
31
|
+
@age = age
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
app.env["object"] = Person.new("clay", 3)
|
36
|
+
end
|
data/app/app_delegate.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
class Person
|
2
|
+
attr_accessor :name, :age
|
3
|
+
end
|
4
|
+
|
5
|
+
class AppDelegate
|
6
|
+
def application(application, didFinishLaunchingWithOptions:launchOptions)
|
7
|
+
puts ENV['hello world']
|
8
|
+
|
9
|
+
expected = [
|
10
|
+
['string', "Sup dog"],
|
11
|
+
['int', 3],
|
12
|
+
['bool', false],
|
13
|
+
['hash', {:herp=>"derp"}],
|
14
|
+
['array', [1,2,3]],
|
15
|
+
['complex', [{:hello=>"world", :array=>[1, 2, 3]}, {:something=>:else}]]
|
16
|
+
]
|
17
|
+
|
18
|
+
expected.each do |key, value|
|
19
|
+
real_value = ENV[key]
|
20
|
+
raise "Incorrect! Key: #{key} Expected: #{value} Actual: #{real_value}" if value != real_value
|
21
|
+
end
|
22
|
+
|
23
|
+
person = ENV['object']
|
24
|
+
raise "Incorrect object unmarshal" if !person.is_a?(Person) || person.name != 'clay' || person.age != 3
|
25
|
+
|
26
|
+
true
|
27
|
+
end
|
28
|
+
end
|
data/lib/motion-env.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Motion; module Project;
|
2
|
+
class Builder
|
3
|
+
MARSHAL_SIGIL = "__marshall__"
|
4
|
+
def build_with_env(config, platform, opts)
|
5
|
+
config_env = config.env
|
6
|
+
File.open(config_env.file_path, 'w') { |f|
|
7
|
+
f.write %Q{
|
8
|
+
ENV.instance_variable_set("@get_key_without_patch", ENV.method(:[]))
|
9
|
+
ENV.instance_eval do
|
10
|
+
def [](key)
|
11
|
+
value = @get_key_without_patch.call(key)
|
12
|
+
if value && value.start_with?("#{MARSHAL_SIGIL}")
|
13
|
+
value = Marshal.load(value.gsub("#{MARSHAL_SIGIL}", ""))
|
14
|
+
end
|
15
|
+
value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
}
|
19
|
+
config_env.each do |key, value|
|
20
|
+
dump_value = value
|
21
|
+
if !value.is_a?(String)
|
22
|
+
dump_value = MARSHAL_SIGIL + Marshal.dump(value)
|
23
|
+
end
|
24
|
+
f.write "ENV['#{key.to_s}'] = '#{dump_value}'\n"
|
25
|
+
end
|
26
|
+
}
|
27
|
+
config.files << config_env.file_path
|
28
|
+
|
29
|
+
build_without_env(config, platform, opts)
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method "build_without_env", "build"
|
33
|
+
alias_method "build", "build_with_env"
|
34
|
+
end
|
35
|
+
end; end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Motion; module Project;
|
2
|
+
class IOSConfig
|
3
|
+
variable :env
|
4
|
+
|
5
|
+
class EnvWrapper < Hash
|
6
|
+
attr_accessor :timestamp
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
super
|
10
|
+
@timestamp = Time.now.to_i
|
11
|
+
end
|
12
|
+
|
13
|
+
def file_path
|
14
|
+
@file_path ||= "/tmp/motion_env_#{@timestamp}.rb"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def env
|
19
|
+
@env ||= EnvWrapper.new
|
20
|
+
end
|
21
|
+
|
22
|
+
alias_method :ENV, :env
|
23
|
+
end
|
24
|
+
end; end
|
data/motion-env.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "motion-env"
|
5
|
+
s.version = "0.0.1"
|
6
|
+
s.authors = ["Clay Allsopp"]
|
7
|
+
s.email = ["clay@usepropeller.com"]
|
8
|
+
s.homepage = "https://github.com/usepropeller/motion-env"
|
9
|
+
s.summary = "Add things to ENV in RubyMotion"
|
10
|
+
s.description = "Add things to ENV in RubyMotion"
|
11
|
+
|
12
|
+
s.files = `git ls-files`.split($\)
|
13
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
14
|
+
s.require_paths = ["lib"]
|
15
|
+
s.license = 'MIT'
|
16
|
+
|
17
|
+
s.add_development_dependency 'rake'
|
18
|
+
end
|
Binary file
|
data/spec/main_spec.rb
ADDED
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motion-env
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Clay Allsopp
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Add things to ENV in RubyMotion
|
28
|
+
email:
|
29
|
+
- clay@usepropeller.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- .gitignore
|
35
|
+
- Gemfile
|
36
|
+
- Gemfile.lock
|
37
|
+
- README.md
|
38
|
+
- Rakefile
|
39
|
+
- app/app_delegate.rb
|
40
|
+
- lib/motion-env.rb
|
41
|
+
- lib/motion-env/builder.rb
|
42
|
+
- lib/motion-env/ios.rb
|
43
|
+
- motion-env.gemspec
|
44
|
+
- resources/Default-568h@2x.png
|
45
|
+
- spec/main_spec.rb
|
46
|
+
homepage: https://github.com/usepropeller/motion-env
|
47
|
+
licenses:
|
48
|
+
- MIT
|
49
|
+
metadata: {}
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 2.0.3
|
67
|
+
signing_key:
|
68
|
+
specification_version: 4
|
69
|
+
summary: Add things to ENV in RubyMotion
|
70
|
+
test_files:
|
71
|
+
- spec/main_spec.rb
|