connect_client 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,12 +1,12 @@
1
- module ConnectClient
2
- class Configuration
3
- attr_accessor :base_url, :api_key, :project_id, :async
4
-
5
- def initialize(api_key = '', project_id = '', async = false, base_url = 'https://api.getconnect.io')
6
- @base_url = base_url
7
- @api_key = api_key
8
- @project_id = project_id
9
- @async = async
10
- end
11
- end
1
+ module ConnectClient
2
+ class Configuration
3
+ attr_accessor :base_url, :api_key, :project_id, :async
4
+
5
+ def initialize(api_key = '', project_id = '', async = false, base_url = 'https://api.getconnect.io')
6
+ @base_url = base_url
7
+ @api_key = api_key
8
+ @project_id = project_id
9
+ @async = async
10
+ end
11
+ end
12
12
  end
@@ -1,52 +1,52 @@
1
- require 'securerandom'
2
- require 'json'
3
- require 'time'
4
-
5
- module ConnectClient
6
- class Event
7
-
8
- @@RESERVED_PROPERTY_REGEX = /tp_.+/i
9
-
10
- attr_reader :data
11
-
12
- def initialize(data)
13
- event_data_defaults = { id: SecureRandom.uuid, timestamp: Time.now.utc.iso8601 }
14
- @data = event_data_defaults.merge(data)
15
-
16
- if (@data[:timestamp].respond_to? :iso8601)
17
- @data[:timestamp] = @data[:timestamp].iso8601
18
- end
19
-
20
- validate
21
- end
22
-
23
- def validate
24
- invalid_properties = @data.keys.grep(@@RESERVED_PROPERTY_REGEX)
25
-
26
- raise EventDataValidationError.new(invalid_properties) if invalid_properties.any?
27
- end
28
-
29
- def to_json(options = nil)
30
- @data.to_json
31
- end
32
-
33
- def to_s
34
- "Event Data: #{@data}"
35
- end
36
- end
37
-
38
- class EventDataValidationError < StandardError
39
- attr_reader :invalid_property_names
40
-
41
- def initialize(invalid_property_names)
42
- @invalid_property_names = invalid_property_names
43
- end
44
-
45
- def message
46
- messages = ['The following properties use the reserved prefix tp_:'] + @invalid_property_names.map do |property_name|
47
- "->#{property_name}"
48
- end
49
- messages.join "\n"
50
- end
51
- end
1
+ require 'securerandom'
2
+ require 'json'
3
+ require 'time'
4
+
5
+ module ConnectClient
6
+ class Event
7
+
8
+ @@RESERVED_PROPERTY_REGEX = /tp_.+/i
9
+
10
+ attr_reader :data
11
+
12
+ def initialize(data)
13
+ event_data_defaults = { id: SecureRandom.uuid, timestamp: Time.now.utc.iso8601 }
14
+ @data = event_data_defaults.merge(data)
15
+
16
+ if (@data[:timestamp].respond_to? :iso8601)
17
+ @data[:timestamp] = @data[:timestamp].iso8601
18
+ end
19
+
20
+ validate
21
+ end
22
+
23
+ def validate
24
+ invalid_properties = @data.keys.grep(@@RESERVED_PROPERTY_REGEX)
25
+
26
+ raise EventDataValidationError.new(invalid_properties) if invalid_properties.any?
27
+ end
28
+
29
+ def to_json(options = nil)
30
+ @data.to_json
31
+ end
32
+
33
+ def to_s
34
+ "Event Data: #{@data}"
35
+ end
36
+ end
37
+
38
+ class EventDataValidationError < StandardError
39
+ attr_reader :invalid_property_names
40
+
41
+ def initialize(invalid_property_names)
42
+ @invalid_property_names = invalid_property_names
43
+ end
44
+
45
+ def message
46
+ messages = ['The following properties use the reserved prefix tp_:'] + @invalid_property_names.map do |property_name|
47
+ "->#{property_name}"
48
+ end
49
+ messages.join "\n"
50
+ end
51
+ end
52
52
  end
