Class: JSONHome
- Inherits:
-
Object
- Object
- JSONHome
- Defined in:
- lib/json_home.rb
Constant Summary collapse
- DEFAULT_NAMESPACE =
'http://helloworld.innoq.com'
Class Attribute Summary collapse
-
.default_namespace ⇒ Object
Returns the value of attribute default_namespace.
-
.ignore_http_errors ⇒ Object
Returns the value of attribute ignore_http_errors.
-
.logger ⇒ Object
Returns the value of attribute logger.
-
.use_additional_params ⇒ Object
Returns the value of attribute use_additional_params.
Instance Attribute Summary collapse
-
#base_uri ⇒ Object
readonly
Returns the value of attribute base_uri.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(base_uri, local_resources = nil) ⇒ JSONHome
constructor
A new instance of JSONHome.
- #reload(local_resources = nil) ⇒ Object
- #uri(resource, params = {}) ⇒ Object
- #uri?(resource) ⇒ Boolean
Constructor Details
#initialize(base_uri, local_resources = nil) ⇒ JSONHome
Returns a new instance of JSONHome.
29 30 31 32 33 |
# File 'lib/json_home.rb', line 29 def initialize(base_uri, local_resources = nil) @base_uri = URI.parse(base_uri) @resources = {} reload(local_resources) end |
Class Attribute Details
.default_namespace ⇒ Object
Returns the value of attribute default_namespace.
25 26 27 |
# File 'lib/json_home.rb', line 25 def default_namespace @default_namespace end |
.ignore_http_errors ⇒ Object
Returns the value of attribute ignore_http_errors.
25 26 27 |
# File 'lib/json_home.rb', line 25 def ignore_http_errors @ignore_http_errors end |
.logger ⇒ Object
Returns the value of attribute logger.
25 26 27 |
# File 'lib/json_home.rb', line 25 def logger @logger end |
.use_additional_params ⇒ Object
Returns the value of attribute use_additional_params.
25 26 27 |
# File 'lib/json_home.rb', line 25 def use_additional_params @use_additional_params end |
Instance Attribute Details
#base_uri ⇒ Object (readonly)
Returns the value of attribute base_uri.
20 21 22 |
# File 'lib/json_home.rb', line 20 def base_uri @base_uri end |
Class Method Details
.uri(resources, resource, params = {}) ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/json_home.rb', line 72 def self.uri(resources, resource, params = {}) resource = with_namespace(resource) unless uri?(resources, resource) self.warn "Couldn't find valid JSON home data for '#{resource}'" return nil end params = params.inject({}) { |h, (k, v)| h.merge(k.to_s => v) } data = resources[resource.to_s] if data['href'].is_a?(String) uri = data['href'] unknown_keys = params.keys elsif data['href-template'].is_a?(String) uri = data['href-template'] unknown_keys = (params.keys - data['href-vars'].keys) self.warn "Unknown keys #{unknown_keys.inspect} in ForeignLinks#uri call" if unknown_keys.any? data['href-vars'].each do |key, type_uri| self.warn("Missing key '#{key}' in ForeignLinks#uri call (rel=#{resource})") unless params[key] uri = uri.gsub("{#{key}}", params[key].to_s) end end if self.use_additional_params and unknown_keys.any? additional_params = URI.encode_www_form params.select{|k, v| unknown_keys.include? k } if uri.include? '?' uri + '&' + additional_params else uri + '?' + additional_params end else uri end end |
.uri?(resources, resource) ⇒ Boolean
107 108 109 110 111 112 113 |
# File 'lib/json_home.rb', line 107 def self.uri?(resources, resource) data = resources[self.with_namespace(resource)] data.is_a?(Hash) && ( data['href'].is_a?(String) || (data['href-template'].is_a?(String) && data['href-vars'].is_a?(Hash)) ) end |
Instance Method Details
#reload(local_resources = nil) ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/json_home.rb', line 35 def reload(local_resources = nil) Net::HTTP.start(@base_uri.host, @base_uri.port, :use_ssl => @base_uri.scheme == 'https') do |http| req = if local_resources.is_a?(Hash) r = Net::HTTP::Put.new(@base_uri.request_uri) r.body = JSON.generate('resources' => with_namespaces(local_resources)) r['Content-Type'] = 'application/json' r else Net::HTTP::Get.new(@base_uri.request_uri) end req['Accept'] = 'application/json-home' res = http.request(req) if res.is_a?(Net::HTTPSuccess) @resources = JSON.parse(res.body)['resources'] || {} self.class.logger.debug("Found ForeignLinks: #{@resources.keys.inspect}") if self.class.logger else raise RuntimeError.new("HTTP error: '#{res.code} #{res.}'") end end rescue Net::HTTPExceptions, Errno::ECONNREFUSED, RuntimeError => e if self.class.ignore_http_errors puts e self.class.logger.error(e) if self.class.logger @resources = with_namespaces(local_resources || {}) else raise e end end |
#uri(resource, params = {}) ⇒ Object
64 65 66 |
# File 'lib/json_home.rb', line 64 def uri(resource, params = {}) self.class.uri(@resources, resource, params) end |
#uri?(resource) ⇒ Boolean
68 69 70 |
# File 'lib/json_home.rb', line 68 def uri?(resource) self.class.uri?(@resources, resource) end |