restfulie 0.7.2 → 0.8.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/Gemfile +21 -0
- data/README.textile +10 -9
- data/Rakefile +12 -5
- data/lib/restfulie/client/base.rb +10 -6
- data/lib/restfulie/client/http/adapter.rb +48 -33
- data/lib/restfulie/client/http/atom_ext.rb +3 -68
- data/lib/restfulie/client/http/core_ext/http.rb +19 -0
- data/lib/restfulie/client/http/core_ext.rb +6 -0
- data/lib/restfulie/client/http/error.rb +3 -6
- data/lib/restfulie/client/http/marshal.rb +35 -49
- data/lib/restfulie/client/http/xml_ext.rb +7 -0
- data/lib/restfulie/client/http.rb +2 -2
- data/lib/restfulie/client/mikyung/concatenator.rb +15 -0
- data/lib/restfulie/client/mikyung/core.rb +44 -0
- data/lib/restfulie/client/mikyung/languages.rb +29 -0
- data/lib/restfulie/client/mikyung/rest_process_model.rb +114 -0
- data/lib/restfulie/client/mikyung/steady_state_walker.rb +32 -0
- data/lib/restfulie/client/mikyung/then_condition.rb +33 -0
- data/lib/restfulie/client/mikyung/when_condition.rb +53 -0
- data/lib/restfulie/client/mikyung.rb +19 -0
- data/lib/restfulie/client.rb +1 -0
- data/lib/restfulie/common/converter/atom/builder.rb +109 -0
- data/lib/restfulie/common/converter/atom/helpers.rb +9 -0
- data/lib/restfulie/common/converter/atom.rb +87 -0
- data/lib/restfulie/common/converter/values.rb +29 -0
- data/lib/restfulie/common/converter.rb +11 -0
- data/lib/restfulie/common/core_ext/proc.rb +48 -0
- data/lib/restfulie/common/core_ext.rb +5 -0
- data/lib/restfulie/common/errors.rb +6 -0
- data/lib/restfulie/common/representation/atom/atom.rng +597 -0
- data/lib/restfulie/common/representation/atom/base.rb +375 -0
- data/lib/restfulie/common/representation/atom/entry.rb +107 -0
- data/lib/restfulie/common/representation/atom/feed.rb +106 -0
- data/lib/restfulie/common/representation/atom.rb +43 -33
- data/lib/restfulie/common/representation/json.rb +1 -2
- data/lib/restfulie/common/representation/xml.rb +209 -23
- data/lib/restfulie/common/representation.rb +0 -1
- data/lib/restfulie/common.rb +2 -3
- data/lib/restfulie/server/action_controller/base.rb +21 -2
- data/lib/restfulie/server/action_controller/params_parser.rb +16 -16
- data/lib/restfulie/server/action_controller/restful_responder.rb +3 -3
- data/lib/restfulie/server/action_controller/routing/patch.rb +6 -0
- data/lib/restfulie/server/action_view/helpers.rb +8 -8
- data/lib/restfulie/server/action_view/template_handlers/tokamak.rb +3 -2
- data/lib/restfulie/server/core_ext/array.rb +13 -12
- metadata +51 -34
- data/lib/restfulie/client/http/link.rb +0 -39
- data/lib/restfulie/client/http/xml.rb +0 -4
- data/lib/restfulie/common/builder/builder_base.rb +0 -73
- data/lib/restfulie/common/builder/helpers.rb +0 -22
- data/lib/restfulie/common/builder/marshalling/atom.rb +0 -197
- data/lib/restfulie/common/builder/marshalling/base.rb +0 -12
- data/lib/restfulie/common/builder/marshalling/json.rb +0 -2
- data/lib/restfulie/common/builder/marshalling/xml.rb +0 -183
- data/lib/restfulie/common/builder/marshalling.rb +0 -16
- data/lib/restfulie/common/builder/rules/collection_rule.rb +0 -10
- data/lib/restfulie/common/builder/rules/custom_attributes.rb +0 -24
- data/lib/restfulie/common/builder/rules/link.rb +0 -20
- data/lib/restfulie/common/builder/rules/links.rb +0 -9
- data/lib/restfulie/common/builder/rules/member_rule.rb +0 -8
- data/lib/restfulie/common/builder/rules/namespace.rb +0 -35
- data/lib/restfulie/common/builder/rules/rules_base.rb +0 -77
- data/lib/restfulie/common/builder.rb +0 -17
- data/lib/vendor/atom/configuration.rb +0 -24
- data/lib/vendor/atom/pub.rb +0 -250
- data/lib/vendor/atom/xml/parser.rb +0 -373
- data/lib/vendor/atom.rb +0 -771
@@ -1,77 +0,0 @@
|
|
1
|
-
module Restfulie::Common::Builder::Rules; end
|
2
|
-
|
3
|
-
# Set of rules that can be used to describe a resource in a tokamak view.
|
4
|
-
class Restfulie::Common::Builder::Rules::Base
|
5
|
-
attr_accessor :blocks
|
6
|
-
attr_accessor :links
|
7
|
-
attr_reader :namespaces
|
8
|
-
|
9
|
-
def initialize(blocks = [], &block)
|
10
|
-
@links = Restfulie::Common::Builder::Rules::Links.new
|
11
|
-
@blocks = (block_given? ? [block] : []) + blocks
|
12
|
-
@namespaces = []
|
13
|
-
end
|
14
|
-
|
15
|
-
def apply(*args)
|
16
|
-
@blocks.each do |block|
|
17
|
-
params = ([self] + args)[0..block.arity-1]
|
18
|
-
block.call(*params)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
# Use to register a namespace
|
23
|
-
#
|
24
|
-
#==Example:
|
25
|
-
#
|
26
|
-
# namespace(@album , "http://example.com")
|
27
|
-
# namespace(:albums, "http://example.com")
|
28
|
-
# namespace(:albums, "http://example.com", :eager_load => false)
|
29
|
-
# namespace(:albums, "http://example.com", :eager_load => { :title => 'A title' })
|
30
|
-
#
|
31
|
-
def namespace(ns, uri = nil, options = {}, &block)
|
32
|
-
object = nil
|
33
|
-
|
34
|
-
if !ns.kind_of?(String) && !ns.kind_of?(Symbol)
|
35
|
-
object = ns
|
36
|
-
ns = object.class.to_s.demodulize.downcase.pluralize.to_sym
|
37
|
-
options[:eager_load] = true unless options.key?(:eager_load)
|
38
|
-
end
|
39
|
-
|
40
|
-
unless [true, false, nil].include?(options[:eager_load])
|
41
|
-
object = options[:eager_load]
|
42
|
-
options[:eager_load] = true
|
43
|
-
end
|
44
|
-
|
45
|
-
namespace = find_or_new_namespace(ns, uri)
|
46
|
-
eager_load(object, namespace) if options[:eager_load]
|
47
|
-
|
48
|
-
yield(namespace) if block_given?
|
49
|
-
namespace
|
50
|
-
end
|
51
|
-
|
52
|
-
def metaclass
|
53
|
-
(class << self; self; end)
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
# Load attributes of the object to passed hash.
|
58
|
-
# If object respond to attributes, attributes is merge, unless merge instance variables
|
59
|
-
def eager_load(object, ns)
|
60
|
-
if object.kind_of?(Hash)
|
61
|
-
ns.merge!(object.symbolize_keys)
|
62
|
-
elsif object.respond_to?(:attributes)
|
63
|
-
ns.merge!(object.attributes.symbolize_keys)
|
64
|
-
else
|
65
|
-
object.instance_variables.each do |var|
|
66
|
-
ns[var.gsub(/^@/, '').to_sym] = object.instance_variable_get(var)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# Search a namespace or create a new
|
72
|
-
def find_or_new_namespace(name, uri)
|
73
|
-
namespace = @namespaces.find { |n| n.namespace == name } || (@namespaces << Restfulie::Common::Builder::Rules::Namespace.new(name, uri)).last
|
74
|
-
namespace.uri = uri unless uri.nil?
|
75
|
-
namespace
|
76
|
-
end
|
77
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
#initialize namespace
|
2
|
-
module Restfulie::Common::Builder; end
|
3
|
-
|
4
|
-
%w(
|
5
|
-
helpers
|
6
|
-
builder_base
|
7
|
-
marshalling
|
8
|
-
rules/rules_base
|
9
|
-
rules/link
|
10
|
-
rules/links
|
11
|
-
rules/namespace
|
12
|
-
rules/member_rule
|
13
|
-
rules/collection_rule
|
14
|
-
rules/custom_attributes
|
15
|
-
).each do |file|
|
16
|
-
require File.join(File.dirname(__FILE__), 'builder', file)
|
17
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# Copyright (c) 2008 The Kaphan Foundation
|
2
|
-
#
|
3
|
-
# For licensing information see LICENSE.txt.
|
4
|
-
#
|
5
|
-
# Please visit http://www.peerworks.org/contact for further information.
|
6
|
-
#
|
7
|
-
|
8
|
-
module Atom
|
9
|
-
class Configuration
|
10
|
-
def self.auth_hmac_enabled?
|
11
|
-
unless defined?(@auth_hmac_enabled)
|
12
|
-
begin
|
13
|
-
gem 'auth-hmac'
|
14
|
-
require 'auth-hmac'
|
15
|
-
@auth_hmac_enabled = true
|
16
|
-
rescue
|
17
|
-
@auth_hmac_enabled = false
|
18
|
-
end
|
19
|
-
else
|
20
|
-
@auth_hmac_enabled
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/lib/vendor/atom/pub.rb
DELETED
@@ -1,250 +0,0 @@
|
|
1
|
-
# Copyright (c) 2008 The Kaphan Foundation
|
2
|
-
#
|
3
|
-
# For licensing information see LICENSE.txt.
|
4
|
-
#
|
5
|
-
# Please visit http://www.peerworks.org/contact for further information.
|
6
|
-
#
|
7
|
-
|
8
|
-
require 'vendor/atom'
|
9
|
-
require 'vendor/atom/configuration'
|
10
|
-
require 'vendor/atom/xml/parser'
|
11
|
-
require 'vendor/atom/version'
|
12
|
-
require 'xml/libxml'
|
13
|
-
require 'uri'
|
14
|
-
require 'net/http'
|
15
|
-
|
16
|
-
module Atom
|
17
|
-
module Pub
|
18
|
-
class NotSupported < StandardError; end
|
19
|
-
class ProtocolError < StandardError
|
20
|
-
attr_reader :response
|
21
|
-
def initialize(response)
|
22
|
-
@response = response
|
23
|
-
end
|
24
|
-
|
25
|
-
def to_s
|
26
|
-
"Invalid response: #{@response}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class Service
|
31
|
-
include Atom::Xml::Parseable
|
32
|
-
namespace Atom::Pub::NAMESPACE
|
33
|
-
elements :workspaces
|
34
|
-
loadable! do |reader, message, severity, base, line|
|
35
|
-
if severity == XML::Reader::SEVERITY_ERROR
|
36
|
-
raise ArgumentError, "#{message} at #{line}"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def initialize(xml = nil)
|
41
|
-
@workspaces = []
|
42
|
-
|
43
|
-
if xml
|
44
|
-
begin
|
45
|
-
if next_node_is?(xml, 'service', Atom::Pub::NAMESPACE)
|
46
|
-
xml.read
|
47
|
-
parse(xml)
|
48
|
-
else
|
49
|
-
raise ArgumentError, "XML document was missing atom:service"
|
50
|
-
end
|
51
|
-
ensure
|
52
|
-
xml.close
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
yield(self) if block_given?
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
class Categories < DelegateClass(Array)
|
61
|
-
include Atom::Xml::Parseable
|
62
|
-
elements :categories, :class => Atom::Category
|
63
|
-
attribute :href, :fixed
|
64
|
-
|
65
|
-
def initialize(o)
|
66
|
-
super([])
|
67
|
-
parse(o, :once => true)
|
68
|
-
o.read
|
69
|
-
parse(o)
|
70
|
-
end
|
71
|
-
|
72
|
-
remove_method :categories
|
73
|
-
def categories; self; end
|
74
|
-
|
75
|
-
# True true if fixed was 'yes' or 'true'
|
76
|
-
def fixed?
|
77
|
-
!self.fixed.nil? && %w(yes true).include?(self.fixed.downcase)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class Workspace
|
82
|
-
include Atom::Xml::Parseable
|
83
|
-
element :title, :class => Content, :namespace => Atom::NAMESPACE
|
84
|
-
elements :collections
|
85
|
-
|
86
|
-
def initialize(o = nil)
|
87
|
-
@collections = []
|
88
|
-
|
89
|
-
case o
|
90
|
-
when XML::Reader
|
91
|
-
o.read
|
92
|
-
parse(o)
|
93
|
-
when Hash
|
94
|
-
o.each do |k, v|
|
95
|
-
self.send("#{k}=".to_sym, v)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
yield(self) if block_given?
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
class Collection
|
104
|
-
include Atom::Xml::Parseable
|
105
|
-
attribute :href
|
106
|
-
element :title, :class => Content, :namespace => Atom::NAMESPACE
|
107
|
-
element :categories, :class => Categories
|
108
|
-
elements :accepts, :content_only => true
|
109
|
-
|
110
|
-
def initialize(o = nil)
|
111
|
-
@accepts = []
|
112
|
-
case o
|
113
|
-
when XML::Reader
|
114
|
-
# do it once to get the attributes
|
115
|
-
parse(o, :once => true)
|
116
|
-
# now step into the element and the sub tree
|
117
|
-
o.read
|
118
|
-
parse(o)
|
119
|
-
when Hash
|
120
|
-
o.each do |k, v|
|
121
|
-
self.send("#{k}=", v)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
yield(self) if block_given?
|
126
|
-
end
|
127
|
-
|
128
|
-
def feed(opts = {})
|
129
|
-
if href
|
130
|
-
Atom::Feed.load_feed(URI.parse(href), opts)
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def publish(entry, opts = {})
|
135
|
-
uri = URI.parse(href)
|
136
|
-
response = nil
|
137
|
-
Net::HTTP.start(uri.host, uri.port) do |http|
|
138
|
-
request = Net::HTTP::Post.new(uri.request_uri, headers)
|
139
|
-
if opts[:user] && opts[:pass]
|
140
|
-
request.basic_auth(opts[:user], opts[:pass])
|
141
|
-
elsif opts[:hmac_access_id] && opts[:hmac_secret_key]
|
142
|
-
if Atom::Configuration.auth_hmac_enabled?
|
143
|
-
AuthHMAC.sign!(request, opts[:hmac_access_id], opts[:hmac_secret_key])
|
144
|
-
else
|
145
|
-
raise ArgumentError, "AuthHMAC credentials provides by auth-hmac gem is not installed"
|
146
|
-
end
|
147
|
-
end
|
148
|
-
response = http.request(request, entry.to_xml.to_s)
|
149
|
-
end
|
150
|
-
|
151
|
-
case response
|
152
|
-
when Net::HTTPCreated
|
153
|
-
published = begin
|
154
|
-
Atom::Entry.load_entry(response.body)
|
155
|
-
rescue ArgumentError
|
156
|
-
entry
|
157
|
-
end
|
158
|
-
|
159
|
-
if response['Location']
|
160
|
-
if published.edit_link
|
161
|
-
published.edit_link.href = response['Location']
|
162
|
-
else
|
163
|
-
published.links << Atom::Link.new(:rel => 'edit', :href => response['Location'])
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
published
|
168
|
-
else
|
169
|
-
raise Atom::Pub::ProtocolError, response
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
private
|
174
|
-
def headers
|
175
|
-
{'Accept' => 'application/atom+xml',
|
176
|
-
'Content-Type' => 'application/atom+xml;type=entry',
|
177
|
-
'User-Agent' => "rAtom #{Atom::VERSION::STRING}"
|
178
|
-
}
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
class Entry
|
184
|
-
def save!(opts = {})
|
185
|
-
if edit = edit_link
|
186
|
-
uri = URI.parse(edit.href)
|
187
|
-
response = nil
|
188
|
-
Net::HTTP.start(uri.host, uri.port) do |http|
|
189
|
-
request = Net::HTTP::Put.new(uri.request_uri, headers)
|
190
|
-
if opts[:user] && opts[:pass]
|
191
|
-
request.basic_auth(opts[:user], opts[:pass])
|
192
|
-
elsif opts[:hmac_access_id] && opts[:hmac_secret_key]
|
193
|
-
if Atom::Configuration.auth_hmac_enabled?
|
194
|
-
AuthHMAC.sign!(request, opts[:hmac_access_id], opts[:hmac_secret_key])
|
195
|
-
else
|
196
|
-
raise ArgumentError, "AuthHMAC credentials provides by auth-hmac gem is not installed"
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
response = http.request(request, self.to_xml)
|
201
|
-
end
|
202
|
-
|
203
|
-
case response
|
204
|
-
when Net::HTTPSuccess
|
205
|
-
else
|
206
|
-
raise Atom::Pub::ProtocolError, response
|
207
|
-
end
|
208
|
-
else
|
209
|
-
raise Atom::Pub::NotSupported, "Entry does not have an edit link"
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
def destroy!(opts = {})
|
214
|
-
if edit = edit_link
|
215
|
-
uri = URI.parse(edit.href)
|
216
|
-
response = nil
|
217
|
-
Net::HTTP.start(uri.host, uri.port) do |http|
|
218
|
-
request = Net::HTTP::Delete.new(uri.request_uri, {'Accept' => 'application/atom+xml', 'User-Agent' => "rAtom #{Atom::VERSION::STRING}"})
|
219
|
-
if opts[:user] && opts[:pass]
|
220
|
-
request.basic_auth(opts[:user], opts[:pass])
|
221
|
-
elsif opts[:hmac_access_id] && opts[:hmac_secret_key]
|
222
|
-
if Atom::Configuration.auth_hmac_enabled?
|
223
|
-
AuthHMAC.sign!(request, opts[:hmac_access_id], opts[:hmac_secret_key])
|
224
|
-
else
|
225
|
-
raise ArgumentError, "AuthHMAC credentials provides by auth-hmac gem is not installed"
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
response = http.request(request)
|
230
|
-
end
|
231
|
-
|
232
|
-
case response
|
233
|
-
when Net::HTTPSuccess
|
234
|
-
else
|
235
|
-
raise Atom::Pub::ProtocolError, response
|
236
|
-
end
|
237
|
-
else
|
238
|
-
raise Atom::Pub::NotSupported, "Entry does not have an edit link"
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
|
-
private
|
243
|
-
def headers
|
244
|
-
{'Accept' => 'application/atom+xml',
|
245
|
-
'Content-Type' => 'application/atom+xml;type=entry',
|
246
|
-
'User-Agent' => "rAtom #{Atom::VERSION::STRING}"
|
247
|
-
}
|
248
|
-
end
|
249
|
-
end
|
250
|
-
end
|