ahora 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/ahora/representation.rb +22 -31
- data/lib/ahora/resource.rb +33 -25
- data/lib/ahora/version.rb +1 -1
- data/test/ahora/representation_test.rb +10 -0
- data/test/ahora/resource_test.rb +79 -0
- data/test/ahora_test.rb +6 -15
- data/test/fixtures/employee.xml +1 -0
- metadata +49 -32
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 62ad288812b561ef44fb7da891c744a3f703bff7
|
4
|
+
data.tar.gz: 2022328ba2e73d65a131cafa976389e3b443cd5b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9ab7f72fe0aceb9dad7b35e9b9da672dd11a1dd1b60e12fdc8a8e77ebae33a9bc08e509de75d10b0acde640ca6d4811eece4faf51ef079f76a48955cb15eaf4
|
7
|
+
data.tar.gz: 93f01442df08707277bf9860e91212fda599c2809b1cec67f95a287184b943a27f507e97e2cd941fab75c74a815d99325a27bf0932d82816c39a8338d444fb2a
|
data/lib/ahora/representation.rb
CHANGED
@@ -7,6 +7,7 @@ require 'delegate'
|
|
7
7
|
module Ahora
|
8
8
|
class Representation < Nibbler
|
9
9
|
INTEGER_PARSER = lambda { |node| Integer(node.content) if node.content.present? }
|
10
|
+
FLOAT_PARSER = lambda { |node| Float(node.content) if node.content.present? }
|
10
11
|
DATE_PARSER = lambda { |node| Date.parse(node.content) if node.content.present? }
|
11
12
|
TIME_PARSER = lambda { |node| Time.parse(node.content) if node.content.present? }
|
12
13
|
BOOL_PARSER =
|
@@ -26,27 +27,12 @@ module Ahora
|
|
26
27
|
parser = names.pop if names.last.is_a?(Proc)
|
27
28
|
names.each do |name|
|
28
29
|
selector = name
|
29
|
-
if name.is_a? Hash
|
30
|
-
|
31
|
-
|
32
|
-
element to_selector(selector.to_s.camelcase(:lower)) => name.to_s, :with => parser
|
30
|
+
selector, name = name.first if name.is_a? Hash
|
31
|
+
selector = "./#{selector.to_s.camelcase(:lower)}"
|
32
|
+
element selector => name.to_s, :with => parser
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
# Public: define Java style object id mapping
|
37
|
-
#
|
38
|
-
# *names - Array of String or Symbol ruby style names
|
39
|
-
#
|
40
|
-
# Examples
|
41
|
-
#
|
42
|
-
# objectid :id, parent_id
|
43
|
-
# # is equivalent to
|
44
|
-
# element 'objectId' => 'id'
|
45
|
-
# element 'parentObjectId' => 'parent_id'
|
46
|
-
def objectid(*names)
|
47
|
-
attribute names.map { |name| { name.to_s.gsub('id', 'object_id') => name } }, INTEGER_PARSER
|
48
|
-
end
|
49
|
-
|
50
36
|
def string(*names)
|
51
37
|
attribute(names)
|
52
38
|
end
|
@@ -55,6 +41,10 @@ module Ahora
|
|
55
41
|
attribute(names, INTEGER_PARSER)
|
56
42
|
end
|
57
43
|
|
44
|
+
def float(*names)
|
45
|
+
attribute(names, FLOAT_PARSER)
|
46
|
+
end
|
47
|
+
|
58
48
|
def date(*names)
|
59
49
|
attribute(names, DATE_PARSER)
|
60
50
|
end
|
@@ -69,10 +59,11 @@ module Ahora
|
|
69
59
|
end
|
70
60
|
|
71
61
|
private
|
72
|
-
|
73
|
-
#
|
74
|
-
|
75
|
-
|
62
|
+
|
63
|
+
# allows using block sub-parsers without explicitly stating they need to
|
64
|
+
# inherit from Ahora::Representation
|
65
|
+
def base_parser_class
|
66
|
+
Representation
|
76
67
|
end
|
77
68
|
end
|
78
69
|
|
@@ -85,7 +76,13 @@ module Ahora
|
|
85
76
|
send("#{key}=", val)
|
86
77
|
end
|
87
78
|
else
|
88
|
-
|
79
|
+
doc = doc_or_atts
|
80
|
+
doc = XmlParser.parse(doc) unless doc.respond_to?(:search)
|
81
|
+
if doc.node_type == Nokogiri::XML::Node::DOCUMENT_NODE
|
82
|
+
# immediately scope to root element
|
83
|
+
doc = doc.at('/*')
|
84
|
+
end
|
85
|
+
super(doc)
|
89
86
|
end
|
90
87
|
end
|
91
88
|
end
|
@@ -96,16 +93,10 @@ module Ahora
|
|
96
93
|
@instantiator = instantiator
|
97
94
|
@document_parser = document_parser
|
98
95
|
@response = response
|
99
|
-
@cache_key = response.env[:response_headers]['X-Ahora-Cache-Key']
|
100
96
|
super([])
|
101
97
|
end
|
102
98
|
|
103
|
-
|
104
|
-
@cache_key or raise NoCacheKeyAvailable,
|
105
|
-
"No caching middleware is used or resource does not support caching."
|
106
|
-
end
|
107
|
-
|
108
|
-
%w( to_s to_a size each first last [] inspect pretty_print ).each do |method_name|
|
99
|
+
%w( to_s to_a size each first last [] inspect pretty_print find detect map collect inject select select! delete_if ).each do |method_name|
|
109
100
|
eval "def #{method_name}(*); kicker; super; end"
|
110
101
|
end
|
111
102
|
|
@@ -126,4 +117,4 @@ module Ahora
|
|
126
117
|
Nokogiri::XML.parse(body, nil, nil, Nokogiri::XML::ParseOptions::STRICT)
|
127
118
|
end
|
128
119
|
end
|
129
|
-
end
|
120
|
+
end
|
data/lib/ahora/resource.rb
CHANGED
@@ -4,43 +4,51 @@ module Ahora
|
|
4
4
|
module Resource
|
5
5
|
attr_writer :document_parser
|
6
6
|
|
7
|
-
def get(url, params =
|
8
|
-
connection.get do |req|
|
9
|
-
|
10
|
-
req
|
7
|
+
def get(url, params = nil)
|
8
|
+
connection.run_request(:get, url, nil, nil) do |req|
|
9
|
+
req.params.update(params) if params
|
10
|
+
yield req if block_given?
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
# FIXME test
|
15
|
-
def post(url, body)
|
16
|
-
connection.post do |req|
|
17
|
-
|
18
|
-
req.url url
|
19
|
-
req.body = body
|
15
|
+
def post(url, body = nil)
|
16
|
+
connection.run_request(:post, url, body, nil) do |req|
|
17
|
+
yield req if block_given?
|
20
18
|
end
|
21
19
|
end
|
22
20
|
|
23
21
|
# FIXME test
|
24
|
-
def put(url, body)
|
25
|
-
connection.put do |req|
|
26
|
-
|
27
|
-
req.url url
|
28
|
-
req.body = body
|
22
|
+
def put(url, body = nil)
|
23
|
+
connection.run_request(:put, url, body, nil) do |req|
|
24
|
+
yield req if block_given?
|
29
25
|
end
|
30
26
|
end
|
31
27
|
|
32
28
|
def connection
|
33
|
-
|
34
|
-
|
35
|
-
extend_middleware(builder)
|
36
|
-
builder.
|
29
|
+
Faraday.new(host.dup, connection_options) do |conn|
|
30
|
+
conn.use Faraday::Response::RaiseError
|
31
|
+
extend_middleware(conn.builder)
|
32
|
+
unless conn.builder.handlers.any? {|mid| mid.klass < Faraday::Adapter }
|
33
|
+
conn.adapter Faraday.default_adapter
|
34
|
+
end
|
37
35
|
end
|
38
|
-
conn.headers['User-Agent'] = 'Ahora'
|
39
|
-
conn
|
40
36
|
end
|
41
37
|
|
42
38
|
# @abstract override to use custom Faraday middleware
|
43
|
-
def extend_middleware(builder)
|
39
|
+
def extend_middleware(builder)
|
40
|
+
super if defined? super
|
41
|
+
end
|
42
|
+
|
43
|
+
# FIXME test (FakeWeb cannot test request headers)
|
44
|
+
# @abstract override to set custome headers
|
45
|
+
# returns a hash with a string for each key
|
46
|
+
def headers
|
47
|
+
(defined?(super) ? super.dup : {}).update \
|
48
|
+
:user_agent => 'Ahora',
|
49
|
+
:content_type => 'application/xml',
|
50
|
+
:accept => 'application/xml'
|
51
|
+
end
|
44
52
|
|
45
53
|
def collection(*args, &block)
|
46
54
|
if args.size == 2
|
@@ -60,9 +68,9 @@ module Ahora
|
|
60
68
|
@document_parser ||= XmlParser.method(:parse)
|
61
69
|
end
|
62
70
|
|
63
|
-
def
|
64
|
-
|
65
|
-
|
71
|
+
def connection_options
|
72
|
+
(defined?(super) ? super.dup : {}).update \
|
73
|
+
:headers => headers
|
66
74
|
end
|
67
75
|
end
|
68
|
-
end
|
76
|
+
end
|
data/lib/ahora/version.rb
CHANGED
@@ -5,6 +5,7 @@ require_relative '../../lib/ahora/representation'
|
|
5
5
|
|
6
6
|
class Employee < Ahora::Representation
|
7
7
|
boolean :is_rockstar, :slacker, :fired
|
8
|
+
float :rating
|
8
9
|
end
|
9
10
|
|
10
11
|
describe "boolean elements" do
|
@@ -36,4 +37,13 @@ describe "boolean elements" do
|
|
36
37
|
it "parsing missing value adds the correct question mark reader" do
|
37
38
|
employee.fired?.must_equal false
|
38
39
|
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "float elements" do
|
43
|
+
let(:employee) { Employee.parse(fixture('employee').read) }
|
44
|
+
|
45
|
+
it "parses float elements" do
|
46
|
+
employee.rating.must_equal 7.8
|
47
|
+
end
|
48
|
+
|
39
49
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/pride'
|
3
|
+
require 'fakeweb'
|
4
|
+
require_relative '../test_helper'
|
5
|
+
require_relative '../../lib/ahora/resource'
|
6
|
+
|
7
|
+
FakeWeb.allow_net_connect = false
|
8
|
+
|
9
|
+
class DefaultPost
|
10
|
+
include Ahora::Resource
|
11
|
+
|
12
|
+
def host
|
13
|
+
'http://test.net/'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class CustomPost < DefaultPost
|
18
|
+
def headers
|
19
|
+
super.update \
|
20
|
+
'Accept' => 'text/plain',
|
21
|
+
'X-Custom' => 'foobar'
|
22
|
+
end
|
23
|
+
|
24
|
+
def extend_middleware builder
|
25
|
+
builder.adapter :rack
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'default headers' do
|
30
|
+
before do
|
31
|
+
@default = DefaultPost.new.connection.headers
|
32
|
+
@custom = CustomPost.new.connection.headers
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'includes the user agent, accept and content-type' do
|
36
|
+
@default['User-Agent'].must_equal 'Ahora'
|
37
|
+
@default['Accept'].must_equal 'application/xml'
|
38
|
+
@default['Content-Type'].must_equal 'application/xml'
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'allows overriding and setting custom headers' do
|
42
|
+
@custom['User-Agent'].must_equal 'Ahora'
|
43
|
+
@custom['Accept'].must_equal 'text/plain'
|
44
|
+
@custom['Content-Type'].must_equal 'application/xml'
|
45
|
+
@custom['X-Custom'].must_equal 'foobar'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'connection adapter' do
|
50
|
+
it 'includes the default Faraday adapter' do
|
51
|
+
faraday = DefaultPost.new.connection
|
52
|
+
adapter = faraday.builder.handlers.last
|
53
|
+
adapter.klass.ancestors.must_include Faraday::Adapter
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'can configure a custom Faraday adapter' do
|
57
|
+
faraday = CustomPost.new.connection
|
58
|
+
adapter = faraday.builder.handlers.last
|
59
|
+
adapter.klass.must_equal Faraday::Adapter::Rack
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#put' do
|
64
|
+
before do
|
65
|
+
@post = DefaultPost.new
|
66
|
+
end
|
67
|
+
|
68
|
+
it "supports passing an url and a body" do
|
69
|
+
FakeWeb.register_uri :put, 'http://test.net/posts', :body => 'body'
|
70
|
+
@post.put("posts", "body").body.must_equal 'body'
|
71
|
+
end
|
72
|
+
|
73
|
+
it "supports passing an url and a params hash" do
|
74
|
+
FakeWeb.register_uri :put, 'http://test.net/posts?foo=bar', :body => 'param'
|
75
|
+
@post.put("posts") { |req|
|
76
|
+
req.params[:foo] = 'bar'
|
77
|
+
}.body.must_equal 'param'
|
78
|
+
end
|
79
|
+
end
|
data/test/ahora_test.rb
CHANGED
@@ -42,14 +42,16 @@ class PostRepository
|
|
42
42
|
end
|
43
43
|
|
44
44
|
class Post < Ahora::Representation
|
45
|
-
|
45
|
+
element './objectId' => :id, :with => lambda {|n| n.content.to_i }
|
46
|
+
element './userObjectId' => :user_id, :with => lambda {|n| n.content.to_i }
|
47
|
+
element './parentObjectId' => :parent_id, :with => lambda {|n| n.content.to_i }
|
46
48
|
date :created_at
|
47
49
|
element :body
|
48
|
-
element 'user'
|
50
|
+
element 'user' do
|
49
51
|
string :first_name, :last_name
|
50
52
|
end
|
51
53
|
boolean :hidden
|
52
|
-
elements 'replies/userPost' => :replies, :with =>
|
54
|
+
elements 'replies/userPost' => :replies, :with => self
|
53
55
|
end
|
54
56
|
|
55
57
|
class PostDomainRepository < PostRepository
|
@@ -93,10 +95,6 @@ describe "requesting a collection" do
|
|
93
95
|
@posts.size.must_equal 2
|
94
96
|
end
|
95
97
|
|
96
|
-
it "raises on #cache_key, because the backend does not has support for it" do
|
97
|
-
-> { @posts.cache_key }.must_raise(Ahora::Collection::NoCacheKeyAvailable)
|
98
|
-
end
|
99
|
-
|
100
98
|
describe "a single post from the collection" do
|
101
99
|
subject { @posts.first }
|
102
100
|
|
@@ -153,13 +151,6 @@ describe 'requesting a collection with if-modified-since support' do
|
|
153
151
|
|
154
152
|
it "has a cache key" do
|
155
153
|
@posts = @repository.find_by_user_id(1)
|
156
|
-
@posts.cache_key.
|
157
|
-
must_equal 'http://test.net/users/1/posts.xml:fragment_Mon, 02 Apr 2012 15:20:41 GMT'
|
158
|
-
end
|
159
|
-
|
160
|
-
it "has a cache key for cached response" do
|
161
|
-
@repository.find_by_user_id(1).cache_key.
|
162
|
-
must_equal @repository.find_by_user_id(1).cache_key
|
163
154
|
end
|
164
155
|
|
165
156
|
it "caches when response header includes Last-Modified" do
|
@@ -215,4 +206,4 @@ describe "passing a block instead of a class to collection" do
|
|
215
206
|
repository = BlogPostRepository.new
|
216
207
|
repository.all.first.id.must_equal 1
|
217
208
|
end
|
218
|
-
end
|
209
|
+
end
|
data/test/fixtures/employee.xml
CHANGED
metadata
CHANGED
@@ -1,82 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ahora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matthijs Langenberg
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-07-02 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: nibbler
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 1.3.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.3.0
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: faraday
|
27
|
-
requirement:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- -
|
31
|
+
- - '>='
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '0.7'
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.7'
|
36
41
|
- !ruby/object:Gem::Dependency
|
37
42
|
name: nokogiri
|
38
|
-
requirement:
|
39
|
-
none: false
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
40
44
|
requirements:
|
41
45
|
- - ~>
|
42
46
|
- !ruby/object:Gem::Version
|
43
47
|
version: '1.5'
|
44
48
|
type: :runtime
|
45
49
|
prerelease: false
|
46
|
-
version_requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.5'
|
47
55
|
- !ruby/object:Gem::Dependency
|
48
56
|
name: activesupport
|
49
|
-
requirement:
|
50
|
-
none: false
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
51
58
|
requirements:
|
52
|
-
- -
|
59
|
+
- - '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '0'
|
55
62
|
type: :runtime
|
56
63
|
prerelease: false
|
57
|
-
version_requirements:
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: fakeweb
|
60
|
-
requirement:
|
61
|
-
none: false
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
62
72
|
requirements:
|
63
|
-
- -
|
73
|
+
- - '>='
|
64
74
|
- !ruby/object:Gem::Version
|
65
75
|
version: '0'
|
66
76
|
type: :development
|
67
77
|
prerelease: false
|
68
|
-
version_requirements:
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: minitest
|
71
|
-
requirement:
|
72
|
-
none: false
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
73
86
|
requirements:
|
74
|
-
- -
|
87
|
+
- - '>='
|
75
88
|
- !ruby/object:Gem::Version
|
76
89
|
version: '0'
|
77
90
|
type: :development
|
78
91
|
prerelease: false
|
79
|
-
version_requirements:
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
80
97
|
description: Consume Java-ish XML HTTP Resources easily
|
81
98
|
email:
|
82
99
|
- matthijs.langenberg@nedap.com
|
@@ -99,32 +116,32 @@ files:
|
|
99
116
|
- lib/ahora/resource.rb
|
100
117
|
- lib/ahora/version.rb
|
101
118
|
- test/ahora/representation_test.rb
|
119
|
+
- test/ahora/resource_test.rb
|
102
120
|
- test/ahora_test.rb
|
103
121
|
- test/fixtures/employee.xml
|
104
122
|
- test/fixtures/user_posts.xml
|
105
123
|
- test/test_helper.rb
|
106
124
|
homepage: ''
|
107
125
|
licenses: []
|
126
|
+
metadata: {}
|
108
127
|
post_install_message:
|
109
128
|
rdoc_options: []
|
110
129
|
require_paths:
|
111
130
|
- lib
|
112
131
|
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
132
|
requirements:
|
115
|
-
- -
|
133
|
+
- - '>='
|
116
134
|
- !ruby/object:Gem::Version
|
117
135
|
version: '0'
|
118
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
137
|
requirements:
|
121
|
-
- -
|
138
|
+
- - '>='
|
122
139
|
- !ruby/object:Gem::Version
|
123
140
|
version: '0'
|
124
141
|
requirements: []
|
125
142
|
rubyforge_project:
|
126
|
-
rubygems_version:
|
143
|
+
rubygems_version: 2.0.3
|
127
144
|
signing_key:
|
128
|
-
specification_version:
|
145
|
+
specification_version: 4
|
129
146
|
summary: Consume Java-ish XML HTTP Resources easily
|
130
147
|
test_files: []
|