motion-env 0.0.1
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 +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
|
+

|
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
|