restfulie 0.1.0.beta1 → 0.1

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.
Files changed (111) hide show
  1. data/README.textile +87 -99
  2. data/Rakefile +14 -109
  3. data/lib/restfulie.rb +183 -23
  4. metadata +12 -197
  5. data/Gemfile +0 -28
  6. data/Gemfile.lock +0 -128
  7. data/LICENSE +0 -17
  8. data/lib/restfulie/client.rb +0 -26
  9. data/lib/restfulie/client/base.rb +0 -36
  10. data/lib/restfulie/client/cache.rb +0 -11
  11. data/lib/restfulie/client/cache/basic.rb +0 -76
  12. data/lib/restfulie/client/cache/fake.rb +0 -15
  13. data/lib/restfulie/client/cache/http_ext.rb +0 -123
  14. data/lib/restfulie/client/cache/restrictions.rb +0 -13
  15. data/lib/restfulie/client/configuration.rb +0 -67
  16. data/lib/restfulie/client/dsl.rb +0 -66
  17. data/lib/restfulie/client/entry_point.rb +0 -61
  18. data/lib/restfulie/client/ext/atom_ext.rb +0 -14
  19. data/lib/restfulie/client/ext/http_ext.rb +0 -22
  20. data/lib/restfulie/client/ext/json_ext.rb +0 -16
  21. data/lib/restfulie/client/feature.rb +0 -5
  22. data/lib/restfulie/client/feature/base.rb +0 -75
  23. data/lib/restfulie/client/feature/base_request.rb +0 -35
  24. data/lib/restfulie/client/feature/cache.rb +0 -16
  25. data/lib/restfulie/client/feature/enhance_response.rb +0 -12
  26. data/lib/restfulie/client/feature/follow_request.rb +0 -41
  27. data/lib/restfulie/client/feature/history.rb +0 -26
  28. data/lib/restfulie/client/feature/history_request.rb +0 -19
  29. data/lib/restfulie/client/feature/open_search.rb +0 -21
  30. data/lib/restfulie/client/feature/open_search/pattern_matcher.rb +0 -25
  31. data/lib/restfulie/client/feature/serialize_body.rb +0 -32
  32. data/lib/restfulie/client/feature/setup_header.rb +0 -22
  33. data/lib/restfulie/client/feature/throw_error.rb +0 -41
  34. data/lib/restfulie/client/feature/verb.rb +0 -119
  35. data/lib/restfulie/client/http.rb +0 -7
  36. data/lib/restfulie/client/http/cache.rb +0 -28
  37. data/lib/restfulie/client/http/error.rb +0 -77
  38. data/lib/restfulie/client/http/response_holder.rb +0 -29
  39. data/lib/restfulie/client/master_delegator.rb +0 -31
  40. data/lib/restfulie/client/mikyung.rb +0 -15
  41. data/lib/restfulie/client/mikyung/concatenator.rb +0 -18
  42. data/lib/restfulie/client/mikyung/core.rb +0 -70
  43. data/lib/restfulie/client/mikyung/languages.rb +0 -11
  44. data/lib/restfulie/client/mikyung/languages/german.rb +0 -24
  45. data/lib/restfulie/client/mikyung/languages/portuguese.rb +0 -23
  46. data/lib/restfulie/client/mikyung/rest_process_model.rb +0 -191
  47. data/lib/restfulie/client/mikyung/steady_state_walker.rb +0 -38
  48. data/lib/restfulie/client/mikyung/then_condition.rb +0 -39
  49. data/lib/restfulie/client/mikyung/when_condition.rb +0 -57
  50. data/lib/restfulie/common.rb +0 -18
  51. data/lib/restfulie/common/converter.rb +0 -43
  52. data/lib/restfulie/common/converter/atom.rb +0 -12
  53. data/lib/restfulie/common/converter/atom/base.rb +0 -91
  54. data/lib/restfulie/common/converter/atom/builder.rb +0 -111
  55. data/lib/restfulie/common/converter/atom/helpers.rb +0 -17
  56. data/lib/restfulie/common/converter/json.rb +0 -12
  57. data/lib/restfulie/common/converter/json/base.rb +0 -87
  58. data/lib/restfulie/common/converter/json/builder.rb +0 -102
  59. data/lib/restfulie/common/converter/json/helpers.rb +0 -17
  60. data/lib/restfulie/common/converter/open_search.rb +0 -16
  61. data/lib/restfulie/common/converter/open_search/descriptor.rb +0 -32
  62. data/lib/restfulie/common/converter/values.rb +0 -33
  63. data/lib/restfulie/common/converter/xml.rb +0 -14
  64. data/lib/restfulie/common/converter/xml/base.rb +0 -63
  65. data/lib/restfulie/common/converter/xml/builder.rb +0 -113
  66. data/lib/restfulie/common/converter/xml/helpers.rb +0 -17
  67. data/lib/restfulie/common/converter/xml/link.rb +0 -30
  68. data/lib/restfulie/common/converter/xml/links.rb +0 -21
  69. data/lib/restfulie/common/core_ext.rb +0 -1
  70. data/lib/restfulie/common/core_ext/hash.rb +0 -18
  71. data/lib/restfulie/common/error.rb +0 -19
  72. data/lib/restfulie/common/links.rb +0 -9
  73. data/lib/restfulie/common/logger.rb +0 -19
  74. data/lib/restfulie/common/representation.rb +0 -3
  75. data/lib/restfulie/common/representation/atom.rb +0 -20
  76. data/lib/restfulie/common/representation/atom/atom.rng +0 -597
  77. data/lib/restfulie/common/representation/atom/base.rb +0 -142
  78. data/lib/restfulie/common/representation/atom/category.rb +0 -41
  79. data/lib/restfulie/common/representation/atom/entry.rb +0 -59
  80. data/lib/restfulie/common/representation/atom/factory.rb +0 -43
  81. data/lib/restfulie/common/representation/atom/feed.rb +0 -110
  82. data/lib/restfulie/common/representation/atom/link.rb +0 -68
  83. data/lib/restfulie/common/representation/atom/person.rb +0 -48
  84. data/lib/restfulie/common/representation/atom/source.rb +0 -59
  85. data/lib/restfulie/common/representation/atom/tag_collection.rb +0 -38
  86. data/lib/restfulie/common/representation/atom/xml.rb +0 -90
  87. data/lib/restfulie/common/representation/generic.rb +0 -22
  88. data/lib/restfulie/common/representation/json.rb +0 -13
  89. data/lib/restfulie/common/representation/json/base.rb +0 -27
  90. data/lib/restfulie/common/representation/json/keys_as_methods.rb +0 -74
  91. data/lib/restfulie/common/representation/json/link.rb +0 -29
  92. data/lib/restfulie/common/representation/json/link_collection.rb +0 -23
  93. data/lib/restfulie/common/representation/links.rb +0 -11
  94. data/lib/restfulie/server.rb +0 -25
  95. data/lib/restfulie/server/action_controller.rb +0 -11
  96. data/lib/restfulie/server/action_controller/base.rb +0 -48
  97. data/lib/restfulie/server/action_controller/params_parser.rb +0 -100
  98. data/lib/restfulie/server/action_controller/patch.rb +0 -6
  99. data/lib/restfulie/server/action_controller/restful_responder.rb +0 -12
  100. data/lib/restfulie/server/action_controller/trait.rb +0 -9
  101. data/lib/restfulie/server/action_controller/trait/cacheable.rb +0 -81
  102. data/lib/restfulie/server/action_controller/trait/created.rb +0 -17
  103. data/lib/restfulie/server/action_view.rb +0 -10
  104. data/lib/restfulie/server/action_view/helpers.rb +0 -50
  105. data/lib/restfulie/server/action_view/template_handlers.rb +0 -30
  106. data/lib/restfulie/server/action_view/template_handlers/tokamak.rb +0 -21
  107. data/lib/restfulie/server/configuration.rb +0 -24
  108. data/lib/restfulie/server/controller.rb +0 -74
  109. data/lib/restfulie/server/core_ext.rb +0 -1
  110. data/lib/restfulie/server/core_ext/array.rb +0 -61
  111. data/lib/restfulie/version.rb +0 -14