@@ -1,49 +1,49 @@
1
- require 'json'
2
-
3
- module ConnectClient
4
- class EventPushResponse
5
- attr_reader :data
6
- attr_reader :http_status_code
7
-
8
- def initialize(code, content_type, response_body, events_pushed)
9
- @http_status_code = code.to_s
10
-
11
- if content_type.include? 'application/json'
12
- body = response_body
13
- body = '{}' if response_body.to_s.empty?
14
- parse_body(body, events_pushed)
15
- else
16
- @data = response_body
17
- end
18
- end
19
-
20
- def success?
21
- @http_status_code.start_with? '2'
22
- end
23
-
24
- def to_s
25
- %{
26
- Status: #{@http_status_code}
27
- Successful: #{success?}
28
- Data: #{data}
29
- }
30
- end
31
-
32
- private
33
-
34
- def parse_body(body, events_pushed)
35
- @data = JSON.parse(body, :symbolize_names => true)
36
-
37
- if (events_pushed.is_a?(Hash) && @data.is_a?(Hash))
38
- @data.merge!(events_pushed) do |collection_name, responses, events|
39
- responses.zip(events).map do |response, event|
40
- response[:event] = event.data
41
- response
42
- end
43
- end
44
- else
45
- @data[:event] = events_pushed.data
46
- end
47
- end
48
- end
1
+ require 'json'
2
+
3
+ module ConnectClient
4
+ class EventPushResponse
5
+ attr_reader :data
6
+ attr_reader :http_status_code
7
+
8
+ def initialize(code, content_type, response_body, events_pushed)
9
+ @http_status_code = code.to_s
10
+
11
+ if content_type.include? 'application/json'
12
+ body = response_body
13
+ body = '{}' if response_body.to_s.empty?
14
+ parse_body(body, events_pushed)
15
+ else
16
+ @data = response_body
17
+ end
18
+ end
19
+
20
+ def success?
21
+ @http_status_code.start_with? '2'
22
+ end
23
+
24
+ def to_s
25
+ %{
26
+ Status: #{@http_status_code}
27
+ Successful: #{success?}
28
+ Data: #{data}
29
+ }
30
+ end
31
+
32
+ private
33
+
34
+ def parse_body(body, events_pushed)
35
+ @data = JSON.parse(body, :symbolize_names => true)
36
+
37
+ if (events_pushed.is_a?(Hash) && @data.is_a?(Hash))
38
+ @data.merge!(events_pushed) do |collection_name, responses, events|
39
+ responses.zip(events).map do |response, event|
40
+ response[:event] = event.data
41
+ response
42
+ end
43
+ end
44
+ else
45
+ @data[:event] = events_pushed.data
46
+ end
47
+ end
48
+ end
49
49
  end
