cpi-event-connector 0.3.0 → 0.4.0
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/Gemfile +1 -1
- data/Gemfile.lock +9 -11
- data/README.md +66 -0
- data/cpi-event-connector.gemspec +1 -2
- data/lib/cpi/event.rb +35 -14
- data/lib/cpi/event_connector.rb +20 -5
- data/lib/cpi/version.rb +1 -1
- data/spec/event_connector_spec.rb +39 -3
- data/spec/event_spec.rb +26 -6
- data/spec/generator_spec.rb +0 -1
- metadata +5 -20
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,25 +1,24 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cpi-event-connector (0.
|
5
|
-
activesupport (~> 3)
|
4
|
+
cpi-event-connector (0.3.0)
|
5
|
+
activesupport (~> 3.0)
|
6
6
|
bunny (~> 0.8.0)
|
7
7
|
nokogiri (~> 1.5)
|
8
8
|
uuidtools (~> 2.1.2)
|
9
9
|
|
10
10
|
GEM
|
11
|
-
remote:
|
11
|
+
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
activesupport (3.2.
|
14
|
-
i18n (
|
13
|
+
activesupport (3.2.13)
|
14
|
+
i18n (= 0.6.1)
|
15
15
|
multi_json (~> 1.0)
|
16
|
-
backports (2.5.1)
|
17
16
|
bunny (0.8.0)
|
18
17
|
diff-lcs (1.1.3)
|
19
|
-
i18n (0.6.
|
18
|
+
i18n (0.6.1)
|
20
19
|
justinf-unification_assertion (0.0.2)
|
21
|
-
multi_json (1.
|
22
|
-
nokogiri (1.5.
|
20
|
+
multi_json (1.7.6)
|
21
|
+
nokogiri (1.5.9)
|
23
22
|
rspec (2.8.0)
|
24
23
|
rspec-core (~> 2.8.0)
|
25
24
|
rspec-expectations (~> 2.8.0)
|
@@ -28,13 +27,12 @@ GEM
|
|
28
27
|
rspec-expectations (2.8.0)
|
29
28
|
diff-lcs (~> 1.1.2)
|
30
29
|
rspec-mocks (2.8.0)
|
31
|
-
uuidtools (2.1.
|
30
|
+
uuidtools (2.1.4)
|
32
31
|
|
33
32
|
PLATFORMS
|
34
33
|
ruby
|
35
34
|
|
36
35
|
DEPENDENCIES
|
37
|
-
backports
|
38
36
|
cpi-event-connector!
|
39
37
|
justinf-unification_assertion
|
40
38
|
rspec
|
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
Cpi Event Connector
|
2
|
+
===================
|
3
|
+
|
4
|
+
A library that allows applications to easily send events to CPI.
|
5
|
+
|
6
|
+
Usage
|
7
|
+
-----
|
8
|
+
|
9
|
+
Configure the Event Connector like so:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
require 'cpi_event_connector'
|
13
|
+
require 'yaml'
|
14
|
+
|
15
|
+
config_file = File.join(Rails.root, "config", "cpi_event_connector.yml")
|
16
|
+
params = {:enabled => false}
|
17
|
+
if File.exists?(config_file)
|
18
|
+
params.merge! YAML::load_file(config_file).symbolize_keys!
|
19
|
+
end
|
20
|
+
Cpi::EventConnector.configure(params)
|
21
|
+
```
|
22
|
+
|
23
|
+
With a YAML file that looks like this:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# RabbitMQ connection settings
|
27
|
+
# When connecting to an unsecured localhost, you actually don't need any of these
|
28
|
+
host: localhost
|
29
|
+
port: 5672
|
30
|
+
user: guest
|
31
|
+
password: guest
|
32
|
+
|
33
|
+
# Cpi Event Connector settings
|
34
|
+
enabled: false
|
35
|
+
queue: 'net.nulogy.cpi.events.development'
|
36
|
+
```
|
37
|
+
|
38
|
+
And then send events like so:
|
39
|
+
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
event = Cpi::Event.new(
|
43
|
+
event_uid: 'unique_id',
|
44
|
+
event_type: 'type',
|
45
|
+
source_tenant_uid: 'tenant_uid',
|
46
|
+
content: 'some content')
|
47
|
+
Cpi::EventConnector.send_event(event, :queue => 'system_queue_name')
|
48
|
+
```
|
49
|
+
Note that the queue parameter is optional if it was specified in the YAML config.
|
50
|
+
|
51
|
+
Or with raw xml like so:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
xml = <<-XML
|
55
|
+
<cpi_event>
|
56
|
+
<header>
|
57
|
+
<event_uid>unique_id</event_uid>
|
58
|
+
<event_type>type</event_type>
|
59
|
+
<source_tenant_uid>tenant_uid</source_tenant_uid>
|
60
|
+
</header>
|
61
|
+
<content>some content</content>
|
62
|
+
</cpi_event>
|
63
|
+
XML
|
64
|
+
Cpi::EventConnector.send_event_xml(xml, :queue => 'system_queue_name')
|
65
|
+
```
|
66
|
+
|
data/cpi-event-connector.gemspec
CHANGED
@@ -18,11 +18,10 @@ Gem::Specification.new do |s|
|
|
18
18
|
|
19
19
|
# specify any dependencies here; for example:
|
20
20
|
s.add_development_dependency "rspec"
|
21
|
-
s.add_development_dependency "backports"
|
22
21
|
s.add_development_dependency "justinf-unification_assertion"
|
23
22
|
|
24
23
|
s.add_runtime_dependency "bunny", "~> 0.8.0"
|
25
|
-
s.add_runtime_dependency "activesupport", "~> 3"
|
24
|
+
s.add_runtime_dependency "activesupport", "~> 3.0"
|
26
25
|
s.add_runtime_dependency "uuidtools", "~> 2.1.2"
|
27
26
|
s.add_runtime_dependency "nokogiri", "~> 1.5"
|
28
27
|
end
|
data/lib/cpi/event.rb
CHANGED
@@ -2,21 +2,17 @@ require 'active_support/core_ext/string'
|
|
2
2
|
require 'nokogiri'
|
3
3
|
|
4
4
|
module Cpi
|
5
|
-
|
6
|
-
|
7
|
-
@xml_doc = parse_xml(xml)
|
8
|
-
end
|
9
|
-
|
10
|
-
def event_type
|
11
|
-
@xml_doc.xpath('//header/event_type').text
|
12
|
-
end
|
5
|
+
module EventParser
|
6
|
+
extend self
|
13
7
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
8
|
+
def parse(xml)
|
9
|
+
xml_doc = parse_xml(xml)
|
10
|
+
attrs = {
|
11
|
+
event_type: xml_doc.xpath('//header/event_type').text,
|
12
|
+
source_tenant_uid: xml_doc.xpath('//header/source_tenant_uid').text,
|
13
|
+
event_uid: nil_if_blank(xml_doc.xpath('//header/event_uid').text)
|
14
|
+
}
|
15
|
+
Event.new(attrs)
|
20
16
|
end
|
21
17
|
|
22
18
|
private
|
@@ -31,4 +27,29 @@ module Cpi
|
|
31
27
|
end
|
32
28
|
end
|
33
29
|
end
|
30
|
+
|
31
|
+
class Event
|
32
|
+
attr_accessor :event_type, :source_tenant_uid, :event_uid, :content
|
33
|
+
|
34
|
+
def initialize(attrs=nil)
|
35
|
+
@event_type = attrs[:event_type]
|
36
|
+
@source_tenant_uid = attrs[:source_tenant_uid]
|
37
|
+
@event_uid = attrs[:event_uid]
|
38
|
+
@content = attrs[:content]
|
39
|
+
end
|
40
|
+
|
41
|
+
def xml
|
42
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
43
|
+
xml.cpi_event {
|
44
|
+
xml.header {
|
45
|
+
xml.event_uid event_uid
|
46
|
+
xml.event_type event_type
|
47
|
+
xml.source_tenant_uid source_tenant_uid
|
48
|
+
}
|
49
|
+
xml.content content
|
50
|
+
}
|
51
|
+
end
|
52
|
+
builder.doc.root.to_xml
|
53
|
+
end
|
54
|
+
end
|
34
55
|
end
|
data/lib/cpi/event_connector.rb
CHANGED
@@ -19,6 +19,12 @@ module Cpi
|
|
19
19
|
self.connection_params = params
|
20
20
|
end
|
21
21
|
|
22
|
+
# DEPRECATED: Please use send_event instead
|
23
|
+
#
|
24
|
+
# This method does not add the correct routing header that CPI requires in the content
|
25
|
+
# of the event.
|
26
|
+
#
|
27
|
+
# This method will be made private eventually
|
22
28
|
def self.transmit(event_type, tenant_uid, content, options=nil)
|
23
29
|
options ||= {}
|
24
30
|
if !@enabled
|
@@ -33,6 +39,12 @@ module Cpi
|
|
33
39
|
@logger.debug "Transmission complete"
|
34
40
|
end
|
35
41
|
|
42
|
+
# Sends a Cpi::Event
|
43
|
+
def self.send_event(event, options=nil)
|
44
|
+
return send_event_xml(event, options) if event.is_a? String # for backwards compatibility with 0.3.0
|
45
|
+
transmit_event(event, event.xml, options)
|
46
|
+
end
|
47
|
+
|
36
48
|
# This method expects a routing header to be present in the xml document
|
37
49
|
#
|
38
50
|
# <cpi_event>
|
@@ -43,11 +55,9 @@ module Cpi
|
|
43
55
|
# </header>
|
44
56
|
# <content>some content</content>
|
45
57
|
# </cpi_event>
|
46
|
-
def self.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
transmit(d.event_type, d.source_tenant_uid, xml, {:queue => options.delete(:queue), :uid => d.event_uid})
|
58
|
+
def self.send_event_xml(xml, options=nil)
|
59
|
+
event = EventParser.parse(xml)
|
60
|
+
transmit_event(event, xml, options)
|
51
61
|
end
|
52
62
|
|
53
63
|
def self.test_connectivity
|
@@ -60,6 +70,11 @@ module Cpi
|
|
60
70
|
|
61
71
|
private
|
62
72
|
|
73
|
+
def self.transmit_event(event, xml, options)
|
74
|
+
options ||= {}
|
75
|
+
transmit(event.event_type, event.source_tenant_uid, xml, {:queue => options.delete(:queue), :uid => event.event_uid})
|
76
|
+
end
|
77
|
+
|
63
78
|
def self.connector
|
64
79
|
Thread.current[THREAD_LOCAL_VARIABLE] ||= Cpi::Connector.new(self.connection_params, @logger)
|
65
80
|
end
|
data/lib/cpi/version.rb
CHANGED
@@ -46,7 +46,7 @@ describe Cpi::EventConnector do
|
|
46
46
|
h.should unify({"event_type" => "shipment_shipped", "tenant" => "stuff", "content" => content, "uid" => :_x})
|
47
47
|
end
|
48
48
|
|
49
|
-
it "
|
49
|
+
it "send_event_xml does not require a uid or a queue in the routing envelope" do
|
50
50
|
xml = <<-XML
|
51
51
|
<cpi_event>
|
52
52
|
<header>
|
@@ -56,13 +56,49 @@ describe Cpi::EventConnector do
|
|
56
56
|
<content>some content</content>
|
57
57
|
</cpi_event>
|
58
58
|
XML
|
59
|
-
Cpi::EventConnector.
|
59
|
+
Cpi::EventConnector.send_event_xml(xml)
|
60
60
|
|
61
61
|
h = get_event_from_rabbimq("connector-test")
|
62
62
|
h.should unify({"event_type" => "type", "tenant" => "tenant_uid", "content" => xml, "uid" => :_x})
|
63
63
|
end
|
64
64
|
|
65
|
-
it "
|
65
|
+
it "send_event_xml generates and sends an event" do
|
66
|
+
xml = <<-XML
|
67
|
+
<cpi_event>
|
68
|
+
<header>
|
69
|
+
<event_uid>unique_id</event_uid>
|
70
|
+
<event_type>type</event_type>
|
71
|
+
<source_tenant_uid>tenant_uid</source_tenant_uid>
|
72
|
+
</header>
|
73
|
+
<content>some content</content>
|
74
|
+
</cpi_event>
|
75
|
+
XML
|
76
|
+
Cpi::EventConnector.send_event_xml(xml, :queue => 'system_queue_name')
|
77
|
+
|
78
|
+
h = get_event_from_rabbimq("system_queue_name")
|
79
|
+
h.should unify({"event_type" => "type", "tenant" => "tenant_uid", "content" => xml, "uid" => 'unique_id'})
|
80
|
+
end
|
81
|
+
|
82
|
+
it "send_event_xml generates and sends an event" do
|
83
|
+
event = Cpi::Event.new(event_uid: 'unique_id', event_type: 'type', source_tenant_uid: 'tenant_uid', content: 'some content')
|
84
|
+
Cpi::EventConnector.send_event(event, :queue => 'system_queue_name')
|
85
|
+
|
86
|
+
h = get_event_from_rabbimq("system_queue_name")
|
87
|
+
|
88
|
+
xml = <<-XML
|
89
|
+
<cpi_event>
|
90
|
+
<header>
|
91
|
+
<event_uid>unique_id</event_uid>
|
92
|
+
<event_type>type</event_type>
|
93
|
+
<source_tenant_uid>tenant_uid</source_tenant_uid>
|
94
|
+
</header>
|
95
|
+
<content>some content</content>
|
96
|
+
</cpi_event>
|
97
|
+
XML
|
98
|
+
h.should unify({"event_type" => "type", "tenant" => "tenant_uid", "content" => xml.strip, "uid" => 'unique_id'})
|
99
|
+
end
|
100
|
+
|
101
|
+
it "send_event works when given xml" do
|
66
102
|
xml = <<-XML
|
67
103
|
<cpi_event>
|
68
104
|
<header>
|
data/spec/event_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative '../lib/cpi/event'
|
2
2
|
|
3
|
-
describe Cpi::
|
3
|
+
describe Cpi::EventParser do
|
4
4
|
|
5
5
|
let(:xml) do
|
6
6
|
<<-XML
|
@@ -15,22 +15,42 @@ describe Cpi::Event do
|
|
15
15
|
XML
|
16
16
|
end
|
17
17
|
|
18
|
-
let(:
|
18
|
+
let(:event) { Cpi::EventParser.parse(xml) }
|
19
19
|
|
20
20
|
describe "source_tenant_uid" do
|
21
21
|
it "get extracted" do
|
22
|
-
|
22
|
+
event.source_tenant_uid.should == 'tenant_uid'
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
describe "uid" do
|
27
27
|
it "get extracted" do
|
28
|
-
|
28
|
+
event.event_uid.should == 'unique_id'
|
29
29
|
end
|
30
30
|
|
31
31
|
it "is nil when not present" do
|
32
|
-
|
33
|
-
|
32
|
+
event = Cpi::EventParser.parse('')
|
33
|
+
event.event_uid.should be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe Cpi::Event do
|
39
|
+
describe "xml" do
|
40
|
+
it "serializes to xml" do
|
41
|
+
event = Cpi::Event.new(event_type: 'type', source_tenant_uid: 'tenant_uid', event_uid: 'uid', content: 'some content')
|
42
|
+
|
43
|
+
xml = <<-XML
|
44
|
+
<cpi_event>
|
45
|
+
<header>
|
46
|
+
<event_uid>uid</event_uid>
|
47
|
+
<event_type>type</event_type>
|
48
|
+
<source_tenant_uid>tenant_uid</source_tenant_uid>
|
49
|
+
</header>
|
50
|
+
<content>some content</content>
|
51
|
+
</cpi_event>
|
52
|
+
XML
|
53
|
+
event.xml.should == xml.strip
|
34
54
|
end
|
35
55
|
end
|
36
56
|
end
|
data/spec/generator_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cpi-event-connector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-06-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -27,22 +27,6 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: backports
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
38
|
-
type: :development
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
46
30
|
- !ruby/object:Gem::Dependency
|
47
31
|
name: justinf-unification_assertion
|
48
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,7 +66,7 @@ dependencies:
|
|
82
66
|
requirements:
|
83
67
|
- - ~>
|
84
68
|
- !ruby/object:Gem::Version
|
85
|
-
version: '3'
|
69
|
+
version: '3.0'
|
86
70
|
type: :runtime
|
87
71
|
prerelease: false
|
88
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -90,7 +74,7 @@ dependencies:
|
|
90
74
|
requirements:
|
91
75
|
- - ~>
|
92
76
|
- !ruby/object:Gem::Version
|
93
|
-
version: '3'
|
77
|
+
version: '3.0'
|
94
78
|
- !ruby/object:Gem::Dependency
|
95
79
|
name: uuidtools
|
96
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -133,6 +117,7 @@ files:
|
|
133
117
|
- .gitignore
|
134
118
|
- Gemfile
|
135
119
|
- Gemfile.lock
|
120
|
+
- README.md
|
136
121
|
- Rakefile
|
137
122
|
- cpi-event-connector.gemspec
|
138
123
|
- lib/cpi/connector.rb
|