@@ -1,36 +0,0 @@
1
- module Restfulie
2
- module Client#:nodoc
3
- module Base
4
-
5
- def method_missing(sym, *args, &block)
6
- if @base_position.respond_to?(sym)
7
- @base_position.send sym, *args, &block
8
- else
9
- super(sym, *args, &block)
10
- end
11
- end
12
-
13
- def self.included(base)#:nodoc
14
- base.extend(self)
15
- end
16
-
17
- def uses_restfulie(configuration = Configuration.new,&block)
18
- EntryPoint.configuration_for(resource_name,configuration,&block)
19
- configure
20
- end
21
-
22
- def configure
23
- configuration = EntryPoint.configuration_of(resource_name)
24
- raise "Undefined configuration for #{resource_name}" unless configuration
25
- @base_position = Restfulie.at(configuration.entry_point)
26
- configuration.representations.each do |representation_name,representation|
27
- register_representation(representation_name,representation)
28
- end
29
- end
30
-
31
- def resource_name
32
- @resource_name ||= self.class.to_s.to_sym
33
- end
34
- end
35
- end
36
- end
@@ -1,11 +0,0 @@
1
- module Restfulie
2
- module Client
3
- module Cache
4
- autoload :Basic, 'restfulie/client/cache/basic'
5
- autoload :Fake, 'restfulie/client/cache/fake'
6
- autoload :Restrictions, 'restfulie/client/cache/restrictions'
7
- end
8
- end
9
- end
10
- require 'restfulie/client/cache/http_ext'
11
-
@@ -1,76 +0,0 @@
1
- # Basic cache implementation for restfulie.
2
- #
3
- # It uses the request headers and uri to store it in memory.
4
- # This cache might not be optimal for long running clients, which should use a memcached based one.
5
- # Use Restfulie::Client.cache_provider to change the provider
6
- module Restfulie::Client::Cache
7
- class Basic
8
-
9
- def put(key, req, response)
10
- if Restfulie::Client::Cache::Restrictions.may_cache?(response)
11
- Restfulie::Common::Logger.logger.debug "caching #{key} #{response}"
12
- cache_add(key, req, response)
13
- end
14
- response
15
- end
16
-
17
- def get(key, request)
18
-
19
- # debugger
20
- response = cache_get(key, request)
21
- return nil if response.nil?
22
-
23
- if response.has_expired_cache?
24
- remove(key)
25
- else
26
- Restfulie::Common::Logger.logger.debug "RETURNING cache #{key}"
27
- cache_hit response
28
- end
29
-
30
- end
31
-
32
- # removes all elements from the cache
33
- def clear
34
- cache.clear
35
- end
36
-
37
- private
38
-
39
- # allows response enhancement when the cache was hit with it
40
- def cache_hit(response)
41
- response
42
- end
43
-
44
- def cache_add(key, req, response)
45
- values = (cache.read(key) || []).dup
46
- values << [req, response]
47
- cache.write(key, values)
48
- end
49
-
50
- def cache_get(key, req)
51
- return nil unless cache.exist?(key)
52
- found = cache.read(key).find do |cached|
53
- old_req = cached.first
54
- old_response = cached.last
55
-
56
- headers_match = old_response.vary_headers_for(old_req) == old_response.vary_headers_for(req)
57
- if headers_match && old_response.verb == req.verb
58
- old_response
59
- else
60
- false
61
- end
62
- end
63
- found ? found.last : nil
64
- end
65
-
66
- def remove(key)
67
- cache.delete(key)
68
- nil
69
- end
70
-
71
- def cache
72
- Restfulie::Client.cache_store
73
- end
74
-
75
- end
76
- end
@@ -1,15 +0,0 @@
1
- # Fake cache that does not cache anything
2
- # Use Restfulie::Client.cache_provider = Restfulie::Client::Cache::Fake.new
3
- module Restfulie::Client::Cache
4
- class Fake
5
- def put(url, req, response)
6
- response
7
- end
8
-
9
- def get(url, req)
10
- end
11
-
12
- def clear
13
- end
14
- end
15
- end
@@ -1,123 +0,0 @@
1
- require 'time'
2
-
3
- # an extesion to http responses
4
- module Restfulie::Client::HTTP::ResponseStatus
5
-
6
- attr_accessor :previous
7
-
8
- # determines if this response code was successful (according to http specs: 200~299)
9
- def is_successful?
10
- code.to_i >= 200 && code.to_i <= 299
11
- end
12
-
13
- # determines if this response code was successful (according to http specs: 100~199)
14
- def is_informational?
15
- code.to_i >= 100 && code.to_i <= 199
16
- end
17
-
18
- # determines if this response code was successful (according to http specs: 300~399)
19
- def is_redirection?
20
- code.to_i >= 300 && code.to_i <= 399
21
- end
22
-
23
- # determines if this response code was successful (according to http specs: 400~499)
24
- def is_client_error?
25
- code.to_i >= 400 && code.to_i <= 499
26
- end
27
-
28
- # determines if this response code was successful (according to http specs: 500~599)
29
- def is_server_error?
30
- code.to_i >= 500 && code.to_i <= 599
31
- end
32
-
33
- def etag
34
- self['Etag']
35
- end
36
-
37
- def last_modified
38
- self['Last-Modified']
39
- end
40
-
41
- end
42
-
43
- module Restfulie::Client::HTTP::ResponseCacheCheck
44
-
45
- def cache_max_age
46
- val = header_value_from('cache-control', /^\s*max-age=(\d+)/)
47
- if val
48
- val.to_i
49
- else
50
- 0
51
- end
52
- end
53
-
54
- def header_value_from(header, expression)
55
- h = value_for(headers[header], expression)
56
- return nil if h.nil?
57
- h.match(expression)[1]
58
- end
59
-
60
- def has_expired_cache?
61
- return true if headers['date'].nil?
62
- max_time = Time.rfc2822(headers['date'][0]) + cache_max_age.seconds
63
- Time.now > max_time
64
- end
65
-
66
- # checks if the header's max-age is available and no no-store if available.
67
- def may_cache?
68
- may_cache_method? && may_cache_field?(headers['cache-control'])
69
- end
70
-
71
- # Returns whether this cache control field allows caching
72
- #
73
- # may_cache_field(['max-age=2000', 'no-store']) == false
74
- # may_cache_field('max-age=2000,no-store') == false
75
- # may_cache_field('max-age=2000') == true
76
- def may_cache_field?(field)
77
- return false if field.nil?
78
-
79
- if field.kind_of? Array
80
- field.each do |f|
81
- return false if !may_cache_field?(f)
82
- end
83
- return true
84
- end
85
-
86
- max_age_header = value_for(field, /^max-age=(\d+)/)
87
- return false if max_age_header.nil?
88
-
89
- return !value_for(field, /^no-store/)
90
- end
91
-
92
- # extracts the header value for an specific expression, which can be located at the start or in the middle
93
- # of the expression
94
- def value_for(value, expression)
95
- value = value[0] if value.kind_of? Array
96
- value.split(",").find { |obj| obj.strip =~ expression }
97
- end
98
-
99
- # extracts all header values related to the Vary header from this response, in order
100
- # to implement Vary support from the HTTP Specification
101
- #
102
- # example
103
- # if the response Vary header is 'Accept','Accept-Language', we have
104
- # vary_headers_for({'Accept'=>'application/xml', 'Date' =>'...', 'Accept-Language'=>'de'}) == ['application/xml', 'de']
105
- # vary_headers_for({'Date' => '...', 'Accept-Language'=>'de'}) == [nil, 'de']
106
- def vary_headers_for(request)
107
- return nil if headers['vary'].nil?
108
- headers['vary'].split(',').map do |key|
109
- request[key.strip]
110
- end
111
- end
112
-
113
- private
114
- def may_cache_method?
115
- verb == :get || verb == :post
116
- end
117
- end
118
-
119
- class Net::HTTPResponse
120
- include Restfulie::Client::HTTP::ResponseStatus
121
- include Restfulie::Client::HTTP::ResponseCacheCheck
122
-
123
- end
@@ -1,13 +0,0 @@
1
- module Restfulie::Client::Cache
2
- module Restrictions
3
- class << self
4
-
5
- # checks whether this request verb and its cache headers allow caching
6
- def may_cache?(response)
7
- response && response.may_cache?
8
- end
9
-
10
- end
11
-
12
- end
13
- end
@@ -1,67 +0,0 @@
1
- module Restfulie
2
- module Client #:nodoc:
3
- # Use this class to configure the entry point and other relevant behaviors related to accessing or interacting with resources
4
- #
5
- # The available options are:
6
- #
7
- # * <tt>:entry_point</tt> - The URI for an entry point, such as http://resource.entrypoint.com/post
8
- # * <tt>:representations</tt> - Representations.
9
- #
10
- # You can also store any other custom configuration.
11
- #
12
- # ==== Example
13
- #
14
- # configuration = Configuration.new
15
- # configuration[:entry_point] = 'http://resource.entrypoint.com/post'
16
- # configuration[:entry_point] # => 'http://resource.entrypoint.com/post'
17
- #
18
- # or you can use:
19
- #
20
- # configuration.entry_point = 'http://resource.entrypoint.com/post'
21
- # configuration.entry_point # => 'http://resource.entrypoint.com/post'
22
- class Configuration < ::Hash
23
- # the current environment
24
- attr_reader :environment
25
-
26
- @@default_configuration = {
27
- :entry_point => '',
28
- :representations => {}
29
- }
30
-
31
- def initialize
32
- super
33
- self.environment = :development
34
- end
35
-
36
- # this will store a new configuration (based on the default) for the environment passed by value.
37
- def environment=(value)
38
- @environment = value
39
- unless has_key?(@environment)
40
- dee_clone = Marshal::load(Marshal::dump(@@default_configuration))
41
- store(@environment,dee_clone)
42
- end
43
- @environment
44
- end
45
-
46
- # access (key) configuration value
47
- def [](key)
48
- fetch(@environment)[key]
49
- end
50
-
51
- # store on (key) configuration the value
52
- def []=(key,value)
53
- fetch(@environment)[key] = value
54
- end
55
-
56
- def method_missing(name, *args, &block)
57
- method_name = name.to_s
58
- if method_name.last == '='
59
- fetch(environment)[method_name.chop.to_sym] = args[0]
60
- else
61
- value = fetch(environment)[name]
62
- value ? value : super
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,66 +0,0 @@
1
- module Restfulie::Client
2
- class Dsl
3
-
4
- def initialize
5
- @requests = []
6
- trait :base
7
- trait :verb
8
- request :base_request
9
- request :setup_header
10
- request :serialize_body
11
- request :enhance_response
12
- # request :cache
13
- request :follow_request
14
- end
15
-
16
- def request(what)
17
- req = "Restfulie::Client::Feature::#{what.to_s.classify}".constantize
18
- @requests << req
19
- self
20
- end
21
-
22
- def trait(sym)
23
- t = "Restfulie::Client::Feature::#{sym.to_s.classify}".constantize
24
- self.extend t
25
- self
26
- end
27
-
28
- def method_missing(sym, *args)
29
- if Restfulie::Client::Feature.const_defined? sym.to_s.classify
30
- loaded = true
31
- trait sym
32
- end
33
- if Restfulie::Client::Feature.const_defined? "#{sym.to_s.classify}Request"
34
- loaded = true
35
- request "#{sym.to_s}Request"
36
- end
37
- if loaded
38
- self
39
- else
40
- super sym, *args
41
- end
42
- end
43
-
44
- def request_flow(env = {})
45
- Parser.new(@requests).continue(self, nil, env)
46
- end
47
-
48
- end
49
-
50
- class Parser
51
-
52
- def initialize(stack)
53
- @stack = stack.dup
54
- end
55
-
56
- def continue(request, response, env)
57
- current = @stack.pop
58
- if current.nil?
59
- return response
60
- end
61
- filter = current.new
62
- filter.execute(self, request, response, env)
63
- end
64
-
65
- end
66
- end
@@ -1,61 +0,0 @@
1
-
2
- module Restfulie
3
- module Client#:nodoc
4
-
5
- module HTTP::RecipeModule
6
- def recipe(converter_sym, options={}, &block)
7
- raise 'Undefined block' unless block_given?
8
- converter = "Restfulie::Common::Converter::#{converter_sym.to_s.camelize}".constantize
9
- converter.describe_recipe(options[:name], &block)
10
- end
11
-
12
- @resources_configurations = {}
13
- def configuration_of(resource_name)
14
- @resources_configurations[resource_name]
15
- end
16
-
17
- def configuration_for(resource_name,configuration = Configuration.new)
18
- yield configuration if block_given?
19
- @resources_configurations[resource_name] = configuration
20
- end
21
-
22
- def retrieve(resource_name)
23
- returning Object.new do |resource|
24
- resource.extend(Base)
25
- resource.configure
26
- end
27
- end
28
- end
29
-
30
- class HTTP::Recipe < MasterDelegator
31
-
32
- def initialize(requester)
33
- @requester = requester
34
- @resources_configurations = {}
35
- end
36
-
37
- include Restfulie::Client::HTTP::RecipeModule
38
-
39
- end
40
-
41
- class EntryPoint
42
-
43
- @resources_configurations = {}
44
- extend Restfulie::Client::HTTP::RecipeModule
45
-
46
- def initialize(requester)
47
- @requester = requester
48
- end
49
-
50
- def self.at(uri)
51
- Restfulie.using {
52
- recipe
53
- follow_link
54
- request_marshaller
55
- verb_request
56
- }.at(uri)
57
- end
58
-
59
- end
60
- end
61
- end