infopark_reactor_migrations 1.9.0.beta2 → 1.9.1
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.
- checksums.yaml +4 -4
- data/lib/reactor/cm/log_entry.rb +3 -1
- data/lib/reactor/cm/multi_xml_request.rb +102 -0
- data/lib/reactor/cm/obj.rb +146 -37
- data/lib/reactor/cm/xml_multi_request_error.rb +10 -0
- data/lib/reactor/cm/xml_request.rb +2 -2
- data/lib/reactor/cm/xml_request_error.rb +1 -7
- data/lib/reactor/cm/xml_single_request_error.rb +21 -0
- data/lib/reactor/migrations/version.rb +1 -1
- data/lib/reactor/tools/sower.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a79422bdeff7f67cd50cfa57de204d9c0a88ce52
|
4
|
+
data.tar.gz: 920130097cd74911b52b2d52d48b6b080c3a73d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ce8837352a635b9621460169c71d1be0c3c1d1f536d383f89cfdb4b7f669b78e2f5c5f22281b272fe4601fb6e5b5b68ed9422a99b59d4bc6106344a0fcf4d8c
|
7
|
+
data.tar.gz: c8b0dc9d2627c00afe41ce0f289e730789a5f318113dc0d6e362b096efb284ffec7d212ab6db7b99bb608e5b32b13d1f979424d3405fea4f49e256282ba146d5
|
data/lib/reactor/cm/log_entry.rb
CHANGED
@@ -17,7 +17,9 @@ module Reactor
|
|
17
17
|
response = request.execute!
|
18
18
|
|
19
19
|
result = []
|
20
|
-
response.xpath('//logEntry')
|
20
|
+
log_entries = response.xpath('//logEntry')
|
21
|
+
log_entries = [log_entries] unless log_entries.kind_of?(Array)
|
22
|
+
log_entries.each do |log_entry_node|
|
21
23
|
dict = {}
|
22
24
|
log_entry_node.each_element do |value_node|
|
23
25
|
if value_node.name == 'logTime'
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'net/http'
|
3
|
+
require 'reactor/cm/xml_response'
|
4
|
+
require 'reactor/cm/xml_multi_request_error'
|
5
|
+
require 'reactor/cm/xml_markup'
|
6
|
+
require 'nokogiri'
|
7
|
+
|
8
|
+
module Reactor
|
9
|
+
module Cm
|
10
|
+
|
11
|
+
class MultiXmlRequest
|
12
|
+
|
13
|
+
def self.token(login, instance_secret)
|
14
|
+
Digest::MD5.hexdigest(login + instance_secret)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.execute
|
18
|
+
access = Configuration::xml_access
|
19
|
+
sanity_check(access)
|
20
|
+
xml = XmlMarkup.new
|
21
|
+
xml2 = nil
|
22
|
+
ret = nil
|
23
|
+
xml.instruct!
|
24
|
+
req = nil
|
25
|
+
ret = xml.tag!('cm-payload', 'payload-id' =>'abcabc', 'timestamp' => Time.now.getutc.strftime('%Y%m%d%H%M%S'), 'version' => '6.7.3') do
|
26
|
+
xml.tag!('cm-header') do
|
27
|
+
xml.tag!('cm-sender', 'sender-id' => access[:id], 'name' => "ruby-simple-client")
|
28
|
+
xml.tag!('cm-authentication', 'login' => access[:username], 'token' => token(access[:username],access[:secret]))
|
29
|
+
end
|
30
|
+
req = self.new(xml).tap do |instance|
|
31
|
+
yield instance
|
32
|
+
end
|
33
|
+
end
|
34
|
+
req.execute!(ret)
|
35
|
+
end
|
36
|
+
|
37
|
+
def mandatory(&block)
|
38
|
+
req_id = self.class.generate_id
|
39
|
+
@mandatory << req_id
|
40
|
+
@builder.tag!('cm-request', 'request-id' => req_id, 'preclusive' => 'true') do |xml2|
|
41
|
+
yield xml2
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def optional(&block)
|
46
|
+
req_id = self.class.generate_id
|
47
|
+
@optional << req_id
|
48
|
+
@builder.tag!('cm-request', 'request-id' => req_id, 'preclusive' => 'false') do |xml2|
|
49
|
+
yield xml2
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def execute!(xml)
|
54
|
+
access = Configuration::xml_access
|
55
|
+
payload = xml
|
56
|
+
|
57
|
+
res = Net::HTTP.new(access[:host], access[:port]).start do |http|
|
58
|
+
req = Net::HTTP::Post.new('/xml')
|
59
|
+
req.body = payload
|
60
|
+
http.request(req)
|
61
|
+
end
|
62
|
+
|
63
|
+
result = MultiXmlResponse.new(res.body, @mandatory, @optional)
|
64
|
+
end
|
65
|
+
|
66
|
+
class << self
|
67
|
+
|
68
|
+
def generate_id
|
69
|
+
rand(10000)
|
70
|
+
end
|
71
|
+
|
72
|
+
protected
|
73
|
+
|
74
|
+
def sanity_check(access)
|
75
|
+
raise Reactor::Cm::MissingCredentials if access[:username].nil? || access[:username].empty?
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
protected
|
80
|
+
|
81
|
+
def initialize(builder)
|
82
|
+
@builder = builder
|
83
|
+
@mandatory = []
|
84
|
+
@optional = []
|
85
|
+
end
|
86
|
+
|
87
|
+
class MultiXmlResponse
|
88
|
+
def initialize(xml, mandatory, optional)
|
89
|
+
@xml, @mandatory, @optional = xml, mandatory, optional
|
90
|
+
@n = Nokogiri::XML.parse(@xml)
|
91
|
+
end
|
92
|
+
|
93
|
+
def assert_success
|
94
|
+
first_failed = nil
|
95
|
+
@mandatory.any? do |mandatory_id|
|
96
|
+
@n.xpath("//cm-response[@request-id='#{mandatory_id}']//cm-code[@numeric='200']").empty? && (first_failed = mandatory_id)
|
97
|
+
end && raise(XmlMultiRequestError, @n.xpath("//cm-response[@request-id='#{first_failed}']//cm-code//error/phrase/text()").map(&:to_s).join("\n"))
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/lib/reactor/cm/obj.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
+
require 'reactor/cm/multi_xml_request'
|
3
|
+
|
2
4
|
module Reactor
|
3
5
|
module Cm
|
4
6
|
class Obj
|
@@ -140,49 +142,55 @@ module Reactor
|
|
140
142
|
end
|
141
143
|
end
|
142
144
|
|
143
|
-
def
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
xml.tag!(key.to_s) do
|
152
|
-
xml.cdata!(value)
|
153
|
-
end
|
154
|
-
else
|
155
|
-
xml.value_tag!(key.to_s, value)
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
response = @request.execute!
|
161
|
-
return response if !response.ok?
|
162
|
-
|
163
|
-
unless @obj_attrs.empty?
|
164
|
-
request = XmlRequest.prepare do |xml|
|
165
|
-
xml.where_key_tag!(base_name, 'id', @obj_id)
|
166
|
-
xml.set_tag!(base_name) do
|
167
|
-
@obj_attrs.each do |key, value|
|
168
|
-
xml.value_tag!(key, value)
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
response = request.execute!
|
173
|
-
end
|
145
|
+
def set_mutiple(attrs)
|
146
|
+
attrs.each {|a,(v,o)| set(a,v,o||{}) }
|
147
|
+
end
|
148
|
+
|
149
|
+
def composite_save(attrs, links_to_add, links_to_remove, links_to_set, links_modified=false)
|
150
|
+
set_mutiple(attrs)
|
151
|
+
|
152
|
+
skip_version_creation = @attrs.empty? && links_to_remove.empty? && links_to_set.empty? && !links_modified
|
174
153
|
|
175
|
-
|
154
|
+
resp = MultiXmlRequest.execute do |reqs|
|
155
|
+
reqs.optional {|xml| SimpleCommandRequest.build(xml, @obj_id, 'take') } unless skip_version_creation
|
156
|
+
reqs.optional {|xml| SimpleCommandRequest.build(xml, @obj_id, 'edit') } unless skip_version_creation
|
176
157
|
|
177
|
-
|
178
|
-
|
158
|
+
|
159
|
+
reqs.mandatory {|xml| ObjSetRequest.build(xml, @obj_id, @obj_attrs) } unless @obj_attrs.empty? #important! requires different permissions
|
160
|
+
reqs.mandatory {|xml| ContentSetRequest.build(xml, @obj_id, @attrs, @attr_options) } unless skip_version_creation
|
179
161
|
end
|
180
162
|
|
181
|
-
|
182
|
-
|
183
|
-
|
163
|
+
resp.assert_success
|
164
|
+
|
165
|
+
yield(attrs, links_to_add, links_to_remove, links_to_set) if block_given?
|
166
|
+
|
167
|
+
resp = MultiXmlRequest.execute do |reqs|
|
168
|
+
links_to_remove.each do |link_id|
|
169
|
+
reqs.mandatory {|xml| LinkDeleteRequest.build(xml, link_id) }
|
170
|
+
end
|
171
|
+
links_to_add.each do |(attr, link)|
|
172
|
+
|
173
|
+
reqs.mandatory {|xml| LinkAddRequest.build(xml, @obj_id, attr, link) }
|
174
|
+
end
|
175
|
+
|
176
|
+
links_to_set.each do |(link_id, link)|
|
177
|
+
reqs.mandatory {|xml| LinkSetRequest.build(xml, link_id, link) }
|
184
178
|
end
|
179
|
+
|
180
|
+
reqs.optional {|xml| ResolveRefsRequest.build(xml, @obj_id) }
|
181
|
+
end unless skip_version_creation
|
182
|
+
|
183
|
+
resp.assert_success
|
184
|
+
end
|
185
|
+
|
186
|
+
def save!
|
187
|
+
links_to_remove = @removed_links.map {|l| l.link_id}
|
188
|
+
links_to_add = @links.map do |attr, links|
|
189
|
+
links.map do |link|
|
190
|
+
[attr, {:destination_url => link.dest_url, :title => link.title, :target => link.target, :position => link.position}]
|
191
|
+
end.flatten
|
185
192
|
end
|
193
|
+
composite_save([], links_to_add, links_to_remove, [])
|
186
194
|
end
|
187
195
|
|
188
196
|
|
@@ -426,6 +434,107 @@ module Reactor
|
|
426
434
|
|
427
435
|
request.execute!
|
428
436
|
end
|
437
|
+
|
438
|
+
class Request
|
439
|
+
attr_reader :xml
|
440
|
+
|
441
|
+
def initialize(xml)
|
442
|
+
@xml = xml
|
443
|
+
end
|
444
|
+
|
445
|
+
def self.build(xml, *args)
|
446
|
+
self.new(xml).build(*args)
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
class SimpleCommandRequest < Request
|
451
|
+
def build(obj_id, cmd_name, comment = nil)
|
452
|
+
xml.where_key_tag!('obj', 'id', obj_id)
|
453
|
+
if comment
|
454
|
+
xml.tag!("obj-#{cmd_name}") do
|
455
|
+
xml.tag!('comment', comment)
|
456
|
+
end
|
457
|
+
else
|
458
|
+
xml.tag!("obj-#{cmd_name}")
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
class ObjSetRequest < Request
|
464
|
+
def build(obj_id, obj_attrs)
|
465
|
+
xml.where_key_tag!('obj', 'id', obj_id)
|
466
|
+
xml.set_tag!('obj') do
|
467
|
+
obj_attrs.each do |key, value|
|
468
|
+
xml.value_tag!(key, value)
|
469
|
+
end
|
470
|
+
end
|
471
|
+
end
|
472
|
+
end
|
473
|
+
|
474
|
+
class ContentSetRequest < Request
|
475
|
+
def build(id, attrs, attr_options)
|
476
|
+
xml.tag!('content-where') do
|
477
|
+
xml.tag!('objectId', id.to_s)
|
478
|
+
xml.tag!('state', 'edited')
|
479
|
+
end
|
480
|
+
xml.tag!("content-set") do
|
481
|
+
attrs.each do |key, value|
|
482
|
+
if (attr_options[key] || {})[:cdata]
|
483
|
+
xml.tag!(key.to_s) do
|
484
|
+
xml.cdata!(value)
|
485
|
+
end
|
486
|
+
else
|
487
|
+
xml.value_tag!(key.to_s, value)
|
488
|
+
end
|
489
|
+
end
|
490
|
+
end
|
491
|
+
end
|
492
|
+
end
|
493
|
+
|
494
|
+
class LinkDeleteRequest < Request
|
495
|
+
def build(link_id)
|
496
|
+
xml.where_key_tag!('link', 'id', link_id)
|
497
|
+
xml.tag!("link-delete")
|
498
|
+
end
|
499
|
+
end
|
500
|
+
|
501
|
+
class LinkAddRequest < Request
|
502
|
+
def build(obj_id, attr, link_data)
|
503
|
+
title = link_data[:title]
|
504
|
+
xml.tag!('content-where') do
|
505
|
+
xml.tag!('objectId', obj_id.to_s)
|
506
|
+
xml.tag!('state', 'edited')
|
507
|
+
end
|
508
|
+
xml.tag!('content-addLinkTo') do
|
509
|
+
xml.tag!('attribute', attr.to_s)
|
510
|
+
xml.tag!('destinationUrl', link_data[:destination_url].to_s)
|
511
|
+
xml.tag!('title', title.to_s) if title
|
512
|
+
end
|
513
|
+
end
|
514
|
+
end
|
515
|
+
|
516
|
+
class LinkSetRequest < Request
|
517
|
+
def build(link_id, link_data)
|
518
|
+
title = link_data[:title]
|
519
|
+
xml.tag!('link-where') do
|
520
|
+
xml.tag!('id', link_id)
|
521
|
+
end
|
522
|
+
xml.tag!('link-set') do
|
523
|
+
xml.tag!('destinationUrl', link_data[:destination_url].to_s)
|
524
|
+
xml.tag!('title', title.to_s) if title
|
525
|
+
end
|
526
|
+
end
|
527
|
+
end
|
528
|
+
|
529
|
+
class ResolveRefsRequest < Request
|
530
|
+
def build(obj_id)
|
531
|
+
xml.tag!('content-where') do
|
532
|
+
xml.tag!('objectId', obj_id.to_s)
|
533
|
+
xml.tag!('state', 'edited')
|
534
|
+
end
|
535
|
+
xml.tag!('content-resolveRefs')
|
536
|
+
end
|
537
|
+
end
|
429
538
|
end
|
430
539
|
end
|
431
540
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require 'net/http'
|
3
3
|
require 'reactor/cm/xml_response'
|
4
|
-
require 'reactor/cm/
|
4
|
+
require 'reactor/cm/xml_single_request_error'
|
5
5
|
require 'reactor/cm/xml_markup'
|
6
6
|
require 'reactor/tools/smart_xml_logger'
|
7
7
|
|
@@ -56,7 +56,7 @@ module Reactor
|
|
56
56
|
Reactor::Cm::LOGGER.log('RESPONSE:')
|
57
57
|
Reactor::Cm::LOGGER.log_xml(:response, res.body)
|
58
58
|
response = XmlResponse.new(res.body)
|
59
|
-
raise
|
59
|
+
raise XmlSingleRequestError, response unless response.ok?
|
60
60
|
response
|
61
61
|
end
|
62
62
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'reactor/cm/xml_request_error'
|
3
|
+
|
4
|
+
module Reactor
|
5
|
+
module Cm
|
6
|
+
class XmlSingleRequestError < XmlRequestError
|
7
|
+
def initialize(response)
|
8
|
+
@response = response
|
9
|
+
super(phrase)
|
10
|
+
end
|
11
|
+
|
12
|
+
def phrase
|
13
|
+
result = @response.xpath('//phrase')
|
14
|
+
result = [result] unless result.kind_of?(Array)
|
15
|
+
|
16
|
+
result.map(&:to_s).join("\n")
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/reactor/tools/sower.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: infopark_reactor_migrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.9.
|
4
|
+
version: 1.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomasz Przedmojski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -100,6 +100,7 @@ files:
|
|
100
100
|
- lib/reactor/cm/live_group.rb
|
101
101
|
- lib/reactor/cm/log_entry.rb
|
102
102
|
- lib/reactor/cm/missing_credentials.rb
|
103
|
+
- lib/reactor/cm/multi_xml_request.rb
|
103
104
|
- lib/reactor/cm/obj.rb
|
104
105
|
- lib/reactor/cm/obj_class.rb
|
105
106
|
- lib/reactor/cm/object_base.rb
|
@@ -107,9 +108,11 @@ files:
|
|
107
108
|
- lib/reactor/cm/workflow.rb
|
108
109
|
- lib/reactor/cm/xml_attribute.rb
|
109
110
|
- lib/reactor/cm/xml_markup.rb
|
111
|
+
- lib/reactor/cm/xml_multi_request_error.rb
|
110
112
|
- lib/reactor/cm/xml_request.rb
|
111
113
|
- lib/reactor/cm/xml_request_error.rb
|
112
114
|
- lib/reactor/cm/xml_response.rb
|
115
|
+
- lib/reactor/cm/xml_single_request_error.rb
|
113
116
|
- lib/reactor/configuration.rb
|
114
117
|
- lib/reactor/migration.rb
|
115
118
|
- lib/reactor/migrations/railtie.rb
|
@@ -161,9 +164,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
161
164
|
version: '0'
|
162
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
166
|
requirements:
|
164
|
-
- - '
|
167
|
+
- - '>='
|
165
168
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
169
|
+
version: '0'
|
167
170
|
requirements: []
|
168
171
|
rubyforge_project:
|
169
172
|
rubygems_version: 2.0.14
|