cpi-event-connector 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in cpi-event-connector.gemspec
4
4
  gemspec
data/Gemfile.lock CHANGED
@@ -1,25 +1,24 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cpi-event-connector (0.2.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: http://rubygems.org/
11
+ remote: https://rubygems.org/
12
12
  specs:
13
- activesupport (3.2.8)
14
- i18n (~> 0.6)
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.0)
18
+ i18n (0.6.1)
20
19
  justinf-unification_assertion (0.0.2)
21
- multi_json (1.3.6)
22
- nokogiri (1.5.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.3)
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
+
@@ -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
- class Event
6
- def initialize(xml)
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 source_tenant_uid
15
- @xml_doc.xpath('//header/source_tenant_uid').text
16
- end
17
-
18
- def event_uid
19
- nil_if_blank(@xml_doc.xpath('//header/event_uid').text)
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
@@ -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.send_event(xml, options=nil)
47
- options ||= {}
48
- d = Event.new(xml)
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
@@ -1,3 +1,3 @@
1
1
  module Cpi
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -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 "send_event does not require a uid or a queue in the routing envelope" do
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.send_event(xml)
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 "send_event generates and sends an event" do
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::Event do
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(:doc) { Cpi::Event.new(xml) }
18
+ let(:event) { Cpi::EventParser.parse(xml) }
19
19
 
20
20
  describe "source_tenant_uid" do
21
21
  it "get extracted" do
22
- doc.source_tenant_uid.should == 'tenant_uid'
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
- doc.event_uid.should == 'unique_id'
28
+ event.event_uid.should == 'unique_id'
29
29
  end
30
30
 
31
31
  it "is nil when not present" do
32
- doc = Cpi::Event.new('')
33
- doc.event_uid.should be_nil
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
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'backports'
3
2
  require_relative '../lib/cpi/generator'
4
3
  require 'active_support'
5
4
 
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.3.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: 2012-09-12 00:00:00.000000000 Z
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