gorg_service 0.2.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c367d16bc5790468c190d509d84e89effef69fbb
4
- data.tar.gz: 1951f35a70ffacddb8f1f141df9febeadc890420
3
+ metadata.gz: 4202710bccd62ba26cc53da5903a84e570bc3ca6
4
+ data.tar.gz: 7b7a517db9b978955a768471aad1e3685b8a89bd
5
5
  SHA512:
6
- metadata.gz: 912bc14211df2c260d360023f3e6ee378bb228db615408d46615197bb0db4f0acaa4957aeb10bb1d3ba1c1a2b6e7593fbbb12b99a50467583fce7326b22028b4
7
- data.tar.gz: 7c1bc8ac7f5f3268d35b5d481efe7fb2821b5d2abb6fdbfb3389a47c2de453f1b6660bfdd1e267ba4cbbba90318953b4c2e9bf313e8b3a0ef51c8dc430680d2e
6
+ metadata.gz: 36684953d4b5825695b0b2f5e970c69ea2ba9dc05158180f4db95d6d22bde0369938aa2c448157e4ac4d297eea3a3e843ff7c16487448eda9a14759031135e4b
7
+ data.tar.gz: bca143a3e2bbbaa1154e92e5f2f1d26f32db5fc5044eac750038e8bdfd2e4d33db3cc4bc42513f902c73c9011322dda24c4b544afbe0ba880b2bbffc77d3ccd3
data/gorg_service.gemspec CHANGED
@@ -35,4 +35,5 @@ Gem::Specification.new do |spec|
35
35
  spec.add_development_dependency 'bogus', '~> 0.1.6'
36
36
  spec.add_development_dependency 'bunny-mock', '~> 1.4'
37
37
  spec.add_development_dependency 'byebug', '~> 9.0'
38
+ spec.add_development_dependency 'json-schema'
38
39
  end
@@ -24,14 +24,14 @@ class GorgService
24
24
  #Softfail error : This message should be processed again later
25
25
  class SoftfailError < FailError
26
26
  def type
27
- "softfail"
27
+ "softerror"
28
28
  end
29
29
  end
30
30
 
31
31
  #Hardfail error : This message is not processable and will never be
32
32
  class HardfailError < FailError
33
33
  def type
34
- "hardfail"
34
+ "harderror"
35
35
  end
36
36
  end
37
37
  end
@@ -3,6 +3,8 @@
3
3
  require 'json'
4
4
  require 'time'
5
5
 
6
+ require "gorg_service/message/json_schema"
7
+
6
8
  class GorgService
7
9
  class Message
8
10
 
@@ -10,24 +12,30 @@ class GorgService
10
12
  attr_accessor :id
11
13
  attr_accessor :data
12
14
  attr_accessor :errors
15
+ attr_accessor :creation_time
16
+ attr_accessor :sender
13
17
 
14
18
  def errors
15
19
  @errors||=[]
16
20
  end
17
21
 
18
22
 
19
- def initialize(id: nil, data: nil, event: nil, errors: [])
20
- @id=id || generate_id
23
+ def initialize(id: generate_id, data: nil, event: nil, creation_time: DateTime.now.iso8601, sender: application_id , errors: [])
24
+ @id=id
21
25
  @event=event
22
26
  @data=data
23
27
  @errors=errors
28
+ @creation_time=creation_time
29
+ @sender= sender
24
30
  end
25
31
 
26
32
  # Generate RabbitMQ message body
27
33
  def to_json
28
34
  body={
29
- id: @id,
30
- event: @event,
35
+ event_uuid: @id,
36
+ event_name: @event,
37
+ event_sender_id: @sender,
38
+ event_creation_time: @creation_time,
31
39
  data: @data,
32
40
  }
33
41
  if errors.any?
@@ -39,12 +47,16 @@ class GorgService
39
47
 
40
48
  # Log FailError in message body
41
49
  def log_error error