@@ -1,139 +1,139 @@
1
- require 'json'
2
- require_relative '../event_push_response'
3
-
4
- module ConnectClient
5
- module Http
6
- class EventEndpoint
7
- def initialize(config)
8
- headers = {
9
- "Content-Type" => "application/json",
10
- "Accept" => "application/json",
11
- "Accept-Encoding" => "identity",
12
- "X-Api-Key" => config.api_key,
13
- "X-Project-Id" => config.project_id
14
- }
15
-
16
- if config.async
17
- @http = Async.new config.base_url, headers
18
- else
19
- @http = Sync.new config.base_url, headers
20
- end
21
-
22
- end
23
-
24
- def push(collection_name, event)
25
- path_uri_part = "/events/#{collection_name}"
26
-
27
- @http.send path_uri_part, event.data.to_json, event
28
- end
29
-
30
- def push_batch(events_by_collection)
31
- path_uri_part = "/events"
32
-
33
- @http.send path_uri_part, events_by_collection.to_json, events_by_collection
34
- end
35
- end
36
-
37
- private
38
-
39
- class Sync
40
- def initialize(base_url, headers)
41
- require 'uri'
42
- require 'net/http'
43
- require 'net/https'
44
-
45
- @headers = headers
46
- @connect_uri = URI.parse(base_url)
47
- @http = Net::HTTP.new(@connect_uri.host, @connect_uri.port)
48
- setup_ssl if @connect_uri.scheme == 'https'
49
- end
50
-
51
- def send(path, body, events)
52
- response = @http.post(path, body, @headers)
53
- ConnectClient::EventPushResponse.new response.code, response['Content-Type'], response.body, events
54
- end
55
-
56
- private
57
-
58
- def setup_ssl
59
- @http.use_ssl = true
60
- @http.verify_mode = OpenSSL::SSL::VERIFY_PEER
61
- @http.verify_depth = 5
62
- @http.ca_file = File.expand_path("../../../../data/cacert.pem", __FILE__)
63
- end
64
- end
65
-
66
- class Async
67
-
68
- def initialize(base_url, headers)
69
- require 'em-http-request'
70
-
71
- @headers = headers
72
- @base_url = base_url.chomp('/')
73
- end
74
-
75
- def send(path, body, events)
76
- raise AsyncHttpError unless defined?(EventMachine) && EventMachine.reactor_running?
77
-
78
- use_syncrony = defined?(EM::Synchrony)
79
-
80
- if use_syncrony
81
- send_using_synchrony(path, body, events)
82
- else
83
- send_using_deferred(path, body, events)
84
- end
85
- end
86
-
87
- def send_using_deferred(path, body, events)
88
- deferred = DeferredHttpResponse.new
89
- url_string = "#{@base_url}#{path}".chomp('/')
90
- http = EventMachine::HttpRequest.new(url_string).post(:body => body, :head => @headers)
91
- http_callback = Proc.new do
92
- begin
93
- response = create_response http, events
94
- deferred.succeed response
95
- rescue => error
96
- deferred.fail error
97
- end
98
- end
99
-
100
- http.callback &http_callback
101
- http.errback &http_callback
102
-
103
- deferred
104
- end
105
-
106
- def send_using_synchrony(path, body, events)
107
- url_string = "#{@base_url}#{path}".chomp('/')
108
- http = EventMachine::HttpRequest.new(url_string).
109
- post(:body => body, :head => @headers)
110
-
111
- create_response http, events
112
- end
113
-
114
- def create_response(http_reponse, events)
115
- status = http_reponse.response_header.status
116
- content_type = http_reponse.response_header['Content-Type']
117
- if (http_reponse.error.to_s.empty?)
118
- ConnectClient::EventPushResponse.new status, content_type, http_reponse.response, events
119
- else
120
- ConnectClient::EventPushResponse.new status, content_type, http_reponse.error, events
121
- end
122
- end
123
- end
124
-
125
- class DeferredHttpResponse
126
- if defined?(EventMachine::Deferrable)
127
- include EventMachine::Deferrable
128
- alias_method :response_received, :callback
129
- alias_method :error_occured, :errback
130
- end
131
- end
132
-
133
- class AsyncHttpError < StandardError
134
- def message
135
- "An EventMachine loop must be running to send an async http request via 'em-http-request'"
136
- end
137
- end
138
- end
1
+ require 'json'
2
+ require_relative '../event_push_response'
3
+
4
+ module ConnectClient
5
+ module Http
6
+ class EventEndpoint
7
+ def initialize(config)
8
+ headers = {
9
+ "Content-Type" => "application/json",
10
+ "Accept" => "application/json",
11
+ "Accept-Encoding" => "identity",
12
+ "X-Api-Key" => config.api_key,
13
+ "X-Project-Id" => config.project_id
14
+ }
15
+
16
+ if config.async
17
+ @http = Async.new config.base_url, headers
18
+ else
19
+ @http = Sync.new config.base_url, headers
20
+ end
21
+
22
+ end
23
+
24
+ def push(collection_name, event)
25
+ path_uri_part = "/events/#{collection_name}"
26
+
27
+ @http.send path_uri_part, event.data.to_json, event
28
+ end
29
+
30
+ def push_batch(events_by_collection)
31
+ path_uri_part = "/events"
32
+
33
+ @http.send path_uri_part, events_by_collection.to_json, events_by_collection
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ class Sync
40
+ def initialize(base_url, headers)
41
+ require 'uri'
42
+ require 'net/http'
43
+ require 'net/https'
44
+
45
+ @headers = headers
46
+ @connect_uri = URI.parse(base_url)
47
+ @http = Net::HTTP.new(@connect_uri.host, @connect_uri.port)
48
+ setup_ssl if @connect_uri.scheme == 'https'
49
+ end
50
+
51
+ def send(path, body, events)
52
+ response = @http.post(path, body, @headers)
53
+ ConnectClient::EventPushResponse.new response.code, response['Content-Type'], response.body, events
54
+ end
55
+
56
+ private
57
+
58
+ def setup_ssl
59
+ @http.use_ssl = true
60
+ @http.verify_mode = OpenSSL::SSL::VERIFY_PEER
61
+ @http.verify_depth = 5
62
+ @http.ca_file = File.expand_path("../../../../data/cacert.pem", __FILE__)
63
+ end
64
+ end
65
+
66
+ class Async
67
+
68
+ def initialize(base_url, headers)
69
+ require 'em-http-request'
70
+
71
+ @headers = headers
72
+ @base_url = base_url.chomp('/')
73
+ end
74
+
75
+ def send(path, body, events)
76
+ raise AsyncHttpError unless defined?(EventMachine) && EventMachine.reactor_running?
77
+
78
+ use_syncrony = defined?(EM::Synchrony)
79
+
80
+ if use_syncrony
81
+ send_using_synchrony(path, body, events)
82
+ else
83
+ send_using_deferred(path, body, events)
84
+ end
85
+ end
86
+
87
+ def send_using_deferred(path, body, events)
88
+ deferred = DeferredHttpResponse.new
89
+ url_string = "#{@base_url}#{path}".chomp('/')
90
+ http = EventMachine::HttpRequest.new(url_string).post(:body => body, :head => @headers)
91
+ http_callback = Proc.new do
92
+ begin
93
+ response = create_response http, events
94
+ deferred.succeed response
95
+ rescue => error
96
+ deferred.fail error
97
+ end
98
+ end
99
+
100
+ http.callback &http_callback
101
+ http.errback &http_callback
102
+
103
+ deferred
104
+ end
105
+
106
+ def send_using_synchrony(path, body, events)
107
+ url_string = "#{@base_url}#{path}".chomp('/')
108
+ http = EventMachine::HttpRequest.new(url_string).
109
+ post(:body => body, :head => @headers)
110
+
111
+ create_response http, events
112
+ end
113
+
114
+ def create_response(http_reponse, events)
115
+ status = http_reponse.response_header.status
116
+ content_type = http_reponse.response_header['Content-Type']
117
+ if (http_reponse.error.to_s.empty?)
118
+ ConnectClient::EventPushResponse.new status, content_type, http_reponse.response, events
119
+ else
120
+ ConnectClient::EventPushResponse.new status, content_type, http_reponse.error, events
121
+ end
122
+ end
123
+ end
124
+
125
+ class DeferredHttpResponse
126
+ if defined?(EventMachine::Deferrable)
127
+ include EventMachine::Deferrable
128
+ alias_method :response_received, :callback
129
+ alias_method :error_occured, :errback
130
+ end
131
+ end
132
+
133
+ class AsyncHttpError < StandardError
134
+ def message
135
+ "An EventMachine loop must be running to send an async http request via 'em-http-request'"
136
+ end
137
+ end
138
+ end
139
139
  end