nestful 0.0.8 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/README.markdown +11 -37
- data/Rakefile +1 -14
- data/examples/resource.rb +6 -0
- data/lib/nestful/.DS_Store +0 -0
- data/lib/nestful/connection.rb +107 -245
- data/lib/nestful/endpoint.rb +42 -0
- data/lib/nestful/exceptions.rb +1 -1
- data/lib/nestful/formats/form_format.rb +3 -3
- data/lib/nestful/formats/json_format.rb +10 -9
- data/lib/nestful/formats/multipart_format.rb +9 -8
- data/lib/nestful/formats.rb +19 -16
- data/lib/nestful/helpers.rb +41 -0
- data/lib/nestful/request.rb +73 -96
- data/lib/nestful/resource.rb +144 -27
- data/lib/nestful/response/headers.rb +31 -0
- data/lib/nestful/response.rb +47 -0
- data/lib/nestful/version.rb +3 -0
- data/lib/nestful.rb +17 -30
- data/nestful.gemspec +14 -54
- metadata +21 -28
- data/lib/nestful/formats/blank_format.rb +0 -13
- data/lib/nestful/formats/text_format.rb +0 -17
- data/lib/nestful/formats/xml_format.rb +0 -34
- data/lib/nestful/oauth.rb +0 -24
- data/lib/nestful/request/callbacks.rb +0 -28
data/lib/nestful/resource.rb
CHANGED
@@ -1,38 +1,155 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
1
3
|
module Nestful
|
2
4
|
class Resource
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
def self.endpoint(value = nil)
|
6
|
+
@endpoint = value if value
|
7
|
+
@endpoint || ''
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.url(value = nil)
|
11
|
+
@url = value if value
|
12
|
+
@url ? URI.join(endpoint, @url) : raise('Must define url')
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.options(value = nil)
|
16
|
+
@options = value if value
|
17
|
+
@options || {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.get(url, params = {}, options = {})
|
21
|
+
request(url, options.merge(:method => :get, :params => params))
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.put(url, params = {}, options = {})
|
25
|
+
request(url, options.merge(:method => :put, :params => params))
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.post(url, params = {}, options = {})
|
29
|
+
request(url, options.merge(:method => :post, :params => params))
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.delete(url, params = {}, options = {})
|
33
|
+
request(url, options.merge(:method => :delete, :params => params))
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.request(url, options = {})
|
37
|
+
Request.new(url, self.options.merge(options)).execute
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.all
|
41
|
+
self.new(get(url))
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.find(id)
|
45
|
+
self.new(get(URI.join(url, id.to_s)))
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.new(attributes = {}, options = {})
|
49
|
+
if attributes.is_a?(Array)
|
50
|
+
attributes.map {|set| super(set, options) }
|
51
|
+
else
|
52
|
+
super
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
attr_reader :attributes, :options
|
57
|
+
|
58
|
+
def initialize(attributes = {}, options = {})
|
59
|
+
@attributes = indifferent_attributes(attributes.to_hash)
|
60
|
+
@options = self.class.options.merge(options)
|
61
|
+
end
|
62
|
+
|
63
|
+
def get(*args)
|
64
|
+
self.class.get(url, *args)
|
8
65
|
end
|
9
|
-
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
self.class.
|
66
|
+
|
67
|
+
def put(*args)
|
68
|
+
self.class.put(url, *args)
|
69
|
+
end
|
70
|
+
|
71
|
+
def post(*args)
|
72
|
+
self.class.post(url, *args)
|
73
|
+
end
|
74
|
+
|
75
|
+
def delete(*args)
|
76
|
+
self.class.delete(url, *args)
|
77
|
+
end
|
78
|
+
|
79
|
+
alias_method :destroy, :delete
|
80
|
+
|
81
|
+
def url
|
82
|
+
URI.join(self.class.url, self.id.to_s)
|
83
|
+
end
|
84
|
+
|
85
|
+
def id #:nodoc:
|
86
|
+
self['id']
|
87
|
+
end
|
88
|
+
|
89
|
+
def type #:nodoc:
|
90
|
+
self['type']
|
91
|
+
end
|
92
|
+
|
93
|
+
def [](key)
|
94
|
+
attributes[key]
|
16
95
|
end
|
17
|
-
|
18
|
-
def
|
19
|
-
|
96
|
+
|
97
|
+
def []=(key,value)
|
98
|
+
attributes[key] = value
|
20
99
|
end
|
21
100
|
|
22
|
-
def
|
23
|
-
|
101
|
+
def to_hash
|
102
|
+
@attributes.dup
|
24
103
|
end
|
25
|
-
|
26
|
-
|
27
|
-
|
104
|
+
|
105
|
+
alias_method :as_json, :to_hash
|
106
|
+
|
107
|
+
def to_json(*)
|
108
|
+
as_json.to_json
|
28
109
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
110
|
+
|
111
|
+
alias_method :respond_to_without_attributes?, :respond_to?
|
112
|
+
|
113
|
+
def respond_to?(method, include_priv = false)
|
114
|
+
method_name = method.to_s
|
115
|
+
if attributes.nil?
|
116
|
+
super
|
117
|
+
elsif method_name =~ /(?:=|\?)$/ && attributes.include?($`)
|
118
|
+
true
|
119
|
+
else
|
120
|
+
super
|
121
|
+
end
|
32
122
|
end
|
33
|
-
|
34
|
-
|
35
|
-
|
123
|
+
|
124
|
+
protected
|
125
|
+
|
126
|
+
def indifferent_attributes(attributes)
|
127
|
+
attributes = indifferent_hash.merge(attributes)
|
128
|
+
attributes.each do |key, value|
|
129
|
+
next unless value.is_a?(Hash)
|
130
|
+
attributes[key] = indifferent_attributes(value)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Creates a Hash with indifferent access.
|
135
|
+
def indifferent_hash
|
136
|
+
Hash.new {|hash,key| hash[key.to_s] if Symbol === key }
|
137
|
+
end
|
138
|
+
|
139
|
+
def method_missing(method_symbol, *arguments) #:nodoc:
|
140
|
+
method_name = method_symbol.to_s
|
141
|
+
|
142
|
+
if method_name =~ /(=|\?)$/
|
143
|
+
case $1
|
144
|
+
when "="
|
145
|
+
attributes[$`] = arguments.first
|
146
|
+
when "?"
|
147
|
+
attributes[$`]
|
148
|
+
end
|
149
|
+
else
|
150
|
+
return attributes[method_name] if attributes.include?(method_name)
|
151
|
+
super
|
152
|
+
end
|
36
153
|
end
|
37
154
|
end
|
38
|
-
end
|
155
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Nestful
|
2
|
+
class Response #:nodoc:
|
3
|
+
class Headers
|
4
|
+
include ::Net::HTTPHeader
|
5
|
+
|
6
|
+
def initialize(header = {})
|
7
|
+
@header = header
|
8
|
+
end
|
9
|
+
|
10
|
+
def ==(other)
|
11
|
+
@header == other
|
12
|
+
end
|
13
|
+
|
14
|
+
def inspect
|
15
|
+
@header.inspect
|
16
|
+
end
|
17
|
+
|
18
|
+
def method_missing(name, *args, &block)
|
19
|
+
if @header.respond_to?(name)
|
20
|
+
@header.send(name, *args, &block)
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def respond_to?(method)
|
27
|
+
super || @header.respond_to?(method)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Nestful
|
2
|
+
class Response
|
3
|
+
attr_reader :response, :body, :headers, :parser
|
4
|
+
|
5
|
+
def initialize(response, parser = nil)
|
6
|
+
@response = response
|
7
|
+
@body = response.body
|
8
|
+
@headers = Headers.new(response.to_hash)
|
9
|
+
@format = Formats.for(headers.content_type)
|
10
|
+
@parser ||= @format && @format.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def as_json
|
14
|
+
decoded
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_json(*)
|
18
|
+
as_json.to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
def code
|
22
|
+
response.code.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
def decoded
|
26
|
+
@decoded ||= parser ? parser.decode(body) : body
|
27
|
+
end
|
28
|
+
|
29
|
+
def respond_to?(name)
|
30
|
+
super || decoded.respond_to?(name) || response.respond_to?(name)
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def method_missing(name, *args, &block)
|
36
|
+
if decoded.respond_to?(name)
|
37
|
+
decoded.send(name, *args, &block)
|
38
|
+
elsif response.respond_to?(name)
|
39
|
+
response.send(name, *args, &block)
|
40
|
+
else
|
41
|
+
super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
require 'nestful/response/headers'
|
data/lib/nestful.rb
CHANGED
@@ -1,43 +1,30 @@
|
|
1
|
-
require '
|
2
|
-
require 'uri'
|
3
|
-
require 'tempfile'
|
4
|
-
|
5
|
-
require 'active_support/core_ext'
|
6
|
-
require 'active_support/inflector'
|
7
|
-
|
8
|
-
$:.unshift(File.dirname(__FILE__))
|
9
|
-
|
1
|
+
require 'nestful/version'
|
10
2
|
require 'nestful/exceptions'
|
11
|
-
require 'nestful/formats'
|
12
|
-
require 'nestful/connection'
|
13
|
-
require 'nestful/request/callbacks'
|
14
|
-
require 'nestful/request'
|
15
|
-
require 'nestful/resource'
|
16
3
|
|
17
4
|
module Nestful
|
5
|
+
autoload :Endpoint, 'nestful/endpoint'
|
6
|
+
autoload :Formats, 'nestful/formats'
|
7
|
+
autoload :Connection, 'nestful/connection'
|
8
|
+
autoload :Helpers, 'nestful/helpers'
|
9
|
+
autoload :Request, 'nestful/request'
|
10
|
+
autoload :Response, 'nestful/response'
|
11
|
+
autoload :Resource, 'nestful/resource'
|
12
|
+
|
18
13
|
extend self
|
19
14
|
|
20
|
-
def get(url,
|
21
|
-
|
15
|
+
def get(url, *args)
|
16
|
+
Endpoint[url].get(*args)
|
22
17
|
end
|
23
|
-
|
18
|
+
|
24
19
|
def post(url, options = {})
|
25
|
-
|
20
|
+
Endpoint[url].post(*args)
|
26
21
|
end
|
27
|
-
|
22
|
+
|
28
23
|
def put(url, options = {})
|
29
|
-
|
24
|
+
Endpoint[url].put(*args)
|
30
25
|
end
|
31
|
-
|
26
|
+
|
32
27
|
def delete(url, options = {})
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
def json_get(url, params = nil)
|
37
|
-
get(url, :format => :json, :params => params)
|
38
|
-
end
|
39
|
-
|
40
|
-
def json_post(url, params = nil)
|
41
|
-
post(url, :format => :json, :params => params)
|
28
|
+
Endpoint[url].delete(*args)
|
42
29
|
end
|
43
30
|
end
|
data/nestful.gemspec
CHANGED
@@ -1,58 +1,18 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'nestful/version'
|
5
5
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "nestful"
|
8
|
+
gem.version = Nestful::VERSION
|
9
|
+
gem.authors = ["Alex MacCaw"]
|
10
|
+
gem.email = ["info@eribium.org"]
|
11
|
+
gem.summary = %q{Simple Ruby HTTP/REST client with a sane API}
|
12
|
+
gem.homepage = "https://github.com/maccman/nestful"
|
9
13
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
s.email = %q{info@eribium.org}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"README.markdown"
|
17
|
-
]
|
18
|
-
s.files = [
|
19
|
-
".gitignore",
|
20
|
-
"MIT-LICENSE",
|
21
|
-
"README.markdown",
|
22
|
-
"Rakefile",
|
23
|
-
"VERSION",
|
24
|
-
"lib/nestful.rb",
|
25
|
-
"lib/nestful/connection.rb",
|
26
|
-
"lib/nestful/exceptions.rb",
|
27
|
-
"lib/nestful/formats.rb",
|
28
|
-
"lib/nestful/formats/blank_format.rb",
|
29
|
-
"lib/nestful/formats/form_format.rb",
|
30
|
-
"lib/nestful/formats/json_format.rb",
|
31
|
-
"lib/nestful/formats/multipart_format.rb",
|
32
|
-
"lib/nestful/formats/xml_format.rb",
|
33
|
-
"lib/nestful/oauth.rb",
|
34
|
-
"lib/nestful/request.rb",
|
35
|
-
"lib/nestful/request/callbacks.rb",
|
36
|
-
"lib/nestful/resource.rb",
|
37
|
-
"nestful.gemspec"
|
38
|
-
]
|
39
|
-
s.homepage = %q{http://github.com/maccman/nestful}
|
40
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
41
|
-
s.require_paths = ["lib"]
|
42
|
-
s.rubygems_version = %q{1.3.7}
|
43
|
-
s.summary = %q{Simple Ruby HTTP/REST client with a sane API}
|
44
|
-
|
45
|
-
if s.respond_to? :specification_version then
|
46
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
47
|
-
s.specification_version = 3
|
48
|
-
|
49
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
50
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.0.beta"])
|
51
|
-
else
|
52
|
-
s.add_dependency(%q<activesupport>, [">= 3.0.0.beta"])
|
53
|
-
end
|
54
|
-
else
|
55
|
-
s.add_dependency(%q<activesupport>, [">= 3.0.0.beta"])
|
56
|
-
end
|
14
|
+
gem.files = `git ls-files`.split($/)
|
15
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
|
+
gem.require_paths = ["lib"]
|
57
18
|
end
|
58
|
-
|
metadata
CHANGED
@@ -1,54 +1,47 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nestful
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0.pre
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Alex MacCaw
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 3.0.0.beta
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: *70352776847120
|
25
|
-
description: Simple Ruby HTTP/REST client with a sane API
|
26
|
-
email: info@eribium.org
|
12
|
+
date: 2013-04-04 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email:
|
16
|
+
- info@eribium.org
|
27
17
|
executables: []
|
28
18
|
extensions: []
|
29
|
-
extra_rdoc_files:
|
30
|
-
- README.markdown
|
19
|
+
extra_rdoc_files: []
|
31
20
|
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
32
23
|
- MIT-LICENSE
|
33
24
|
- README.markdown
|
34
25
|
- Rakefile
|
35
26
|
- VERSION
|
27
|
+
- examples/resource.rb
|
36
28
|
- lib/nestful.rb
|
29
|
+
- lib/nestful/.DS_Store
|
37
30
|
- lib/nestful/connection.rb
|
31
|
+
- lib/nestful/endpoint.rb
|
38
32
|
- lib/nestful/exceptions.rb
|
39
33
|
- lib/nestful/formats.rb
|
40
|
-
- lib/nestful/formats/blank_format.rb
|
41
34
|
- lib/nestful/formats/form_format.rb
|
42
35
|
- lib/nestful/formats/json_format.rb
|
43
36
|
- lib/nestful/formats/multipart_format.rb
|
44
|
-
- lib/nestful/
|
45
|
-
- lib/nestful/formats/xml_format.rb
|
46
|
-
- lib/nestful/oauth.rb
|
37
|
+
- lib/nestful/helpers.rb
|
47
38
|
- lib/nestful/request.rb
|
48
|
-
- lib/nestful/request/callbacks.rb
|
49
39
|
- lib/nestful/resource.rb
|
40
|
+
- lib/nestful/response.rb
|
41
|
+
- lib/nestful/response/headers.rb
|
42
|
+
- lib/nestful/version.rb
|
50
43
|
- nestful.gemspec
|
51
|
-
homepage:
|
44
|
+
homepage: https://github.com/maccman/nestful
|
52
45
|
licenses: []
|
53
46
|
post_install_message:
|
54
47
|
rdoc_options: []
|
@@ -63,12 +56,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
63
56
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
57
|
none: false
|
65
58
|
requirements:
|
66
|
-
- - ! '
|
59
|
+
- - ! '>'
|
67
60
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
61
|
+
version: 1.3.1
|
69
62
|
requirements: []
|
70
63
|
rubyforge_project:
|
71
|
-
rubygems_version: 1.8.
|
64
|
+
rubygems_version: 1.8.24
|
72
65
|
signing_key:
|
73
66
|
specification_version: 3
|
74
67
|
summary: Simple Ruby HTTP/REST client with a sane API
|