horizon_client 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8fbc26ad88c7153d70742da5e36297418d331f3f
4
- data.tar.gz: e9f1341564048999b61e9f2859a39c8b6e7f890c
3
+ metadata.gz: 06b84f8009e74940b022cfb6c7feb583e068d51c
4
+ data.tar.gz: b2670e249a5646c5b68c23343ff62b0f2beaf6d7
5
5
  SHA512:
6
- metadata.gz: 3bb0e9929ca4a976310477392f598cc5fba4d1d683315ac829b152f92c161eecf1713f75e1cbede84ad1815ba819001be19b453f2cd2e05ff06a15c2d913be86
7
- data.tar.gz: 8fb6742b74ce1ccbac74011c8b13bc9a8713626e91bdb61028d2e593c139780ab8c5944502201ece53752f3c51e32dc02f0a9db0807310539ed2c52c20e48e41
6
+ metadata.gz: 00ca8cad1ed53bf68bb309a446adcaff7dfddd124b572b3c8a6dbbb38e496ba9fdd984cb7036419fa79f2a8562ecc257ca88d52bce774835c830d8124dba47d7
7
+ data.tar.gz: 1cd29b3ef83dfd52158d679dd1693cd84a14cc296499ac7320ff89415959e36715fbcd078b609d2e8e645b456b4cc696d486bd42291730100caaba13332cb0d8
data/README.md CHANGED
@@ -7,12 +7,53 @@ Client to use with Horizon REST xml API.
7
7
  ```ruby
8
8
  client = HorizonClient.new
9
9
 
10
- get_response = client.get('example')
10
+ # incoming xml:
11
+ # <?xml version="1.0" encoding="UTF-8" standalone="no"?>
12
+ # <resource>
13
+ # <entity>
14
+ # <name>Jack</name>
15
+ # <foo><bar>Jill</bar></foo>
16
+ # </entity>
17
+ # <collection>
18
+ # <row>
19
+ # </row>
20
+ # <row>
21
+ # </row>
22
+ # </collection>
23
+ # </resource>
11
24
 
12
- post_response = client.post('example', 'post body')
13
- ```
25
+ # returns and expects HorizonClient::Resource object
26
+ resource = client.get('path')
27
+ return_resource = client.post('path', resource)
28
+
29
+ # get entity:
30
+ entity = resource.entity
31
+
32
+ # get and set object values
33
+ entity['name'] # => 'Jack'
34
+ entity['name'] = 'Jane'
35
+ entity['foo/bar'] # => 'Jill'
36
+ entity['foo/baz'] = 'Joe' # => <foo><bar>Jill</bar><baz>Joe</baz></foo>
14
37
 
