passive_resource 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README +46 -0
- data/Rakefile +8 -0
- data/lib/passive_resource/base.rb +72 -0
- data/lib/passive_resource/error.rb +3 -0
- data/lib/passive_resource/version.rb +3 -0
- data/lib/passive_resource.rb +7 -0
- data/passive_resource.gemspec +35 -0
- data/spec/.rspec +4 -0
- data/spec/base_spec.rb +53 -0
- data/spec/spec_helper.rb +8 -0
- metadata +92 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
Use passive resource to create on instances from hashes especially from third party apis.
|
2
|
+
Allows for the ability place hash manipulation logic in one neat place
|
3
|
+
|
4
|
+
Examples:
|
5
|
+
|
6
|
+
used with a hash or hash like object
|
7
|
+
> require 'passive_resource'
|
8
|
+
=> true
|
9
|
+
> class NewClass < PassiveResource::Base
|
10
|
+
> def whole_name; "#{first_name} #{last_name}" end
|
11
|
+
> end
|
12
|
+
=> nil
|
13
|
+
> instance = NewClass.new(:first_name => 'grady', :last_name => 'griffin')
|
14
|
+
=> {"first_name"=>"grady", "last_name"=>"griffin"}
|
15
|
+
> instance.first_name
|
16
|
+
=> "grady"
|
17
|
+
> instance.whole_name
|
18
|
+
=> "grady griffin"
|
19
|
+
|
20
|
+
|
21
|
+
Used as with an api returning json
|
22
|
+
|
23
|
+
> class FacebookProfile < PassiveResource::Base
|
24
|
+
> end
|
25
|
+
=> nil
|
26
|
+
> facebook = FacebookProfile.new('https://graph.facebook.com/19292868552')
|
27
|
+
=> {"id"=>"19292868552", "name"=>"Facebook Platform", "picture"=>"http://profile.ak.fbcdn.net/hprofile-ak-ash2/276791_19292868552_1958181823_s.jpg", "link"=>"http://www.facebook.com/platform", "likes"=>3923792, "category"=>"Product/service", "website"=>"http://developers.facebook.com", "username"=>"platform", "founded"=>"2007", "company_overview"=>"Facebook Platform enables anyone to build social apps on Facebook and the web.", "mission"=>"To make the web more open and social.", "about"=>"We're building the social web. Get the latest here: developers.facebook.com ", "talking_about_count"=>74536}
|
28
|
+
> facebook.talking_about_count
|
29
|
+
=> 74536
|
30
|
+
> facebook.founded
|
31
|
+
=> "2007"
|
32
|
+
|
33
|
+
Works with code that was previously using hashes
|
34
|
+
|
35
|
+
> facebook['talking_about_count']
|
36
|
+
=> 74536
|
37
|
+
> facebook[:founded]
|
38
|
+
=> "2007"
|
39
|
+
|
40
|
+
Objects are nested automatically
|
41
|
+
> instance = NewClass.new(:locations => [{:city => 'Orlando', :state => "FL"}, {:city => 'Greenwood', :state => "SC"}])
|
42
|
+
=> {"locations"=>[{"city"=>"Orlando", "state"=>"FL"}, {"city"=>"Greenwood", "state"=>"SC"}]}
|
43
|
+
> instance.locations
|
44
|
+
=> [{"city"=>"Orlando", "state"=>"FL"}, {"city"=>"Greenwood", "state"=>"SC"}]
|
45
|
+
> instance.locations.first.city
|
46
|
+
=> "Orlando"
|
data/Rakefile
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module PassiveResource
|
2
|
+
class Base
|
3
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
4
|
+
require 'active_support/json'
|
5
|
+
require 'rest_client'
|
6
|
+
|
7
|
+
HASH_METHODS = (ActiveSupport::HashWithIndifferentAccess.new.methods - Object.new.methods)
|
8
|
+
|
9
|
+
def initialize(p = {})
|
10
|
+
p = load_from_url(p) if p.is_a?(String)
|
11
|
+
if self.class.nestable?(p)
|
12
|
+
@seedling = ActiveSupport::HashWithIndifferentAccess.new(p)
|
13
|
+
elsif self.class.collection?(p)
|
14
|
+
@seedling = self.class.many(p)
|
15
|
+
else
|
16
|
+
raise PassiveResource::InvalidSeedlingException, "A hash like object or a collection of hash like objects is required"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def seedling
|
21
|
+
@seedling
|
22
|
+
end
|
23
|
+
|
24
|
+
def respond_to?(method)
|
25
|
+
return true if super
|
26
|
+
accessor = method.to_s.gsub(/\=$/,'')
|
27
|
+
@seedling.has_key?(accessor) or HASH_METHODS.include?(method)
|
28
|
+
end
|
29
|
+
|
30
|
+
def [](key)
|
31
|
+
if self.class.nestable?(@seedling[key])
|
32
|
+
@seedling[key] = self.class.new(@seedling[key])
|
33
|
+
elsif self.class.collection?(@seedling[key])
|
34
|
+
@seedling[key] = self.class.many(@seedling[key])
|
35
|
+
end
|
36
|
+
@seedling[key]
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.many(ary)
|
40
|
+
ary = [ary].compact.flatten
|
41
|
+
ary.collect {|hash| nestable?(hash) ? new(hash) : hash }
|
42
|
+
end
|
43
|
+
|
44
|
+
def method_missing(method_sym, *arguments, &block)
|
45
|
+
accessor = method_sym.to_s.gsub(/\=$/,'')
|
46
|
+
if @seedling.has_key?(accessor)
|
47
|
+
accessor == method_sym.to_s ? self[accessor] : @seedling[accessor] = arguments.first
|
48
|
+
elsif HASH_METHODS.include?(method_sym)
|
49
|
+
@seedling.send(method_sym, *arguments, &block)
|
50
|
+
else
|
51
|
+
super
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def inspect
|
56
|
+
@seedling.inspect
|
57
|
+
end
|
58
|
+
|
59
|
+
def load_from_url(url)
|
60
|
+
rtn = RestClient.get(url)
|
61
|
+
JSON.parse(rtn)
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.nestable?(obj)
|
65
|
+
['ActiveSupport::HashWithIndifferentAccess', 'HashWithIndifferentAccess', 'Hash'].include?(obj.class.to_s)
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.collection?(obj)
|
69
|
+
['Array', 'WillPaginate::Collection'].include?(obj.class.to_s)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "passive_resource/version"
|
4
|
+
require "passive_resource/base"
|
5
|
+
require "passive_resource/error"
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "passive_resource"
|
9
|
+
s.version = PassiveResource::VERSION
|
10
|
+
s.authors = ["Grady Griffin"]
|
11
|
+
s.email = ["gradyg@izea.com"]
|
12
|
+
s.homepage = ""
|
13
|
+
s.summary = %q{Simple objects from json}
|
14
|
+
s.description = %q{Creates Ruby objects from JSON requested from apis or hashes}
|
15
|
+
|
16
|
+
s.rubyforge_project = "passive_resource"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
# specify any dependencies here; for example:
|
24
|
+
# s.add_development_dependency "rspec"
|
25
|
+
# s.add_runtime_dependency "rest-client"
|
26
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_dependency("activesupport", '> 2.3')
|
28
|
+
s.add_dependency "rest-client"
|
29
|
+
s.add_dependency "rspec"
|
30
|
+
else
|
31
|
+
s.add_runtime_dependency("activesupport", '> 2.3')
|
32
|
+
s.add_runtime_dependency "rest-client"
|
33
|
+
s.add_development_dependency "rspec"
|
34
|
+
end
|
35
|
+
end
|
data/spec/.rspec
ADDED
data/spec/base_spec.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe PassiveResource::Base, "#new" do
|
3
|
+
it "should return a PassiveResource::Base instance" do
|
4
|
+
instance = PassiveResource::Base.new
|
5
|
+
instance.class.to_s.should eq('PassiveResource::Base')
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should define methods as specified in the hash" do
|
9
|
+
instance = PassiveResource::Base.new(:name => 'grady')
|
10
|
+
instance.name.should eq('grady')
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should nest PassiveResource::Base objects" do
|
14
|
+
instance = PassiveResource::Base.new(:location => {:city => 'Orlando'})
|
15
|
+
instance.location.class.to_s.should eq('PassiveResource::Base')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should nest PassiveResource::Base objects within collections" do
|
19
|
+
instance = PassiveResource::Base.new(:cities => [{:city => 'Orlando'}, {:city => 'Greenwood'}])
|
20
|
+
instance.cities.all? {|item| item.is_a?(PassiveResource::Base)}.should eq(true)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should respond to Hash methods" do
|
24
|
+
instance = PassiveResource::Base.new(:name => 'grady')
|
25
|
+
PassiveResource::Base::HASH_METHODS.all? {|m| instance.respond_to?(m)}.should eq(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should respond to created methods" do
|
29
|
+
instance = PassiveResource::Base.new(:name => 'grady')
|
30
|
+
instance.respond_to?('name').should eq(true)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe PassiveResource::Base, "#seedling" do
|
35
|
+
it "should have a seedling equal to the hash" do
|
36
|
+
instance = PassiveResource::Base.new(:name => 'grady')
|
37
|
+
instance.seedling['name'].should eq('grady')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe PassiveResource::Base, "#many" do
|
42
|
+
it "should return a collection of PassiveResource::Base objects" do
|
43
|
+
instances = PassiveResource::Base.many(:cities => [{:city => 'Orlando'}, {:city => 'Greenwood'}])
|
44
|
+
instances.all? {|item| item.is_a?(PassiveResource::Base)}.should eq(true)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe PassiveResource::Base, "#inspect" do
|
49
|
+
it "should return the seedling to_s" do
|
50
|
+
instance = PassiveResource::Base.new(:name => 'grady')
|
51
|
+
instance.inspect.should eq("{\"name\"=>\"grady\"}")
|
52
|
+
end
|
53
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: passive_resource
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Grady Griffin
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: &70256019607440 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>'
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2.3'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70256019607440
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rest-client
|
27
|
+
requirement: &70256019606840 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70256019606840
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70256020759600 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70256020759600
|
47
|
+
description: Creates Ruby objects from JSON requested from apis or hashes
|
48
|
+
email:
|
49
|
+
- gradyg@izea.com
|
50
|
+
executables: []
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- .gitignore
|
55
|
+
- Gemfile
|
56
|
+
- README
|
57
|
+
- Rakefile
|
58
|
+
- lib/passive_resource.rb
|
59
|
+
- lib/passive_resource/base.rb
|
60
|
+
- lib/passive_resource/error.rb
|
61
|
+
- lib/passive_resource/version.rb
|
62
|
+
- passive_resource.gemspec
|
63
|
+
- spec/.rspec
|
64
|
+
- spec/base_spec.rb
|
65
|
+
- spec/spec_helper.rb
|
66
|
+
homepage: ''
|
67
|
+
licenses: []
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
requirements: []
|
85
|
+
rubyforge_project: passive_resource
|
86
|
+
rubygems_version: 1.8.15
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Simple objects from json
|
90
|
+
test_files:
|
91
|
+
- spec/base_spec.rb
|
92
|
+
- spec/spec_helper.rb
|