42
- errors<<{
43
- type: error.type.downcase,
44
- message: error.message,
45
- timestamp: Time.now.utc.iso8601,
46
- extra: error.error_raised.inspect,
50
+ hsh={
51
+ error_type: error.type.downcase,
52
+ error_uuid: generate_id,
53
+ error_sender: application_id ,
54
+ error_message: error.message||"",
55
+ timestamp: DateTime.now.iso8601,
56
+ error_debug: {internal_error: error.error_raised.inspect},
47
57
  }
58
+ hsh[:error_debug] = {internal_error: error.error_raised.inspect} if error.error_raised
59
+ errors<<hsh
48
60
  end
49
61
 
50
62
  ### Class methods
@@ -58,10 +70,14 @@ class GorgService
58
70
  begin
59
71
  json_body=JSON.parse(body)
60
72
 
73
+ JSON::Validator.validate!(GorgService::Message::JSON_SCHEMA,json_body)
74
+
61
75
  msg=self.new(
62
- id: json_body["id"],
63
- event: json_body["event"],
76
+ id: json_body["event_uuid"],
77
+ event: json_body["event_name"],
64
78
  data: convert_keys_to_sym(json_body["data"]),
79
+ creation_time: json_body["event_creation_time"] && DateTime.parse(json_body["event_creation_time"]),
80
+ sender: json_body["event_sender_id"],
65
81
  errors: json_body["errors"]&&json_body["errors"].map{|e| convert_keys_to_sym(e)},
66
82
  )
67
83
 
@@ -92,7 +108,11 @@ class GorgService
92
108
 
93
109
  # Generate new id
94
110
  def generate_id
95
- "#{GorgService.configuration.application_id}_#{Time.now.to_i}"
111
+ SecureRandom.uuid()
112
+ end
113
+
114
+ def application_id
115
+ GorgService.configuration.application_id
96
116
  end
97
117
 
98
118
 
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'json'
5
+
6
+ class GorgService
7
+ class Message
8
+
9
+ JSON_SCHEMA = JSON.parse('{
10
+ "$schema": "http://json-schema.org/draft-04/schema#",
11
+ "type": "object",
12
+ "properties": {
13
+ "event_name": {
14
+ "type": "string",
15
+ "pattern": "^[_a-z]+((\\.)?[_a-z]+)*$",
16
+ "description": "Event type. Must match the routing key"
17
+ },
18
+ "event_uuid": {
19
+ "type": "string",
20
+ "description": "The unique identifier of this message as UUID",
21
+ "pattern": "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"
22
+ },
23
+ "event_creation_time": {
24
+ "type": "string",
25
+ "description": "Creation time in UTC ISO 8601 format",
26
+ "pattern": "^([\\\+-]?\\\d{4}(?!\\\d{2}\\\b))((-?)((0[1-9]|1[0-2])(\\\3([12]\\\d|0[1-9]|3[01]))?|W([0-4]\\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\\d|[12]\\\d{2}|3([0-5]\\\d|6[1-6])))([T\\\s]((([01]\\\d|2[0-3])((:?)[0-5]\\\d)?|24\\\:?00)([\\\.,]\\\d+(?!:))?)?(\\\17[0-5]\\\d([\\\.,]\\\d+)?)?([zZ]|([\\\+-])([01]\\\d|2[0-3]):?([0-5]\\\d)?)?)?)?$"
27
+ },
28
+ "event_sender_id": {
29
+ "type": "string",
30
+ "description": "Producer that sent the original message"
31
+ },
32
+ "data": {
33
+ "type": "object",
34
+ "description": "Data used to process this message"
35
+ },
36
+ "errors_count": {
37
+ "type": "integer",
38
+ "description": "Helper for counting errors"
39
+ },
40
+ "errors": {
41
+ "type": "array",
42
+ "items": {
43
+ "type": "object",
44
+ "properties": {
45
+ "error_type": {
46
+ "enum": [ "debug", "info", "warning", "softerror", "harderror" ],
47
+ "description": "Type of error."
48
+ },
49
+ "error_sender": {
50
+ "type": "string",
51
+ "description": "Consummer that sent this error"
52
+ },
53
+ "error_code":{
54
+ "type":"string",
55
+ "description": "Optionnal error code from the consummer"
56
+ },
57
+ "error_uuid":{
58
+ "type":"string",
59
+ "description": "The unique identifier of this error as UUID",
60
+ "pattern": "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"
61
+ },
62
+ "error_message":{
63
+ "type":"string",
64
+ "description": "Error explanation"
65
+ },
66
+ "timestamp": {
67
+ "type": "string",
68
+ "description": "Time of occuring error in UTC ISO 8601",
69
+ "pattern": "^([\\\+-]?\\\d{4}(?!\\\d{2}\\\b))((-?)((0[1-9]|1[0-2])(\\\3([12]\\\d|0[1-9]|3[01]))?|W([0-4]\\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\\d|[12]\\\d{2}|3([0-5]\\\d|6[1-6])))([T\\\s]((([01]\\\d|2[0-3])((:?)[0-5]\\\d)?|24\\\:?00)([\\\.,]\\\d+(?!:))?)?(\\\17[0-5]\\\d([\\\.,]\\\d+)?)?([zZ]|([\\\+-])([01]\\\d|2[0-3]):?([0-5]\\\d)?)?)?)?$"
70
+ },
71
+ "error_debug": {
72
+ "type": "object",
73
+ "description": "Complementary informations for debugging"
74
+ }
75
+ },
76
+ "additionalProperties": false,
77
+ "required": [
78
+ "error_type",
79
+ "error_sender",
80
+ "timestamp",
81
+ "error_uuid",
82
+ "error_message"
83
+ ]
84
+ }
85
+ }
86
+ },
87
+ "additionalProperties": false,
88
+ "required": [
89
+ "event_name",
90
+ "event_uuid",
91
+ "event_creation_time",
92
+ "event_sender_id",
93
+ "data"
94
+ ]
95
+ }')
96
+
97
+ end
98
+ end
@@ -9,11 +9,11 @@ class GorgService
9
9
  end
10
10
 
11
11
  def raise_hardfail(message, error:nil)
12
- raise HardfailError.new(error), message
12
+ raise HardfailError.new(message, error)
13
13
  end
14
14
 
15
15
  def raise_softfail(message, error:nil)
16
- raise SoftfailError.new(error), message
16
+ raise SoftfailError.new(message, error)
17
17
  end
18
18
 
19
19
  end
@@ -2,5 +2,5 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  class GorgService
5
- VERSION = "0.2.0"
5
+ VERSION = "1.0.0"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gorg_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandre Narbonne
@@ -128,6 +128,20 @@ dependencies:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
130
  version: '9.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: json-schema
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
131
145
  description:
132
146
  email:
133
147
  - alexandre.narbonne@gadz.org
@@ -151,6 +165,7 @@ files:
151
165
  - lib/gorg_service/errors.rb
152
166
  - lib/gorg_service/listener.rb
153
167
  - lib/gorg_service/message.rb
168
+ - lib/gorg_service/message/json_schema.rb
154
169
  - lib/gorg_service/message_handler.rb
155
170
  - lib/gorg_service/version.rb
156
171
  homepage: https://github.com/Zooip/gorg_service