15
- `get_response` will be parsed from xml to hash.
38
+ # get or set collection with specified name inside entity
39
+ col = entity.get_collection('col')
40
+ row = col.build # => #<HorizonClient::Entity>
41
+ # result:
42
+ # <entity>
43
+ # ...
44
+ # <col>
45
+ # <row></row>
46
+ # </col>
47
+ # </entity>
48
+
49
+ # get first level collection.
50
+ collection = resource.collection
51
+ entity_array = collection.rows # => [ #<HorizonClient::Entity> ]
52
+ entity_array.each do |entity|
53
+ entity['foo'] = 'test'
54
+ end
55
+
56
+ ```
16
57
 
17
58
 
18
59
  ### Necessary environment variables
@@ -28,6 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "webmock", "~> 2.0"
29
29
 
30
30
  spec.add_dependency 'faraday', '~> 0.11'
31
- spec.add_dependency 'multi_xml', '~> 0.6'
32
- spec.add_dependency 'faraday_middleware', '~> 0.11'
31
+ spec.add_dependency 'ox', '~> 2.4'
33
32
  end
@@ -0,0 +1,30 @@
1
+ module HorizonClient
2
+ class Collection
3
+ include Enumerable
4
+
5
+ attr_reader :node
6
+
7
+ def initialize(node)
8
+ @node = node
9
+ @rows = @node.locate('row').map do |row|
10
+ Entity.new(row)
11
+ end
12
+ end
13
+
14
+ def build
15
+ row = Ox::Element.new('row')
16
+ node << row
17
+ entity = Entity.new(row)
18
+ @rows.push(entity)
19
+ entity
20
+ end
21
+
22
+ def rows
23
+ @rows
24
+ end
25
+
26
+ def each(&block)
27
+ @rows.each(&block)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,45 @@
1
+ module HorizonClient
2
+ class Entity
3
+ attr_reader :node
4
+
5
+ def initialize(node)
6
+ @node = node
7
+ end
8
+
9
+ def [](name)
10
+ attr_node = node.locate(name).first
11
+ get_value attr_node
12
+ end
13
+
14
+ def []=(name, value)
15
+ elem = find_or_build_attribute(name.split('/'), node)
16
+ elem.replace_text(value)
17
+ end
18
+
19
+ def get_collection(name)
20
+ collection_node = find_or_build_attribute(name.split('/'), node)
21
+ Collection.new(collection_node)
22
+ end
23
+
24
+ private
25
+
26
+ def find_or_build_attribute(path, parent)
27
+ name = path.shift
28
+ unless child = parent.locate(name).first
29
+ child = Ox::Element.new(name)
30
+ parent << child
31
+ end
32
+ find_or_build_attribute(path, child) unless path.empty?
33
+
34
+ child
35
+ end
36
+
37
+ def get_value(node)
38
+ if node.respond_to?('href')
39
+ node.href.text
40
+ else
41
+ node.text
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,14 @@
1
+ module HorizonClient
2
+ module Request
3
+ class EncodeXml < Faraday::Middleware
4
+ def call(env)
5
+ env[:body] = encode env[:body]
6
+ @app.call env
7
+ end
8
+
9
+ def encode(payload)
10
+ payload.is_a?(Resource) ? Ox.dump(payload.document, with_xml: true) : payload
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ module HorizonClient
2
+ class Resource
3
+ attr_reader :document
4
+
5
+ def initialize(xml)
6
+ @document = Ox.parse(xml)
7
+ end
8
+
9
+ def entity
10
+ node = @document.resource.entity
11
+ Entity.new(node)
12
+ end
13
+
14
+ def collection
15
+ node = @document.resource.collection
16
+ @collection ||= Collection.new(node)
17
+ end
18
+
19
+ def error
20
+ if document.respond_to?('error')
21
+ document.error.message.text
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ module HorizonClient
2
+ module Response
3
+
4
+ class ResourceError < StandardError
5
+ end
6
+
7
+ class ParseXml < Faraday::Response::Middleware
8
+ def parse(body)
9
+ resource = Resource.new(body)
10
+
11
+ raise ResourceError.new(resource.error) if resource.error
12
+
13
+ resource
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module HorizonClient
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,36 +1,27 @@
1
1
  require "horizon_client/version"
2
2
  require "faraday"
3
- require "multi_xml"
4
- require "faraday_middleware"
3
+ require "ox"
4
+
5
+ require 'horizon_client/response/parse_xml'
6
+ require 'horizon_client/request/encode_xml'
7
+
8
+ require "horizon_client/resource"
9
+ require "horizon_client/collection"
10
+ require "horizon_client/entity"
5
11
 
6
12
  module HorizonClient
7
13
  def self.new(*args)
8
14
  Connection.new(*args)
9
15
  end
10
16
 
11
- class ClientError < Faraday::ClientError
12
- def initialize(e)
13
- message = e.message
14
- if e.response.is_a?(Hash)
15
- body = e.response[:body]
16
- if body.is_a?(Hash)
17
- error = body['error']
18
- if error.is_a?(Hash)
19
- message += ": #{error['message']}"
20
- end
21
- end
22
- end
23
- super message
24
- end
25
- end
26
-
27
17
  class Connection
28
18
  def initialize(url = nil)
29
19
  url ||= ENV['HORIZON_REST_URL']
30
20
 
31
21
  @connection = Faraday.new url do |conn|
32
22
  conn.response :raise_error
33
- conn.response :xml, :content_type => /\bxml$/
23
+ conn.use HorizonClient::Response::ParseXml
24
+ conn.use HorizonClient::Request::EncodeXml
34
25
 
35
26
  conn.adapter Faraday.default_adapter
36
27
  end
@@ -43,9 +34,6 @@ module HorizonClient
43
34
  def get(path = '', params = {})
44
35
  response = @connection.get path, params
45
36
  response.body
46
-
47
- rescue Faraday::ClientError => e
48
- raise ClientError.new(e)
49
37
  end
50
38
 
51
39
  def post(path = '', body)
@@ -56,8 +44,6 @@ module HorizonClient
56
44
  end
57
45
 
58
46
  response.body
59
- rescue Faraday::ClientError => e
60
- raise ClientError.new(e)
61
47
  end
62
48
  end
63
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: horizon_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - MAK IT
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-14 00:00:00.000000000 Z
11
+ date: 2017-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -81,33 +81,19 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.11'
83
83
  - !ruby/object:Gem::Dependency
84
- name: multi_xml
84
+ name: ox
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.6'
89
+ version: '2.4'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.6'
97
- - !ruby/object:Gem::Dependency
98
- name: faraday_middleware
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '0.11'
104
- type: :runtime
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '0.11'
96
+ version: '2.4'
111
97
  description: Client for Horizon by VISMA accounting REST xml API.
112
98
  email:
113
99
  - martins.lapsa@makit.lv
@@ -125,6 +111,11 @@ files:
125
111
  - bin/setup
126
112
  - horizon_client.gemspec
127
113
  - lib/horizon_client.rb
114
+ - lib/horizon_client/collection.rb
115
+ - lib/horizon_client/entity.rb
116
+ - lib/horizon_client/request/encode_xml.rb
117
+ - lib/horizon_client/resource.rb
118
+ - lib/horizon_client/response/parse_xml.rb
128
119
  - lib/horizon_client/version.rb
129
120
  homepage: http://rubygems.org/gems/horizon_client
130
121
  licenses: