restfulie 0.6.0 → 0.7.0
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.
- data/README.textile +83 -7
- data/Rakefile +98 -13
- data/lib/restfulie/client/base.rb +48 -53
- data/lib/restfulie/client/configuration.rb +69 -0
- data/lib/restfulie/client/http/adapter.rb +487 -0
- data/lib/restfulie/client/http/atom_ext.rb +87 -0
- data/lib/restfulie/client/http/cache.rb +28 -0
- data/lib/restfulie/client/http/error.rb +80 -0
- data/lib/restfulie/client/http/marshal.rb +147 -0
- data/lib/restfulie/client/http.rb +13 -0
- data/lib/restfulie/client.rb +8 -56
- data/lib/restfulie/common/builder/builder_base.rb +58 -0
- data/lib/restfulie/common/builder/helpers.rb +22 -0
- data/lib/restfulie/common/builder/marshalling/atom.rb +197 -0
- data/lib/restfulie/common/builder/marshalling/base.rb +12 -0
- data/lib/restfulie/common/builder/marshalling/json.rb +2 -0
- data/lib/restfulie/common/builder/marshalling.rb +16 -0
- data/lib/restfulie/common/builder/rules/collection_rule.rb +10 -0
- data/lib/restfulie/common/builder/rules/link.rb +20 -0
- data/lib/restfulie/common/builder/rules/links.rb +9 -0
- data/lib/restfulie/common/builder/rules/member_rule.rb +8 -0
- data/lib/restfulie/common/builder/rules/namespace.rb +25 -0
- data/lib/restfulie/common/builder/rules/rules_base.rb +76 -0
- data/lib/restfulie/common/builder.rb +16 -0
- data/lib/restfulie/common/errors.rb +9 -0
- data/lib/restfulie/{logger.rb → common/logger.rb} +3 -5
- data/lib/restfulie/common/representation/atom.rb +48 -0
- data/lib/restfulie/common/representation/generic.rb +33 -0
- data/lib/restfulie/common/representation/xml.rb +24 -0
- data/lib/restfulie/common/representation.rb +10 -0
- data/lib/restfulie/common.rb +23 -0
- data/lib/restfulie/server/action_controller/base.rb +31 -0
- data/lib/restfulie/server/action_controller/params_parser.rb +62 -0
- data/lib/restfulie/server/action_controller/restful_responder.rb +39 -0
- data/lib/restfulie/server/action_controller/routing/restful_route.rb +14 -0
- data/lib/restfulie/server/action_controller/routing.rb +12 -0
- data/lib/restfulie/server/action_controller.rb +15 -0
- data/lib/restfulie/server/action_view/helpers.rb +45 -0
- data/lib/restfulie/server/action_view/template_handlers/tokamak.rb +15 -0
- data/lib/restfulie/server/action_view/template_handlers.rb +13 -0
- data/lib/restfulie/server/action_view.rb +8 -0
- data/lib/restfulie/server/configuration.rb +21 -0
- data/lib/restfulie/server/core_ext/array.rb +45 -0
- data/lib/restfulie/server/core_ext.rb +1 -0
- data/lib/restfulie/server/restfulie_controller.rb +1 -17
- data/lib/restfulie/server.rb +15 -0
- data/lib/restfulie.rb +4 -72
- data/lib/vendor/atom/configuration.rb +24 -0
- data/lib/vendor/atom/pub.rb +250 -0
- data/lib/vendor/atom/xml/parser.rb +373 -0
- data/lib/vendor/atom.rb +771 -0
- metadata +94 -33
- data/lib/restfulie/client/atom_media_type.rb +0 -75
- data/lib/restfulie/client/cache.rb +0 -103
- data/lib/restfulie/client/entry_point.rb +0 -94
- data/lib/restfulie/client/extensions/http.rb +0 -116
- data/lib/restfulie/client/helper.rb +0 -28
- data/lib/restfulie/client/instance.rb +0 -158
- data/lib/restfulie/client/request_execution.rb +0 -321
- data/lib/restfulie/client/state.rb +0 -36
- data/lib/restfulie/media_type.rb +0 -143
- data/lib/restfulie/media_type_control.rb +0 -115
- data/lib/restfulie/media_type_defaults.rb +0 -51
- data/lib/restfulie/server/atom_media_type.rb +0 -115
- data/lib/restfulie/server/base.rb +0 -91
- data/lib/restfulie/server/controller.rb +0 -122
- data/lib/restfulie/server/instance.rb +0 -102
- data/lib/restfulie/server/marshalling.rb +0 -47
- data/lib/restfulie/server/opensearch/description.rb +0 -54
- data/lib/restfulie/server/opensearch.rb +0 -18
- data/lib/restfulie/server/transition.rb +0 -93
- data/lib/restfulie/unmarshalling.rb +0 -131
- data/lib/vendor/jeokkarak/hashi.rb +0 -65
- data/lib/vendor/jeokkarak/jeokkarak.rb +0 -81
@@ -1,18 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2009 Caelum - www.caelum.com.br/opensource
|
3
|
-
# All rights reserved.
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
require 'restfulie/server/opensearch/description'
|
@@ -1,93 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2009 Caelum - www.caelum.com.br/opensource
|
3
|
-
# All rights reserved.
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
module Restfulie
|
19
|
-
|
20
|
-
module Server
|
21
|
-
|
22
|
-
# represents a transition on the server side
|
23
|
-
class Transition
|
24
|
-
attr_reader :body, :name
|
25
|
-
attr_writer :options
|
26
|
-
attr_accessor :result
|
27
|
-
|
28
|
-
def initialize(*args)
|
29
|
-
args[0].kind_of?(Array) ? from_array(*args) : from(*args)
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
def from_array(array)
|
34
|
-
@name = array[0]
|
35
|
-
@options = array.length>0 ? array[1] : nil
|
36
|
-
@result = array.length>1 ? array[2] : nil
|
37
|
-
@body = nil
|
38
|
-
end
|
39
|
-
|
40
|
-
def from(name, options = {}, result = nil, body = nil)
|
41
|
-
@name = name
|
42
|
-
@options = options
|
43
|
-
@result = result
|
44
|
-
@body = body
|
45
|
-
end
|
46
|
-
|
47
|
-
public
|
48
|
-
|
49
|
-
def action
|
50
|
-
@options || {}
|
51
|
-
end
|
52
|
-
|
53
|
-
# executes this transition in a resource
|
54
|
-
def execute_at(target_object)
|
55
|
-
target_object.status = @result.to_s unless @result.nil?
|
56
|
-
end
|
57
|
-
|
58
|
-
# return the link to this transitions's uri
|
59
|
-
def link_for(model, controller)
|
60
|
-
specific_action = @body ? @body.call(model) : action.dup
|
61
|
-
|
62
|
-
specific_action = parse_specific_action(specific_action, model)
|
63
|
-
|
64
|
-
rel = specific_action[:rel] || @name
|
65
|
-
specific_action[:rel] = nil
|
66
|
-
|
67
|
-
specific_action[:action] ||= @name
|
68
|
-
uri = controller.url_for(specific_action)
|
69
|
-
|
70
|
-
return rel, uri
|
71
|
-
end
|
72
|
-
|
73
|
-
private
|
74
|
-
|
75
|
-
# if you use the class level DSL, you will need to add a lambda for instance level accessors:
|
76
|
-
# transition :show, {:action => :show, :foo_id => lambda { |model| model.id }}
|
77
|
-
# but you can replace it for a symbol and defer the model call
|
78
|
-
# transition :show, {:action => :show, :foo_id => :id}
|
79
|
-
def parse_specific_action(action, model)
|
80
|
-
action.inject({}) do |actions, pair|
|
81
|
-
if pair.last.is_a?( Symbol ) && model.attributes.include?(pair.last)
|
82
|
-
actions.merge!( pair.first => model.send(pair.last) )
|
83
|
-
else
|
84
|
-
actions.merge!( pair.first => pair.last )
|
85
|
-
end
|
86
|
-
end
|
87
|
-
action
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
end
|
@@ -1,131 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2009 Caelum - www.caelum.com.br/opensource
|
3
|
-
# All rights reserved.
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
module Hashi
|
19
|
-
class CustomHash
|
20
|
-
def initialize(hash = {})
|
21
|
-
@internal_hash = hash
|
22
|
-
link = hash['link'] if hash.kind_of? Hash
|
23
|
-
add_transitions([link]) if link.kind_of? Hash
|
24
|
-
add_transitions(link) if link.kind_of? Array
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# module Jeokkarak
|
30
|
-
# module Base
|
31
|
-
# alias_method :old_from_hash_parse, :from_hash_parse
|
32
|
-
# def from_hash_parse(result,h,key,value)
|
33
|
-
# return old_from_hash_parse(result, h, key, value) if key!='link'
|
34
|
-
# link = h[key]
|
35
|
-
# result.add_transitions([link]) if link.kind_of? Hash
|
36
|
-
# result.add_transitions(link) if link.kind_of? Array
|
37
|
-
# end
|
38
|
-
# end
|
39
|
-
# end
|
40
|
-
|
41
|
-
module Restfulie
|
42
|
-
module Unmarshalling
|
43
|
-
# basic code from Matt Pulver
|
44
|
-
# found at http://www.xcombinator.com/2008/08/11/activerecord-from_xml-and-from_json-part-2/
|
45
|
-
# addapted to support links
|
46
|
-
|
47
|
-
def from_hash( hash )
|
48
|
-
h = hash ? hash.dup : {}
|
49
|
-
links = nil
|
50
|
-
h.each do |key, value|
|
51
|
-
if key == "link"
|
52
|
-
links = value.instance_of?(Array) ? h[key] : [h[key]]
|
53
|
-
elsif [Array, Hash].include? value.class
|
54
|
-
klazz = get_the_class(key)
|
55
|
-
if value.instance_of?(Array)
|
56
|
-
h[key].map! { |e| (klazz || Hashi::CustomHash).send(:from_hash, e) }
|
57
|
-
elsif value.instance_of?(Hash)
|
58
|
-
h[key] = klazz.array_from_hash(value)
|
59
|
-
else
|
60
|
-
h[key] = klazz.from_hash value
|
61
|
-
end
|
62
|
-
end
|
63
|
-
h.delete key if ["xmlns", "link"].include?(key)
|
64
|
-
end
|
65
|
-
|
66
|
-
result = make_new_object h
|
67
|
-
result.add_transitions(links) if !(links.nil?) && self.include?(Restfulie::Client::Instance)
|
68
|
-
result
|
69
|
-
end
|
70
|
-
|
71
|
-
# creates an array of this type based on a hash created using rails Hash.from_xml method
|
72
|
-
# because Hash.from_xml returns some no-cute hash structure when dealing with aligned elements
|
73
|
-
# we had to support it in a variety of ways.
|
74
|
-
# usage example:
|
75
|
-
#
|
76
|
-
# hash = {"player" => {"name" => "guilherme silveira"}}
|
77
|
-
# player = Player.array_from_hash(hash)
|
78
|
-
# puts player[0].name
|
79
|
-
#
|
80
|
-
# hash = {"player" => [{"name" => "guilherme silveira"}, {"name" => "andre de santi"}]}
|
81
|
-
# player = Player.array_from_hash(hash)
|
82
|
-
# puts player[0].name
|
83
|
-
# puts player[1].name
|
84
|
-
def array_from_hash(hash)
|
85
|
-
|
86
|
-
return self.from_hash(hash) unless (hash.size == 1 && hash.keys.first == self.to_s.underscore)
|
87
|
-
|
88
|
-
children = hash.values.first
|
89
|
-
|
90
|
-
return [self.from_hash(children)] unless children.instance_of?(Array)
|
91
|
-
|
92
|
-
children.map { |child| self.from_hash(child) }
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
def from_json(json)
|
97
|
-
from_hash(safe_json_decode(json).values.first)
|
98
|
-
end
|
99
|
-
|
100
|
-
# The xml has a surrounding class tag (e.g. ship-to),
|
101
|
-
# but the hash has no counterpart (e.g. 'ship_to' => {} )
|
102
|
-
def from_xml(xml)
|
103
|
-
hash = Hash.from_xml xml
|
104
|
-
head = hash[self.to_s.underscore]
|
105
|
-
result = self.from_hash head
|
106
|
-
return nil if result.nil?
|
107
|
-
result._came_from = :xml if self.include?(Restfulie::Client::Instance)
|
108
|
-
result
|
109
|
-
end
|
110
|
-
|
111
|
-
private
|
112
|
-
def make_new_object(hash = {})
|
113
|
-
obj = self.new
|
114
|
-
hash.keys.each { |key| obj.send("#{key}=", hash[key]) }
|
115
|
-
obj
|
116
|
-
end
|
117
|
-
|
118
|
-
def get_the_class(name)
|
119
|
-
respond_to?(:reflect_on_association) ? reflect_on_association(name.to_sym).klass.to_s.constantize : nil
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
private
|
125
|
-
def safe_json_decode(json)
|
126
|
-
return {} if !json
|
127
|
-
begin
|
128
|
-
ActiveSupport::JSON.decode json
|
129
|
-
rescue ; {} end
|
130
|
-
end
|
131
|
-
# end of code based on Matt Pulver's
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module Hashi
|
2
|
-
class UndefinedMethod < Exception
|
3
|
-
attr_reader :msg
|
4
|
-
def initialize(msg)
|
5
|
-
@msg = msg
|
6
|
-
end
|
7
|
-
def to_s
|
8
|
-
@msg
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class CustomHash
|
13
|
-
|
14
|
-
attr_reader :internal_hash
|
15
|
-
|
16
|
-
def initialize(hash = {})
|
17
|
-
@internal_hash = hash
|
18
|
-
end
|
19
|
-
|
20
|
-
def method_missing(name, *args, &block)
|
21
|
-
name = name.to_s if name.kind_of? Symbol
|
22
|
-
if name[-1,1] == "?"
|
23
|
-
parse(name, @internal_hash[name.chop])
|
24
|
-
elsif name[-1,1] == "="
|
25
|
-
@internal_hash[name.chop] = args[0]
|
26
|
-
elsif @internal_hash.kind_of?(Array) && name == "each"
|
27
|
-
@internal_hash.each do |k| block.call(transform(k)) end
|
28
|
-
elsif name.respond_to? name
|
29
|
-
@internal_hash.send(name, *args, &block)
|
30
|
-
else
|
31
|
-
return nil if @internal_hash.has_key?(name) && @internal_hash[name].nil?
|
32
|
-
parse(name, transform(@internal_hash[name]))
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def respond_to?(symbol)
|
37
|
-
super(symbol) || @internal_hash.key?(symbol.to_s)
|
38
|
-
end
|
39
|
-
|
40
|
-
def [](x)
|
41
|
-
transform(@internal_hash[x])
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
def transform(value)
|
46
|
-
return CustomHash.new(value) if value.kind_of?(Hash) || value.kind_of?(Array)
|
47
|
-
value
|
48
|
-
end
|
49
|
-
|
50
|
-
def parse(name, value)
|
51
|
-
raise Hashi::UndefinedMethod.new("undefined method '#{name}'") if value.nil?
|
52
|
-
value
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.from_hash(hash)
|
58
|
-
CustomHash.new(hash)
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.to_object(hash)
|
62
|
-
CustomHash.new(hash)
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2009 Caelum - www.caelum.com.br/opensource
|
3
|
-
# All rights reserved.
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
|
17
|
-
require 'vendor/jeokkarak/hashi'
|
18
|
-
|
19
|
-
module Jeokkarak
|
20
|
-
module Base
|
21
|
-
|
22
|
-
# defines that this type has a child element
|
23
|
-
def has_child(type, options={})
|
24
|
-
resource_children[options[:as]] = type
|
25
|
-
end
|
26
|
-
|
27
|
-
# checks what is the type element for this type (supports rails ActiveRecord, has_child and Hashi)
|
28
|
-
def child_type_for(name)
|
29
|
-
return reflect_on_association(name.to_sym ).klass if respond_to? :reflect_on_association
|
30
|
-
resource_children[name] || Hashi
|
31
|
-
end
|
32
|
-
|
33
|
-
# returns the registered children list for this resource
|
34
|
-
def resource_children
|
35
|
-
@children ||= {}
|
36
|
-
@children
|
37
|
-
end
|
38
|
-
|
39
|
-
# creates an instance of this type based on this hash
|
40
|
-
def from_hash(h)
|
41
|
-
h = {} if h.nil? # nasty required check
|
42
|
-
h = h.dup
|
43
|
-
result = self.new
|
44
|
-
result._internal_hash = h
|
45
|
-
h.each do |key,value|
|
46
|
-
from_hash_parse result, h, key, value
|
47
|
-
end
|
48
|
-
def result.method_missing(name, *args, &block)
|
49
|
-
Hashi.to_object(@_internal_hash).send(name, args[0], block)
|
50
|
-
end
|
51
|
-
result
|
52
|
-
end
|
53
|
-
|
54
|
-
# extension point to parse a value
|
55
|
-
def from_hash_parse(result,h,key,value)
|
56
|
-
case value.class.to_s
|
57
|
-
when 'Array'
|
58
|
-
h[key].map! { |e| child_type_for(key).from_hash e }
|
59
|
-
when /\AHash(WithIndifferentAccess)?\Z/
|
60
|
-
h[key] = child_type_for(key ).from_hash value
|
61
|
-
end
|
62
|
-
name = "#{key}="
|
63
|
-
result.send(name, value) if result.respond_to?(name)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
module Jeokkarak
|
69
|
-
module Config
|
70
|
-
|
71
|
-
# entry point to define a jeokkarak type
|
72
|
-
def acts_as_jeokkarak
|
73
|
-
self.module_eval do
|
74
|
-
attr_accessor :_internal_hash
|
75
|
-
end
|
76
|
-
self.extend Jeokkarak::Base
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
Object.extend Jeokkarak::Config
|