hypermedia 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/api/api.rb ADDED
@@ -0,0 +1,25 @@
1
+ # encoding: UTF-8
2
+
3
+ module HypermediaAPI
4
+ require 'nokogiri'
5
+ require 'httparty'
6
+ include HTTParty
7
+
8
+ BadURI = Class.new(Exception)
9
+ MissingForm = Class.new(Exception)
10
+
11
+ class Parser < HTTParty::Parser
12
+ require 'nokogiri'
13
+
14
+ SupportedFormats.merge!('text/html' => :html)
15
+
16
+ def html
17
+ Nokogiri::HTML(body)
18
+ end
19
+ end
20
+
21
+ def HypermediaAPI.included (subclass)
22
+ subclass.send :include, HTTParty
23
+ subclass.parser HypermediaAPI::Parser
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+
3
+ class HypermediaAPI::Document
4
+ include HypermediaAPI
5
+
6
+ def Document.click (url)
7
+ response = Document.get(url)
8
+ Document.new(response)
9
+ end
10
+
11
+ def form (css_selector)
12
+ if form_element = @document.css(css_selector).first
13
+ action_uri = form_element['action']
14
+ http_method = form_element['method'].downcase
15
+
16
+ Form.new(action_uri, http_method)
17
+ else
18
+ raise MissingForm, "The API does not have a form matching '#{css_selector}' at #{@document.path}."
19
+ end
20
+ end
21
+
22
+ def headers
23
+ @document.headers
24
+ end
25
+
26
+ def html
27
+ @document.to_html
28
+ end
29
+
30
+ def initialize (httparty_nokogiri_document)
31
+ @document = httparty_nokogiri_document
32
+ end
33
+
34
+ def status
35
+ @document.code
36
+ end
37
+ end
data/lib/api/form.rb ADDED
@@ -0,0 +1,21 @@
1
+ # encoding: UTF-8
2
+
3
+ class HypermediaAPI::Form
4
+ include HypermediaAPI
5
+
6
+ def initialize (action_uri, http_method)
7
+ @action_uri = action_uri
8
+ @http_method = http_method.downcase
9
+ end
10
+
11
+ def submit (inputs)
12
+ case @http_method
13
+ when 'post' then response = Form.post(@action_uri, body: inputs)
14
+ end
15
+
16
+ HypermediaAPI::Document.new(response)
17
+
18
+ rescue SocketError
19
+ raise BadURI, "The client was unable to interact with a resource at #{@action_uri}."
20
+ end
21
+ end
data/lib/api/model.rb ADDED
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+
3
+ class HypermediaAPI::Model
4
+ def self.new_from_fields (field_elements)
5
+ instance = self.new
6
+
7
+ field_elements.each do |field_element|
8
+ value_str = field_element.inner_html
9
+ name = field_element['data-name']
10
+
11
+ value = case field_element['data-type']
12
+ when 'date' then value_str.empty? ? nil : Date.parse(value_str)
13
+ when 'integer' then value_str.empty? ? nil : value_str.to_i
14
+ when 'float' then value_str.empty? ? nil : value_str.to_f
15
+ when 'boolean' then value_str.empty? ? nil : value_str != 'false'
16
+ when 'string' then value_str
17
+ end
18
+
19
+ if instance.respond_to?(name)
20
+ instance.send(:"#{name}=", value)
21
+ end
22
+ end
23
+
24
+ instance
25
+ end
26
+ end
data/lib/hypermedia.rb ADDED
@@ -0,0 +1,9 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'bundler/setup'
4
+ require 'nokogiri'
5
+
6
+ require_relative 'api/api.rb'
7
+ require_relative 'api/document.rb'
8
+ require_relative 'api/form.rb'
9
+ require_relative 'api/model.rb'
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hypermedia
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jesse Sielaff
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-15 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: .
15
+ email: jesse@myenergy.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - ./lib/api/api.rb
21
+ - ./lib/api/document.rb
22
+ - ./lib/api/form.rb
23
+ - ./lib/api/model.rb
24
+ - ./lib/hypermedia.rb
25
+ homepage:
26
+ licenses: []
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - ! '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 1.8.15
46
+ signing_key:
47
+ specification_version: 3
48
+ summary: A client builder for HTML5-based HATEOAS APIs.
49
+ test_files: []