opencrx 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rvmrc +60 -0
- data/lib/opencrx.rb +12 -131
- data/lib/opencrx/model.rb +12 -0
- data/lib/opencrx/model/account.rb +30 -0
- data/lib/opencrx/model/address.rb +47 -0
- data/lib/opencrx/model/map.rb +31 -0
- data/lib/opencrx/model/record.rb +29 -0
- data/lib/opencrx/model/record/attributes.rb +82 -0
- data/lib/opencrx/model/record/query.rb +55 -0
- data/lib/opencrx/model/result.rb +21 -0
- data/lib/opencrx/model/result_set.rb +40 -0
- data/lib/opencrx/session.rb +65 -0
- data/lib/opencrx/version.rb +1 -1
- data/opencrx.gemspec +4 -2
- data/spec/opencrx_spec.rb +130 -28
- data/spec/spec_helper.rb +9 -0
- data/spec/vcr/accounts.yml +92 -0
- data/spec/vcr/legal_entity/address_create.yml +258 -0
- data/spec/vcr/legal_entity/find.yml +141 -0
- data/spec/vcr/legal_entity/name.yml +132 -0
- data/spec/vcr/legal_entity/update.yml +349 -0
- data/spec/vcr/session.yml +45 -0
- data/spec/vcr/session/account.yml +59 -0
- data/spec/vcr/session/address.yml +45 -0
- metadata +78 -39
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c2784d3b61592f54c1152b468fff93a4642d06e7
|
4
|
+
data.tar.gz: 45d07b8b6bbc135cf3e6fe5ac30bba03ad756e30
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7489279b7e307aba8727fd2cc77e83ae8224571a9938b813abf53e1af7f14557c6e919552fb0a176d006d3ce9a418a44a45656c0f3d2adfd271e1ffb29cac419
|
7
|
+
data.tar.gz: d1ba221c1eddf2359743f7909b64dfa200851feacabda2f67bf6464e56dc2ce2b2b3d3d1446523413efa392f03f2cbef8fe510c7638aa1714f2d85b29b7957c4
|
data/.rvmrc
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
|
+
# Only full ruby name is supported here, for short names use:
|
8
|
+
# echo "rvm use 2.0.0" > .rvmrc
|
9
|
+
environment_id="ruby-2.0.0-p195@justiz"
|
10
|
+
|
11
|
+
# Uncomment the following lines if you want to verify rvm version per project
|
12
|
+
# rvmrc_rvm_version="1.20.13 (stable)" # 1.10.1 seams as a safe start
|
13
|
+
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
|
14
|
+
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
|
15
|
+
# return 1
|
16
|
+
# }
|
17
|
+
|
18
|
+
# First we attempt to load the desired environment directly from the environment
|
19
|
+
# file. This is very fast and efficient compared to running through the entire
|
20
|
+
# CLI and selector. If you want feedback on which environment was used then
|
21
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
22
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
|
23
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
24
|
+
then
|
25
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
26
|
+
for __hook in "${rvm_path:-$HOME/.rvm}/hooks/after_use"*
|
27
|
+
do
|
28
|
+
if [[ -f "${__hook}" && -x "${__hook}" && -s "${__hook}" ]]
|
29
|
+
then \. "${__hook}" || true
|
30
|
+
fi
|
31
|
+
done
|
32
|
+
unset __hook
|
33
|
+
if (( ${rvm_use_flag:=1} >= 2 )) # display only when forced
|
34
|
+
then
|
35
|
+
if [[ $- == *i* ]] # check for interactive shells
|
36
|
+
then printf "%b" "Using: \E[32m$GEM_HOME\E[0m" # show the user the ruby and gemset they are using in green
|
37
|
+
else printf "%b" "Using: $GEM_HOME" # don't use colors in non-interactive shells
|
38
|
+
fi
|
39
|
+
fi
|
40
|
+
else
|
41
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
42
|
+
rvm --create "$environment_id" || {
|
43
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
44
|
+
return 1
|
45
|
+
}
|
46
|
+
fi
|
47
|
+
|
48
|
+
# If you use bundler, this might be useful to you:
|
49
|
+
# if [[ -s Gemfile ]] && {
|
50
|
+
# ! builtin command -v bundle >/dev/null ||
|
51
|
+
# builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
|
52
|
+
# }
|
53
|
+
# then
|
54
|
+
# printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
|
55
|
+
# gem install bundler
|
56
|
+
# fi
|
57
|
+
# if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
|
58
|
+
# then
|
59
|
+
# bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
|
60
|
+
# fi
|
data/lib/opencrx.rb
CHANGED
@@ -1,141 +1,22 @@
|
|
1
|
-
require
|
2
|
-
require '
|
3
|
-
require '
|
1
|
+
require 'opencrx/version'
|
2
|
+
require 'opencrx/session'
|
3
|
+
require 'opencrx/model'
|
4
4
|
require 'active_support/core_ext'
|
5
5
|
|
6
6
|
module Opencrx
|
7
|
+
class << self
|
8
|
+
attr_accessor :logger, :session
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
def self.connect(base_url, user, password)
|
11
|
-
self.session = Opencrx::Session.new(base_url, user, password)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.session
|
15
|
-
@@session
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.session=(object)
|
19
|
-
@@session = object
|
20
|
-
end
|
21
|
-
|
22
|
-
class Session
|
23
|
-
include HTTParty
|
24
|
-
|
25
|
-
#debug_output
|
26
|
-
headers 'Accept' => 'text/xml', 'Content-Type' => 'text/xml'
|
27
|
-
format :xml
|
28
|
-
|
29
|
-
def initialize(base_url, user, password)
|
30
|
-
self.class.base_uri(base_url)
|
31
|
-
self.class.basic_auth(user, password)
|
32
|
-
end
|
33
|
-
|
34
|
-
def get(url, options = {})
|
35
|
-
self.class.get(url, options)
|
36
|
-
end
|
37
|
-
|
38
|
-
def put(url, options = {})
|
39
|
-
self.class.put(url, options)
|
40
|
-
end
|
41
|
-
|
42
|
-
def post(url, options = {})
|
43
|
-
self.class.post(url, options)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
module Account
|
48
|
-
SUFFIX = "/opencrx-rest-CRX/org.opencrx.kernel.account1/provider/CRX/segment/Standard/account"
|
49
|
-
KEY = Regexp.new('^org.opencrx.kernel.account1.(.*)$')
|
50
|
-
RESULTSET = 'org.openmdx.kernel.ResultSet'
|
51
|
-
|
52
|
-
def self.get(id)
|
53
|
-
response = session.get(SUFFIX + "/#{id}")
|
54
|
-
#ap Nokogiri.XML(response.body)
|
55
|
-
build_record(response)
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.query(params = {})
|
59
|
-
response = session.get(SUFFIX, query: params)
|
60
|
-
key = response.keys.first
|
61
|
-
if key == RESULTSET
|
62
|
-
parse_resultset(response[key])
|
63
|
-
else
|
64
|
-
failure(response)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def self.post(xml)
|
69
|
-
build_record session.post(SUFFIX, body: xml)
|
10
|
+
def connect(base_url, user, password)
|
11
|
+
self.session = Opencrx::Session.new(base_url, user, password)
|
70
12
|
end
|
71
13
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
Opencrx::session
|
78
|
-
end
|
79
|
-
|
80
|
-
def self.parse_resultset(hash)
|
81
|
-
hash.map do |key, value|
|
82
|
-
next if %w(href hasMore).include? key
|
83
|
-
build_record(key => value)
|
84
|
-
end.compact
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.build_record(hash)
|
88
|
-
puts "Expected a single key, got [#{hash.keys}]" unless hash.keys.length == 1
|
89
|
-
key = hash.keys.first
|
90
|
-
key.match(KEY)
|
91
|
-
klass_name = $1
|
92
|
-
if (klass = ActiveSupport::Inflector.safe_constantize("Opencrx::Account::#{klass_name}"))
|
93
|
-
klass.new(hash)
|
94
|
-
else
|
95
|
-
puts "Dont understand record type [#{klass_name}]"
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def self.failure(response)
|
100
|
-
ap response.request
|
101
|
-
ap response.response
|
102
|
-
ap response.parsed_response
|
103
|
-
nil
|
104
|
-
end
|
105
|
-
|
106
|
-
class AccountRecord < SimpleDelegator
|
107
|
-
BASEKEY = "org.opencrx.kernel.account1"
|
108
|
-
|
109
|
-
def initialize(attributes)
|
110
|
-
attributes = attributes[key] if attributes.has_key? key
|
111
|
-
super attributes
|
112
|
-
end
|
113
|
-
|
114
|
-
def key
|
115
|
-
"#{BASEKEY}.#{ActiveSupport::Inflector.demodulize self.class}"
|
116
|
-
end
|
117
|
-
|
118
|
-
def save
|
119
|
-
if has_key?('href')
|
120
|
-
Opencrx::Account.put(fetch('href'), xml)
|
121
|
-
else
|
122
|
-
Opencrx::Account.post(xml)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
def xml
|
127
|
-
__getobj__.except('owner', 'owningUser', 'owningGroup', 'href', 'version').to_xml(root: key)
|
14
|
+
def logger
|
15
|
+
@logger ||= begin
|
16
|
+
logger = Logger.new(STDERR)
|
17
|
+
logger.level = Logger::WARN
|
18
|
+
logger
|
128
19
|
end
|
129
20
|
end
|
130
|
-
|
131
|
-
class Contact < AccountRecord
|
132
|
-
end
|
133
|
-
class Group < AccountRecord
|
134
|
-
end
|
135
|
-
class UnspecifiedAccount < AccountRecord
|
136
|
-
end
|
137
|
-
class LegalEntity < AccountRecord
|
138
|
-
end
|
139
21
|
end
|
140
|
-
|
141
22
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'opencrx/model/map'
|
2
|
+
require 'opencrx/model/result'
|
3
|
+
require 'opencrx/model/result_set'
|
4
|
+
require 'opencrx/model/record'
|
5
|
+
require 'opencrx/model/account'
|
6
|
+
require 'opencrx/model/address'
|
7
|
+
|
8
|
+
module Opencrx
|
9
|
+
module Model
|
10
|
+
BASE_KEY = "org.opencrx.kernel.account1"
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Opencrx
|
2
|
+
module Model
|
3
|
+
class Account < Record
|
4
|
+
have_attributes :aliasName
|
5
|
+
|
6
|
+
def self.provider
|
7
|
+
"#{base_provider}/account"
|
8
|
+
end
|
9
|
+
|
10
|
+
# subrecords of ours include :address
|
11
|
+
def addresses
|
12
|
+
query(:address)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class FilteredAccount < Account
|
17
|
+
def self.default_query_options
|
18
|
+
query_type_option
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class LegalEntity < FilteredAccount
|
23
|
+
have_attributes :name
|
24
|
+
end
|
25
|
+
|
26
|
+
class Contact < FilteredAccount; end
|
27
|
+
class Group < FilteredAccount; end
|
28
|
+
class UnspecifiedAccount < FilteredAccount; end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Opencrx
|
2
|
+
module Model
|
3
|
+
class Address < Record
|
4
|
+
# usage is a code
|
5
|
+
USAGE = {
|
6
|
+
mobile: "200",
|
7
|
+
business: "500",
|
8
|
+
fax: "530",
|
9
|
+
visitor: "10500",
|
10
|
+
other: "1800",
|
11
|
+
delivery: "10200"
|
12
|
+
}
|
13
|
+
have_attributes :isMain, :disabled
|
14
|
+
have_array_attributes :usage
|
15
|
+
|
16
|
+
def self.provider
|
17
|
+
"#{base_provider}/address"
|
18
|
+
end
|
19
|
+
|
20
|
+
def assign_to(parent)
|
21
|
+
self.href = "#{parent.href}/address"
|
22
|
+
self.identity = nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class PostalAddress < Address
|
27
|
+
# postalCountry is a code
|
28
|
+
COUNTRY = {
|
29
|
+
de: "276"
|
30
|
+
}
|
31
|
+
have_attributes :postalCode, :postalCity, :postalState, :postalCountry
|
32
|
+
have_array_attributes :postalAddressLine, :postalStreet
|
33
|
+
end
|
34
|
+
|
35
|
+
class EMailAddress < Address
|
36
|
+
have_attributes :emailAddress
|
37
|
+
end
|
38
|
+
|
39
|
+
class PhoneNumber < Address
|
40
|
+
have_attributes :phoneNumberFull, :automaticParsing
|
41
|
+
end
|
42
|
+
|
43
|
+
class WebAddress < Address
|
44
|
+
have_attributes :webUrl
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
|
3
|
+
module Opencrx
|
4
|
+
module Model
|
5
|
+
module Map
|
6
|
+
class << self
|
7
|
+
def opencrx_key_to_model(key)
|
8
|
+
unless key.match(/^#{BASE_KEY}\.(.*)$/)
|
9
|
+
raise "Unexpected key #{key}"
|
10
|
+
end
|
11
|
+
target_class_name = $1
|
12
|
+
ActiveSupport::Inflector.safe_constantize("::Opencrx::Model::#{target_class_name}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def model_to_opencrx_key(klass)
|
16
|
+
"#{BASE_KEY}.#{demodulized_class_name(klass)}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def model_to_opencrx_query(klass)
|
20
|
+
model_to_opencrx_key(klass).gsub(/\./, ':')
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def demodulized_class_name(klass)
|
26
|
+
ActiveSupport::Inflector.demodulize klass
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'opencrx/model/record/attributes'
|
2
|
+
require 'opencrx/model/record/query'
|
3
|
+
|
4
|
+
module Opencrx
|
5
|
+
module Model
|
6
|
+
class Record
|
7
|
+
have_attributes :href, :identity
|
8
|
+
|
9
|
+
def save
|
10
|
+
href = attributes['href'] || self.class.query_url
|
11
|
+
response = if attributes['identity']
|
12
|
+
Opencrx::session.put(href, body: to_xml)
|
13
|
+
else
|
14
|
+
Opencrx::session.post(href, body: to_xml)
|
15
|
+
end
|
16
|
+
Result.parse(response)
|
17
|
+
end
|
18
|
+
|
19
|
+
# TODO implement delete
|
20
|
+
def destroy
|
21
|
+
href = attributes['href']
|
22
|
+
# this errors with No active unit of work
|
23
|
+
#Opencrx::session.delete(href, body: to_xml)
|
24
|
+
# this errors with Premature end of file.
|
25
|
+
#Opencrx::session.delete(href)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Opencrx
|
2
|
+
module Model
|
3
|
+
class Record
|
4
|
+
|
5
|
+
def self.have_attributes(*args)
|
6
|
+
args.each do |arg|
|
7
|
+
define_method(arg) do
|
8
|
+
attribute(arg)
|
9
|
+
end
|
10
|
+
define_method("#{arg}=") do |value|
|
11
|
+
write_attribute(arg, value)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.have_array_attributes(*args)
|
17
|
+
args.each do |arg|
|
18
|
+
define_method(arg) do
|
19
|
+
Array.wrap(attribute(arg))
|
20
|
+
end
|
21
|
+
define_method("#{arg}=") do |value|
|
22
|
+
write_attribute(arg, Array.wrap(value))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class ItemList < Array
|
28
|
+
def to_xml(options = nil)
|
29
|
+
super(options.merge(children: '_item'))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_accessor :attributes
|
34
|
+
|
35
|
+
def initialize(attributes = {})
|
36
|
+
self.attributes = attributes
|
37
|
+
end
|
38
|
+
|
39
|
+
def attributes=(hash)
|
40
|
+
@attributes = {}
|
41
|
+
hash.each do |key, value|
|
42
|
+
write_attribute(key, value)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# store only simple values, or simple arrays.
|
47
|
+
# arrays from opencrx are encoded as a hash values under key '_item'
|
48
|
+
def write_attribute(key, value)
|
49
|
+
key = key.to_s
|
50
|
+
case value
|
51
|
+
# incoming from opencrx
|
52
|
+
when Hash
|
53
|
+
items = Array.wrap(value['_item'])
|
54
|
+
if items.first.is_a?(String)
|
55
|
+
@attributes[key] = ItemList.new(items)
|
56
|
+
end
|
57
|
+
# incoming from our side
|
58
|
+
when Array
|
59
|
+
@attributes[key] = ItemList.new(value)
|
60
|
+
else
|
61
|
+
@attributes[key] = value
|
62
|
+
end
|
63
|
+
@attributes[key]
|
64
|
+
end
|
65
|
+
|
66
|
+
def attribute(key)
|
67
|
+
attributes[key.to_s]
|
68
|
+
end
|
69
|
+
|
70
|
+
def compact
|
71
|
+
attributes.inject({}) do |memo, (key, value)|
|
72
|
+
memo[key] = value if value.present? && value != '0'
|
73
|
+
memo
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_xml(options = {})
|
78
|
+
attributes.except('href', 'version').to_xml(options.merge(root: Map.model_to_opencrx_key(self.class)))
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|