caren-api 0.4.3 → 0.4.4
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/.rvmrc +1 -1
- data/Gemfile +3 -3
- data/Gemfile.lock +11 -15
- data/VERSION +1 -1
- data/caren-api.gemspec +15 -5
- data/lib/caren/base.rb +9 -1
- data/lib/caren/care_provider.rb +5 -11
- data/lib/caren/caren.rb +40 -10
- data/lib/caren/event.rb +1 -1
- data/lib/caren/external_message.rb +9 -3
- data/lib/caren/link.rb +9 -8
- data/lib/caren/person.rb +1 -1
- data/lib/caren/product.rb +75 -0
- data/lib/caren/product_category.rb +32 -0
- data/lib/caren-api.rb +3 -1
- data/spec/care_provider_spec.rb +2 -2
- data/spec/caren_spec.rb +9 -1
- data/spec/external_message_spec.rb +11 -2
- data/spec/fixtures/caren_external_messages.xml +27 -0
- data/spec/fixtures/caren_product_categories.xml +21 -0
- data/spec/fixtures/caren_product_categories_search.xml +12 -0
- data/spec/fixtures/caren_products.xml +35 -0
- data/spec/fixtures/caren_products_search.xml +19 -0
- data/spec/fixtures/incoming_single_object.xml +14 -0
- data/spec/product_category_spec.rb +47 -0
- data/spec/product_spec.rb +58 -0
- data/spec/spec_helper.rb +8 -0
- metadata +18 -6
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm use 1.8.7@api
|
1
|
+
rvm use 1.8.7@caren-api
|
data/Gemfile
CHANGED
@@ -3,13 +3,13 @@ source "http://rubygems.org"
|
|
3
3
|
gem "i18n", ">= 0"
|
4
4
|
gem "activesupport", ">= 0"
|
5
5
|
gem "builder", ">= 0"
|
6
|
-
gem "rest-client", "
|
6
|
+
gem "rest-client", "1.6.7"
|
7
7
|
|
8
8
|
group :development do
|
9
9
|
gem "bundler"
|
10
10
|
gem "rcov"
|
11
11
|
gem "capybara"
|
12
12
|
gem "rspec"
|
13
|
-
gem "fakeweb"
|
13
|
+
gem "fakeweb"
|
14
14
|
gem "jeweler"
|
15
|
-
end
|
15
|
+
end
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,8 @@
|
|
1
|
-
GIT
|
2
|
-
remote: git://github.com/nedap/fakeweb.git
|
3
|
-
revision: c91964160483fa2aeed89945461b50d75b9016b5
|
4
|
-
branch: master
|
5
|
-
specs:
|
6
|
-
fakeweb (1.2.2.1)
|
7
|
-
|
8
1
|
GEM
|
9
2
|
remote: http://rubygems.org/
|
10
3
|
specs:
|
11
|
-
activesupport (3.
|
4
|
+
activesupport (3.1.1)
|
5
|
+
multi_json (~> 1.0)
|
12
6
|
builder (3.0.0)
|
13
7
|
capybara (1.1.1)
|
14
8
|
mime-types (>= 1.16)
|
@@ -20,6 +14,7 @@ GEM
|
|
20
14
|
childprocess (0.2.2)
|
21
15
|
ffi (~> 1.0.6)
|
22
16
|
diff-lcs (1.1.3)
|
17
|
+
fakeweb (1.3.0)
|
23
18
|
ffi (1.0.9)
|
24
19
|
git (1.2.5)
|
25
20
|
i18n (0.6.0)
|
@@ -28,12 +23,13 @@ GEM
|
|
28
23
|
git (>= 1.2.5)
|
29
24
|
rake
|
30
25
|
json_pure (1.6.1)
|
31
|
-
mime-types (1.
|
26
|
+
mime-types (1.17.1)
|
27
|
+
multi_json (1.0.3)
|
32
28
|
nokogiri (1.5.0)
|
33
29
|
rack (1.3.5)
|
34
30
|
rack-test (0.6.1)
|
35
31
|
rack (>= 1.0)
|
36
|
-
rake (0.
|
32
|
+
rake (0.9.2.2)
|
37
33
|
rcov (0.9.11)
|
38
34
|
rest-client (1.6.7)
|
39
35
|
mime-types (>= 1.16)
|
@@ -41,14 +37,14 @@ GEM
|
|
41
37
|
rspec-core (~> 2.7.0)
|
42
38
|
rspec-expectations (~> 2.7.0)
|
43
39
|
rspec-mocks (~> 2.7.0)
|
44
|
-
rspec-core (2.7.
|
40
|
+
rspec-core (2.7.1)
|
45
41
|
rspec-expectations (2.7.0)
|
46
42
|
diff-lcs (~> 1.1.2)
|
47
43
|
rspec-mocks (2.7.0)
|
48
44
|
rubyzip (0.9.4)
|
49
|
-
selenium-webdriver (2.
|
45
|
+
selenium-webdriver (2.9.1)
|
50
46
|
childprocess (>= 0.2.1)
|
51
|
-
ffi (
|
47
|
+
ffi (= 1.0.9)
|
52
48
|
json_pure
|
53
49
|
rubyzip
|
54
50
|
xpath (0.1.4)
|
@@ -62,9 +58,9 @@ DEPENDENCIES
|
|
62
58
|
builder
|
63
59
|
bundler
|
64
60
|
capybara
|
65
|
-
fakeweb
|
61
|
+
fakeweb
|
66
62
|
i18n
|
67
63
|
jeweler
|
68
64
|
rcov
|
69
|
-
rest-client
|
65
|
+
rest-client (= 1.6.7)
|
70
66
|
rspec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.4
|
data/caren-api.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{caren-api}
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andre Foeken"]
|
12
|
-
s.date = %q{2011-10-
|
12
|
+
s.date = %q{2011-10-26}
|
13
13
|
s.description = %q{You can use this gem as inspiration of the base of your connections with Caren.}
|
14
14
|
s.email = %q{andre.foeken@nedap.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -38,6 +38,8 @@ Gem::Specification.new do |s|
|
|
38
38
|
"lib/caren/external_message.rb",
|
39
39
|
"lib/caren/link.rb",
|
40
40
|
"lib/caren/person.rb",
|
41
|
+
"lib/caren/product.rb",
|
42
|
+
"lib/caren/product_category.rb",
|
41
43
|
"spec/.DS_Store",
|
42
44
|
"spec/care_provider_spec.rb",
|
43
45
|
"spec/caren_spec.rb",
|
@@ -47,12 +49,20 @@ Gem::Specification.new do |s|
|
|
47
49
|
"spec/fixtures/caren_care_provider_validation.xml",
|
48
50
|
"spec/fixtures/caren_care_providers.xml",
|
49
51
|
"spec/fixtures/caren_care_providers_search.xml",
|
52
|
+
"spec/fixtures/caren_external_messages.xml",
|
50
53
|
"spec/fixtures/caren_links.xml",
|
51
54
|
"spec/fixtures/caren_links_search.xml",
|
55
|
+
"spec/fixtures/caren_product_categories.xml",
|
56
|
+
"spec/fixtures/caren_product_categories_search.xml",
|
57
|
+
"spec/fixtures/caren_products.xml",
|
58
|
+
"spec/fixtures/caren_products_search.xml",
|
52
59
|
"spec/fixtures/caren_unauthorized.xml",
|
53
60
|
"spec/fixtures/incoming.xml",
|
61
|
+
"spec/fixtures/incoming_single_object.xml",
|
54
62
|
"spec/link_spec.rb",
|
55
63
|
"spec/person_spec.rb",
|
64
|
+
"spec/product_category_spec.rb",
|
65
|
+
"spec/product_spec.rb",
|
56
66
|
"spec/spec.opts",
|
57
67
|
"spec/spec_helper.rb"
|
58
68
|
]
|
@@ -70,7 +80,7 @@ Gem::Specification.new do |s|
|
|
70
80
|
s.add_runtime_dependency(%q<i18n>, [">= 0"])
|
71
81
|
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
72
82
|
s.add_runtime_dependency(%q<builder>, [">= 0"])
|
73
|
-
s.add_runtime_dependency(%q<rest-client>, ["
|
83
|
+
s.add_runtime_dependency(%q<rest-client>, ["= 1.6.7"])
|
74
84
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
75
85
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
76
86
|
s.add_development_dependency(%q<capybara>, [">= 0"])
|
@@ -81,7 +91,7 @@ Gem::Specification.new do |s|
|
|
81
91
|
s.add_dependency(%q<i18n>, [">= 0"])
|
82
92
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
83
93
|
s.add_dependency(%q<builder>, [">= 0"])
|
84
|
-
s.add_dependency(%q<rest-client>, ["
|
94
|
+
s.add_dependency(%q<rest-client>, ["= 1.6.7"])
|
85
95
|
s.add_dependency(%q<bundler>, [">= 0"])
|
86
96
|
s.add_dependency(%q<rcov>, [">= 0"])
|
87
97
|
s.add_dependency(%q<capybara>, [">= 0"])
|
@@ -93,7 +103,7 @@ Gem::Specification.new do |s|
|
|
93
103
|
s.add_dependency(%q<i18n>, [">= 0"])
|
94
104
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
95
105
|
s.add_dependency(%q<builder>, [">= 0"])
|
96
|
-
s.add_dependency(%q<rest-client>, ["
|
106
|
+
s.add_dependency(%q<rest-client>, ["= 1.6.7"])
|
97
107
|
s.add_dependency(%q<bundler>, [">= 0"])
|
98
108
|
s.add_dependency(%q<rcov>, [">= 0"])
|
99
109
|
s.add_dependency(%q<capybara>, [">= 0"])
|
data/lib/caren/base.rb
CHANGED
@@ -17,7 +17,7 @@ class Caren::Base
|
|
17
17
|
|
18
18
|
# List of available attributes for this object
|
19
19
|
def self.keys
|
20
|
-
[]
|
20
|
+
[ :updated_at, :created_at, :action ]
|
21
21
|
end
|
22
22
|
|
23
23
|
# Root name of the XML array of objects
|
@@ -43,6 +43,7 @@ class Caren::Base
|
|
43
43
|
# Convert a XML string to a single object or an array of objects
|
44
44
|
def self.from_xml xml
|
45
45
|
hash = xml.is_a?(Hash) ? xml : Hash.from_xml(xml)
|
46
|
+
raise Caren::Exceptions::InvalidXmlResponse unless hash
|
46
47
|
if hash.has_key?(self.array_root.to_s)
|
47
48
|
return hash[self.array_root.to_s].map{ |h| self.from_xml(h) }
|
48
49
|
elsif hash.has_key?(self.node_root)
|
@@ -76,6 +77,13 @@ class Caren::Base
|
|
76
77
|
self.class.resource_url(id)
|
77
78
|
end
|
78
79
|
|
80
|
+
def self.hash_from_image hash_or_path
|
81
|
+
return hash_or_path if hash_or_path.is_a?(Hash)
|
82
|
+
{ :name => File.basename(hash_or_path),
|
83
|
+
:content => Base64.encode64(File.open(hash_or_path).read),
|
84
|
+
:content_type => `file -Ib #{hash_or_path}`.gsub(/\n/,"").split(";")[0] }
|
85
|
+
end
|
86
|
+
|
79
87
|
private
|
80
88
|
|
81
89
|
# Method missing calls to enable getters/setters
|
data/lib/caren/care_provider.rb
CHANGED
@@ -5,12 +5,13 @@
|
|
5
5
|
class Caren::CareProvider < Caren::Base
|
6
6
|
|
7
7
|
def self.keys
|
8
|
-
[ :id, #
|
8
|
+
[ :id, # Integer (The id of this CP inside Caren)
|
9
9
|
:name, # String
|
10
10
|
:telephone, # String
|
11
11
|
:website, # String
|
12
12
|
:email, # String
|
13
13
|
:address_line, # String (Kerkstraat 1, 7522AH, Enschede)
|
14
|
+
:logo, # String
|
14
15
|
:url_shortcut, # String
|
15
16
|
:time_zone, # String (Amsterdam)
|
16
17
|
:resolution, # String (exact,daypart,range)
|
@@ -22,7 +23,7 @@ class Caren::CareProvider < Caren::Base
|
|
22
23
|
:communication, # Boolean
|
23
24
|
:api_push_support, # Boolean
|
24
25
|
:api_url # String (Required url to api resources)
|
25
|
-
]
|
26
|
+
] + super
|
26
27
|
end
|
27
28
|
|
28
29
|
def self.search key, value, session
|
@@ -62,19 +63,12 @@ class Caren::CareProvider < Caren::Base
|
|
62
63
|
|
63
64
|
def to_logo_xml logo_hash_or_path
|
64
65
|
builder = Builder::XmlMarkup.new
|
65
|
-
logo = self.class.
|
66
|
+
logo = self.class.hash_from_image(logo_hash_or_path)
|
66
67
|
xml = builder.care_provider do |care_provider|
|
67
68
|
care_provider.tag!("logo", logo[:content], "name" => logo[:name], "content-type" => logo[:content_type] ) if logo
|
68
69
|
end
|
69
70
|
end
|
70
|
-
|
71
|
-
def self.logo_hash logo_hash_or_path
|
72
|
-
return logo_hash_or_path if logo_hash_or_path.is_a?(Hash)
|
73
|
-
{ :name => File.basename(logo_hash_or_path),
|
74
|
-
:content => Base64.encode64(File.open(logo_hash_or_path).read),
|
75
|
-
:content_type => `file -Ib #{logo_hash_or_path}`.gsub(/\n/,"").split(";")[0] }
|
76
|
-
end
|
77
|
-
|
71
|
+
|
78
72
|
def self.resource_location
|
79
73
|
"/api/pro/care_providers/"
|
80
74
|
end
|
data/lib/caren/caren.rb
CHANGED
@@ -6,6 +6,8 @@ module Caren
|
|
6
6
|
|
7
7
|
class SignatureMismatch < Caren::Exceptions::StandardError ; end
|
8
8
|
|
9
|
+
class InvalidXmlResponse < Caren::Exceptions::StandardError ; end
|
10
|
+
|
9
11
|
class ServerSideError < Caren::Exceptions::StandardError
|
10
12
|
|
11
13
|
attr_accessor :errors
|
@@ -102,20 +104,48 @@ module Caren
|
|
102
104
|
}
|
103
105
|
end
|
104
106
|
|
107
|
+
# These types of Caren objects are supported by the Caren::Api.incoming method
|
108
|
+
def self.supported_incoming_single_objects
|
109
|
+
singles = {}
|
110
|
+
self.supported_incoming_objects.each do |object,klass|
|
111
|
+
singles[ klass.node_root ] = klass
|
112
|
+
end
|
113
|
+
return singles
|
114
|
+
end
|
115
|
+
|
105
116
|
# Pass an XML string to be handled. Only a valid caren_objects xml hash will be parsed.
|
106
|
-
def incoming xml, signature
|
107
|
-
if self.verify_signature(signature,xml)
|
108
|
-
|
109
|
-
hash = Hash.from_xml(xml)["caren_objects"]
|
110
|
-
Caren::Api.supported_incoming_objects.each do |key,klass|
|
111
|
-
objects << (hash[key]||hash[key.to_s]||[]).map{ |h| klass.new(h) }
|
112
|
-
end
|
113
|
-
return objects.flatten
|
117
|
+
def incoming xml, signature, timestamp
|
118
|
+
if self.verify_signature(signature,timestamp, xml)
|
119
|
+
return parse(xml)
|
114
120
|
else
|
115
121
|
raise Caren::Exceptions::SignatureMismatch.new
|
116
122
|
end
|
117
123
|
end
|
118
124
|
|
125
|
+
def parse xml
|
126
|
+
objects = []
|
127
|
+
hash = Hash.from_xml(xml)
|
128
|
+
if hash["caren_objects"]
|
129
|
+
hash = hash["caren_objects"]
|
130
|
+
end
|
131
|
+
Caren::Api.supported_incoming_objects.each do |key,klass|
|
132
|
+
objects << (hash[key]||hash[key.to_s]||[]).map{ |h| klass.new(h) }
|
133
|
+
end
|
134
|
+
return objects.flatten
|
135
|
+
end
|
136
|
+
|
137
|
+
def parse_object xml
|
138
|
+
hash = Hash.from_xml(xml)
|
139
|
+
#todo: rewrite so we lookup the xml tag in the supported_incoming_single_objects hash, faster :)
|
140
|
+
Caren::Api.supported_incoming_single_objects.each do |key, klass|
|
141
|
+
object = hash[key] || hash[key.to_s]
|
142
|
+
if object
|
143
|
+
return klass.new(object)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
|
119
149
|
# Sign your string and timestamp using private key
|
120
150
|
# Timestamp is UNIX timestamp seconds since 1970
|
121
151
|
def sign timestamp, string=nil, private_key=self.private_key
|
@@ -132,6 +162,7 @@ module Caren
|
|
132
162
|
|
133
163
|
# Verify the signature using the caren public key
|
134
164
|
def verify_signature signature, timestamp, string=nil, public_key=self.caren_public_key
|
165
|
+
return false unless public_key
|
135
166
|
signature = Base64.decode64(CGI.unescape(signature.to_s))
|
136
167
|
public_key.verify( "sha1", signature, string.to_s + timestamp.to_s )
|
137
168
|
end
|
@@ -149,8 +180,7 @@ module Caren
|
|
149
180
|
else
|
150
181
|
errors << Caren::Error.new( error.attributes["category"], error.text.strip )
|
151
182
|
end
|
152
|
-
end
|
153
|
-
y errors
|
183
|
+
end
|
154
184
|
raise Caren::Exceptions::ServerSideError.new(errors)
|
155
185
|
end
|
156
186
|
|
data/lib/caren/event.rb
CHANGED
@@ -1,17 +1,23 @@
|
|
1
1
|
class Caren::ExternalMessage < Caren::Base
|
2
2
|
|
3
3
|
def self.keys
|
4
|
-
[ :id, #
|
4
|
+
[ :id, # Integer (Caren message id)
|
5
5
|
:person_name, # String (Andre Foeken)
|
6
|
+
:person_id, # Integer (Caren person id)
|
6
7
|
:external_person_id, # String (Your person id)
|
8
|
+
:care_provider_id, # Integer (Caren CP id)
|
7
9
|
:body, # Text
|
8
10
|
:external_id, # String (Your message id)
|
9
11
|
:in_reply_to_id, # Integer (Caren message id)
|
10
12
|
:in_reply_to_type, # The type of message this is a reply to. (Always ExternalMessage if reply is set)
|
11
13
|
:subject_id # Integer (Caren person id)
|
12
|
-
]
|
14
|
+
] + super
|
13
15
|
end
|
14
|
-
|
16
|
+
|
17
|
+
def self.all subject_id, session
|
18
|
+
from_xml session.get(self.resource_url(subject_id))
|
19
|
+
end
|
20
|
+
|
15
21
|
def create session
|
16
22
|
session.post self.class.resource_url(self.subject_id), self.to_xml
|
17
23
|
end
|
data/lib/caren/link.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
class Caren::Link < Caren::Base
|
2
2
|
|
3
3
|
def self.keys
|
4
|
-
[:id,
|
5
|
-
:person_name,
|
6
|
-
:
|
7
|
-
:
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
|
4
|
+
[:id, # Integer (Caren id)
|
5
|
+
:person_name, # String (Caren person name)
|
6
|
+
:care_provider_id, # Integer
|
7
|
+
:person_id, # String (Caren person id)
|
8
|
+
:person_photo, # String (url of photo)
|
9
|
+
:patient_number, # String (12345)
|
10
|
+
:external_id, # String (Your person id)
|
11
|
+
:status # String (pending,confirmed,cancelled)
|
12
|
+
] + super
|
12
13
|
end
|
13
14
|
|
14
15
|
def self.search key, value, session
|
data/lib/caren/person.rb
CHANGED
@@ -0,0 +1,75 @@
|
|
1
|
+
class Caren::Product < Caren::Base
|
2
|
+
|
3
|
+
def self.keys
|
4
|
+
[ :id, # Integer (Id of this product in Caren)
|
5
|
+
:name, # String
|
6
|
+
:description, # Text
|
7
|
+
:care_provider_id, # Integer (Care provider id)
|
8
|
+
:product_category_id, # Integer (Reference to product category; Caren id)
|
9
|
+
:photo, # String
|
10
|
+
:in_store, # Boolean (Use in store)
|
11
|
+
:unit, # String (piece, minute, hour)
|
12
|
+
:price, # Integer (in eurocents)
|
13
|
+
:rounding, # Integer (in minutes)
|
14
|
+
:min_amount, # Integer (in minutes)
|
15
|
+
:status, # String (pending, active)
|
16
|
+
:valid_from, # Date
|
17
|
+
:valid_to # Date
|
18
|
+
] + super
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.search key, value, session
|
22
|
+
from_xml session.get( self.search_url(key,value) )
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.all session
|
26
|
+
from_xml session.get(self.resource_url)
|
27
|
+
end
|
28
|
+
|
29
|
+
def create session
|
30
|
+
session.post(self.resource_url, self.to_xml)
|
31
|
+
end
|
32
|
+
|
33
|
+
def update session
|
34
|
+
session.put(self.resource_url(self.id), self.to_xml)
|
35
|
+
end
|
36
|
+
|
37
|
+
def update_photo photo_hash_or_path, session
|
38
|
+
session.put(self.resource_url(self.id), self.to_photo_xml(photo_hash_or_path))
|
39
|
+
end
|
40
|
+
|
41
|
+
def as_xml
|
42
|
+
{ :name => self.name,
|
43
|
+
:description => self.description,
|
44
|
+
:product_category_id => self.product_category_id,
|
45
|
+
:in_store => self.in_store,
|
46
|
+
:unit => self.unit,
|
47
|
+
:price => self.price,
|
48
|
+
:rounding => self.rounding,
|
49
|
+
:min_amount => self.min_amount,
|
50
|
+
:valid_from => self.valid_from,
|
51
|
+
:valid_to => self.valid_to
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_photo_xml photo_hash_or_path
|
56
|
+
builder = Builder::XmlMarkup.new
|
57
|
+
photo = self.class.hash_from_image(photo_hash_or_path)
|
58
|
+
xml = builder.product do |product|
|
59
|
+
product.tag!("photo", photo[:content], "name" => photo[:name], "content-type" => photo[:content_type] ) if photo
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.array_root
|
64
|
+
:products
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.node_root
|
68
|
+
:product
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.resource_location
|
72
|
+
"/api/pro/products/"
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Caren::ProductCategory < Caren::Base
|
2
|
+
|
3
|
+
def self.keys
|
4
|
+
[ :id, # Integer (Id of this category in Caren)
|
5
|
+
:name, # String
|
6
|
+
:description, # Text
|
7
|
+
:icon, # String
|
8
|
+
:product_category_id # Integer (Parent category; Caren id; Nil for root node)
|
9
|
+
] + super
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.search key, value, session
|
13
|
+
from_xml session.get( self.search_url(key,value) )
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.all session
|
17
|
+
from_xml session.get(self.resource_url)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.array_root
|
21
|
+
:product_categories
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.node_root
|
25
|
+
:product_category
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.resource_location
|
29
|
+
"/api/pro/product_categories/"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/lib/caren-api.rb
CHANGED
@@ -18,4 +18,6 @@ require "#{File.dirname(__FILE__)}/caren/event.rb"
|
|
18
18
|
require "#{File.dirname(__FILE__)}/caren/person.rb"
|
19
19
|
require "#{File.dirname(__FILE__)}/caren/care_provider.rb"
|
20
20
|
require "#{File.dirname(__FILE__)}/caren/external_message.rb"
|
21
|
-
require "#{File.dirname(__FILE__)}/caren/link.rb"
|
21
|
+
require "#{File.dirname(__FILE__)}/caren/link.rb"
|
22
|
+
require "#{File.dirname(__FILE__)}/caren/product.rb"
|
23
|
+
require "#{File.dirname(__FILE__)}/caren/product_category.rb"
|
data/spec/care_provider_spec.rb
CHANGED
@@ -59,7 +59,7 @@ describe "CareProvider" do
|
|
59
59
|
|
60
60
|
it "should be able to convert a image file path to a hash suited for xml conversion" do
|
61
61
|
filename = "spec/fixtures/bacon.jpg"
|
62
|
-
logo = Caren::CareProvider.
|
62
|
+
logo = Caren::CareProvider.hash_from_image( filename )
|
63
63
|
logo[:content_type].should == "image/jpeg"
|
64
64
|
logo[:name].should == "bacon.jpg"
|
65
65
|
logo[:content].should == Base64.encode64(File.open(filename).read)
|
@@ -72,7 +72,7 @@ describe "CareProvider", "REST methods" do
|
|
72
72
|
before do
|
73
73
|
care_providers = File.read("spec/fixtures/caren_care_providers.xml")
|
74
74
|
care_providers_search = File.read("spec/fixtures/caren_care_providers_search.xml")
|
75
|
-
|
75
|
+
|
76
76
|
care_provider_url = Caren::Api.session.url_for( Caren::CareProvider.resource_url(1) )
|
77
77
|
care_providers_url = Caren::Api.session.url_for( Caren::CareProvider.resource_url )
|
78
78
|
search_url = Caren::Api.session.url_for( "#{Caren::CareProvider.resource_url}?key=url-shortcut&value=pantein" )
|
data/spec/caren_spec.rb
CHANGED
@@ -73,7 +73,8 @@ describe "Caren", "signature checks" do
|
|
73
73
|
|
74
74
|
it "should be able to handle incoming xml from caren" do
|
75
75
|
incoming = File.read "spec/fixtures/incoming.xml"
|
76
|
-
|
76
|
+
timestamp = DateTime.now.to_i
|
77
|
+
results = Caren::Api.session.incoming(incoming, Caren::Api.session.sign(timestamp, incoming), timestamp )
|
77
78
|
results.should have(4).things
|
78
79
|
external_messages = results.select{ |x| x.is_a?(Caren::ExternalMessage) }
|
79
80
|
external_messages.first.id.should == 1
|
@@ -81,4 +82,11 @@ describe "Caren", "signature checks" do
|
|
81
82
|
links.last.id.should == 3
|
82
83
|
end
|
83
84
|
|
85
|
+
it "should be able to parse just one incoming object from xml from caren" do
|
86
|
+
incoming = File.read "spec/fixtures/incoming_single_object.xml"
|
87
|
+
object = Caren::Api.session.parse_object(incoming)
|
88
|
+
object.body.should == 'Expecting this to work somehow ...'
|
89
|
+
object.id.should == 1
|
90
|
+
end
|
91
|
+
|
84
92
|
end
|
@@ -29,14 +29,23 @@ end
|
|
29
29
|
describe "ExternalMessage", "REST methods" do
|
30
30
|
|
31
31
|
before do
|
32
|
-
|
32
|
+
messages = File.read("spec/fixtures/caren_external_messages.xml")
|
33
|
+
|
34
|
+
messages_url = Caren::Api.session.url_for( Caren::ExternalMessage.resource_url(1) )
|
33
35
|
delete_url = Caren::Api.session.url_for( Caren::ExternalMessage.resource_url(1,1) )
|
34
36
|
timestamp = DateTime.now.to_i
|
35
37
|
|
36
|
-
FakeWeb.register_uri(:
|
38
|
+
FakeWeb.register_uri(:get, messages_url, :body => messages, :signature => Caren::Api.session.sign(timestamp,messages), :timestamp => timestamp )
|
39
|
+
FakeWeb.register_uri(:post, messages_url, :status => 201, :signature => Caren::Api.session.sign(timestamp), :timestamp => timestamp )
|
37
40
|
FakeWeb.register_uri(:delete, delete_url, :signature => Caren::Api.session.sign(timestamp), :timestamp => timestamp )
|
38
41
|
end
|
39
42
|
|
43
|
+
it "should be able to find all external messages" do
|
44
|
+
messages = Caren::ExternalMessage.all 1, Caren::Api.session
|
45
|
+
messages.should have(2).things
|
46
|
+
messages.first.body.should == "Test"
|
47
|
+
end
|
48
|
+
|
40
49
|
it "should be able to create an external message" do
|
41
50
|
lambda{ Caren::ExternalMessage.new( :person_name => "Andre Foeken",
|
42
51
|
:external_person_id => 1,
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<external-messages type="array">
|
3
|
+
<external-message>
|
4
|
+
<created-at type="datetime">2011-09-09T15:14:13+02:00</created-at>
|
5
|
+
<body>Test</body>
|
6
|
+
<updated-at type="datetime">2011-09-09T15:14:13+02:00</updated-at>
|
7
|
+
<in-reply-to-id type="integer" nil="true"></in-reply-to-id>
|
8
|
+
<subject-id type="integer">5</subject-id>
|
9
|
+
<id type="integer">1</id>
|
10
|
+
<in-reply-to-type nil="true"></in-reply-to-type>
|
11
|
+
<care-provider-id type="integer">1</care-provider-id>
|
12
|
+
<person-id type="integer">1</person-id>
|
13
|
+
<external-person-id nil="true"></external-person-id>
|
14
|
+
</external-message>
|
15
|
+
<external-message>
|
16
|
+
<created-at type="datetime">2011-09-09T15:14:13+02:00</created-at>
|
17
|
+
<body>Does it work ...</body>
|
18
|
+
<updated-at type="datetime">2011-09-09T15:14:13+02:00</updated-at>
|
19
|
+
<in-reply-to-id type="integer" nil="true"></in-reply-to-id>
|
20
|
+
<subject-id type="integer">5</subject-id>
|
21
|
+
<id type="integer">2</id>
|
22
|
+
<in-reply-to-type nil="true"></in-reply-to-type>
|
23
|
+
<care-provider-id type="integer">1</care-provider-id>
|
24
|
+
<person-id type="integer">1</person-id>
|
25
|
+
<external-person-id nil="true"></external-person-id>
|
26
|
+
</external-message>
|
27
|
+
</external-messages>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<product-categories type="array">
|
3
|
+
<product-category>
|
4
|
+
<name>Products</name>
|
5
|
+
<created-at type="datetime">2011-10-10T10:38:49+02:00</created-at>
|
6
|
+
<updated-at type="datetime">2011-10-10T10:40:35+02:00</updated-at>
|
7
|
+
<product-category-id type="integer"></product-category-id>
|
8
|
+
<id type="integer">1</id>
|
9
|
+
<description>Generic products</description>
|
10
|
+
<icon>http://example.com/1.png</icon>
|
11
|
+
</product-category>
|
12
|
+
<product-category>
|
13
|
+
<name>Services</name>
|
14
|
+
<created-at type="datetime">2011-10-10T10:38:49+02:00</created-at>
|
15
|
+
<updated-at type="datetime">2011-10-10T10:40:35+02:00</updated-at>
|
16
|
+
<product-category-id type="integer"></product-category-id>
|
17
|
+
<id type="integer">2</id>
|
18
|
+
<description>Generic services</description>
|
19
|
+
<icon>http://example.com/2.png</icon>
|
20
|
+
</product-category>
|
21
|
+
</product-categories>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<product-categories type="array">
|
3
|
+
<product-category>
|
4
|
+
<name>products</name>
|
5
|
+
<created-at type="datetime">2011-10-10T10:38:49+02:00</created-at>
|
6
|
+
<updated-at type="datetime">2011-10-10T10:40:35+02:00</updated-at>
|
7
|
+
<product-category-id type="integer"></product-category-id>
|
8
|
+
<id type="integer">1</id>
|
9
|
+
<description>Generic products</description>
|
10
|
+
<icon>http://example.com/1.png</icon>
|
11
|
+
</product-category>
|
12
|
+
</product-categories>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<products type="array">
|
3
|
+
<product>
|
4
|
+
<price type="integer">10000</price>
|
5
|
+
<in-store type="boolean">true</in-store>
|
6
|
+
<name>Dishwashing</name>
|
7
|
+
<created-at type="datetime">2011-10-10T10:38:49+02:00</created-at>
|
8
|
+
<updated-at type="datetime">2011-10-10T10:40:35+02:00</updated-at>
|
9
|
+
<valid-to type="date">9999-01-01</valid-to>
|
10
|
+
<product-category-id type="integer">1</product-category-id>
|
11
|
+
<id type="integer">1</id>
|
12
|
+
<valid-from type="date">2011-01-01</valid-from>
|
13
|
+
<unit>piece</unit>
|
14
|
+
<description>Nice Dishwashing</description>
|
15
|
+
<status>pending</status>
|
16
|
+
<rounding type="integer">0</rounding>
|
17
|
+
<photo>http://example.com/1.png</photo>
|
18
|
+
</product>
|
19
|
+
<product>
|
20
|
+
<price type="integer">12000</price>
|
21
|
+
<in-store type="boolean">true</in-store>
|
22
|
+
<name>Krukken</name>
|
23
|
+
<created-at type="datetime">2011-10-10T10:38:49+02:00</created-at>
|
24
|
+
<updated-at type="datetime">2011-10-10T10:40:35+02:00</updated-at>
|
25
|
+
<valid-to type="date">9999-01-01</valid-to>
|
26
|
+
<product-category-id type="integer">1</product-category-id>
|
27
|
+
<id type="integer">2</id>
|
28
|
+
<valid-from type="date">2011-01-01</valid-from>
|
29
|
+
<unit>piece</unit>
|
30
|
+
<description>Nice krukken</description>
|
31
|
+
<status>pending</status>
|
32
|
+
<rounding type="integer">0</rounding>
|
33
|
+
<photo>http://example.com/2.png</photo>
|
34
|
+
</product>
|
35
|
+
</products>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<products type="array">
|
3
|
+
<product>
|
4
|
+
<price type="integer">10000</price>
|
5
|
+
<in-store type="boolean">true</in-store>
|
6
|
+
<name>bedpan</name>
|
7
|
+
<created-at type="datetime">2011-10-10T10:38:49+02:00</created-at>
|
8
|
+
<updated-at type="datetime">2011-10-10T10:40:35+02:00</updated-at>
|
9
|
+
<valid-to type="date">9999-01-01</valid-to>
|
10
|
+
<product-category-id type="integer">1</product-category-id>
|
11
|
+
<id type="integer">1</id>
|
12
|
+
<valid-from type="date">2011-01-01</valid-from>
|
13
|
+
<unit>piece</unit>
|
14
|
+
<description>Nice bedpan</description>
|
15
|
+
<status>pending</status>
|
16
|
+
<rounding type="integer">0</rounding>
|
17
|
+
<photo>http://example.com/1.png</photo>
|
18
|
+
</product>
|
19
|
+
</products>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<external-message>
|
2
|
+
<created-at type="datetime">2011-09-09T15:14:13+02:00</created-at>
|
3
|
+
<body>Expecting this to work somehow ...</body>
|
4
|
+
<updated-at type="datetime">2011-09-09T15:14:13+02:00</updated-at>
|
5
|
+
<in-reply-to-id type="integer" nil="true"></in-reply-to-id>
|
6
|
+
<subject-id type="integer">5</subject-id>
|
7
|
+
<id type="integer">1</id>
|
8
|
+
<in-reply-to-type nil="true"></in-reply-to-type>
|
9
|
+
<care-provider-id type="integer">1</care-provider-id>
|
10
|
+
<person-id type="integer">2</person-id>
|
11
|
+
<person-first-name>Matthijs Langenberg</person-first-name>
|
12
|
+
<person-last-name></person-last-name>
|
13
|
+
<person-photo>http://example.com/1.png</person-photo>
|
14
|
+
</external-message>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "ProductCategory", "converting to xml" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@product_category_a = Caren::ProductCategory.new( :name => "Services" )
|
7
|
+
@product_category_b = Caren::ProductCategory.new( :name => "Products" )
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be able to convert a product to valid xml" do
|
11
|
+
@product_category_a.should convert_to_valid_caren_xml
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should be able to convert an array of products to valid xml" do
|
15
|
+
[@product_category_a,@product_category_b].should convert_to_valid_caren_array_xml
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "ProductCategory", "REST methods" do
|
21
|
+
|
22
|
+
before do
|
23
|
+
product_categories = File.read("spec/fixtures/caren_product_categories.xml")
|
24
|
+
product_categories_search = File.read("spec/fixtures/caren_product_categories_search.xml")
|
25
|
+
|
26
|
+
product_categories_url = Caren::Api.session.url_for( Caren::ProductCategory.resource_url )
|
27
|
+
search_url = Caren::Api.session.url_for( "#{Caren::ProductCategory.resource_url}?key=name&value=products" )
|
28
|
+
|
29
|
+
timestamp = DateTime.now.to_i
|
30
|
+
|
31
|
+
FakeWeb.register_uri(:get, product_categories_url, :body => product_categories, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp,product_categories) )
|
32
|
+
FakeWeb.register_uri(:get, search_url, :body => product_categories_search, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp,product_categories_search) )
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be able to search for a specific product category" do
|
36
|
+
product_categories = Caren::ProductCategory.search :name, "products", Caren::Api.session
|
37
|
+
product_categories.should have(1).things
|
38
|
+
product_categories.first.name.should == "products"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should be able to find all product category" do
|
42
|
+
product_categories = Caren::ProductCategory.all Caren::Api.session
|
43
|
+
product_categories.should have(2).things
|
44
|
+
product_categories.first.name.should == "Products"
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Product", "converting to xml" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@product_a = Caren::Product.new( :name => "Washing", :price => 100.euros, :in_store => true )
|
7
|
+
@product_b = Caren::Product.new( :name => "Bedpan", :price => 100.euros, :in_store => false )
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be able to convert a product to valid xml" do
|
11
|
+
@product_a.should convert_to_valid_caren_xml
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should be able to convert an array of products to valid xml" do
|
15
|
+
[@product_a,@product_b].should convert_to_valid_caren_array_xml
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "Product", "REST methods" do
|
21
|
+
|
22
|
+
before do
|
23
|
+
products = File.read("spec/fixtures/caren_products.xml")
|
24
|
+
product_search = File.read("spec/fixtures/caren_products_search.xml")
|
25
|
+
|
26
|
+
product_url = Caren::Api.session.url_for( Caren::Product.resource_url(1) )
|
27
|
+
products_url = Caren::Api.session.url_for( Caren::Product.resource_url )
|
28
|
+
search_url = Caren::Api.session.url_for( "#{Caren::Product.resource_url}?key=name&value=bedpan" )
|
29
|
+
|
30
|
+
timestamp = DateTime.now.to_i
|
31
|
+
|
32
|
+
FakeWeb.register_uri(:post, products_url, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp) )
|
33
|
+
FakeWeb.register_uri(:put, product_url, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp) )
|
34
|
+
FakeWeb.register_uri(:get, products_url, :body => products, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp,products) )
|
35
|
+
FakeWeb.register_uri(:get, search_url, :body => product_search, :timestamp => timestamp, :signature => Caren::Api.session.sign(timestamp,product_search) )
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be able to update a product" do
|
39
|
+
lambda{ Caren::Product.new( :id => 1, :name => "Bedpan" ).update( Caren::Api.session ) }.should_not raise_error
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should be able to update the photo for a product" do
|
43
|
+
lambda{ Caren::Product.new( :id => 1 ).update_photo( "spec/fixtures/bacon.jpg", Caren::Api.session ) }.should_not raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should be able to search for a specific product" do
|
47
|
+
products = Caren::Product.search :name, "bedpan", Caren::Api.session
|
48
|
+
products.should have(1).things
|
49
|
+
products.first.name.should == "bedpan"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should be able to find all products" do
|
53
|
+
products = Caren::Product.all Caren::Api.session
|
54
|
+
products.should have(2).things
|
55
|
+
products.first.name.should == "Dishwashing"
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,6 +4,14 @@ require 'rspec'
|
|
4
4
|
require 'fakeweb'
|
5
5
|
require 'capybara'
|
6
6
|
|
7
|
+
class Integer
|
8
|
+
|
9
|
+
def euros
|
10
|
+
self*100
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
7
15
|
# For the tests we need to know both the public and private key, so we share them here.
|
8
16
|
# We also use a smaller key here, to make the tests faster.
|
9
17
|
new_private_key = Caren::Api.generate_private_key( 512 )
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 4
|
8
|
-
-
|
8
|
+
- 4
|
9
9
|
segments_generated: true
|
10
|
-
version: 0.4.
|
10
|
+
version: 0.4.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andre Foeken
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-10-
|
18
|
+
date: 2011-10-26 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -62,12 +62,14 @@ dependencies:
|
|
62
62
|
name: rest-client
|
63
63
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - "
|
65
|
+
- - "="
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
segments:
|
68
|
-
-
|
68
|
+
- 1
|
69
|
+
- 6
|
70
|
+
- 7
|
69
71
|
segments_generated: true
|
70
|
-
version:
|
72
|
+
version: 1.6.7
|
71
73
|
requirement: *id004
|
72
74
|
prerelease: false
|
73
75
|
- !ruby/object:Gem::Dependency
|
@@ -179,6 +181,8 @@ files:
|
|
179
181
|
- lib/caren/external_message.rb
|
180
182
|
- lib/caren/link.rb
|
181
183
|
- lib/caren/person.rb
|
184
|
+
- lib/caren/product.rb
|
185
|
+
- lib/caren/product_category.rb
|
182
186
|
- spec/.DS_Store
|
183
187
|
- spec/care_provider_spec.rb
|
184
188
|
- spec/caren_spec.rb
|
@@ -188,12 +192,20 @@ files:
|
|
188
192
|
- spec/fixtures/caren_care_provider_validation.xml
|
189
193
|
- spec/fixtures/caren_care_providers.xml
|
190
194
|
- spec/fixtures/caren_care_providers_search.xml
|
195
|
+
- spec/fixtures/caren_external_messages.xml
|
191
196
|
- spec/fixtures/caren_links.xml
|
192
197
|
- spec/fixtures/caren_links_search.xml
|
198
|
+
- spec/fixtures/caren_product_categories.xml
|
199
|
+
- spec/fixtures/caren_product_categories_search.xml
|
200
|
+
- spec/fixtures/caren_products.xml
|
201
|
+
- spec/fixtures/caren_products_search.xml
|
193
202
|
- spec/fixtures/caren_unauthorized.xml
|
194
203
|
- spec/fixtures/incoming.xml
|
204
|
+
- spec/fixtures/incoming_single_object.xml
|
195
205
|
- spec/link_spec.rb
|
196
206
|
- spec/person_spec.rb
|
207
|
+
- spec/product_category_spec.rb
|
208
|
+
- spec/product_spec.rb
|
197
209
|
- spec/spec.opts
|
198
210
|
- spec/spec_helper.rb
|
199
211
|
has_rdoc: true
|