caren-api 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|