cyclone_lariat 0.3.1 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5458f171a6a306641b03d57341f62228b73a49c2aa222c49e764dd2194c1ab61
4
- data.tar.gz: 3fd96a4dcd07b7a52203161b75023b480312b0a6a4bf3eb76ecbaecb8122d8a9
3
+ metadata.gz: 1a2cb273b81db1d5340fb4e0082e2d672365ebf75dcdfa25681f18d1d3c1fcb6
4
+ data.tar.gz: c5a458e595a79ed1c11b8560fe92eed4c72d6f763bc0912fe6caa4b83c7011ac
5
5
  SHA512:
6
- metadata.gz: 22b7f9b1c2e438368a329d118f6fcfc0b659d12d42590cea25db4961ed17ac0f36904f67a0ea18d7c6498dae5ab8b66033155bec6a883a9c0fceb1024c8b8a1a
7
- data.tar.gz: ee83d106d2cf8fcee7831aece4b52ebf1083f6ec1ceb37adaea106fda27bd747907301b5baaa6efd6c420c970a6a45495a976508bf0683be71fb17b09a6634d4
6
+ metadata.gz: 7220818e4617f98673116c0f952ae011bb278a7b0bde70f39f7b1d603db5665f1c8667c4242dd20b56be8ed55439554bcbd8fee52de4618a82864820774e0bfe
7
+ data.tar.gz: bddaa075da7cafba0037e69e2bdd53520dc6afc257deb2dedf7726ef2beb622dc46b9225c8fdd74e11441f9b03defe0949db4b48044de807f4c8b4c806a56732
data/.gitignore CHANGED
@@ -16,3 +16,7 @@ config/db.rb
16
16
 
17
17
  # gem builds
18
18
  *.gem
19
+
20
+ # docker-compose
21
+ /local/
22
+ /privatekey
data/CHANGELOG.md CHANGED
@@ -4,7 +4,15 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [0.3.0] - 2021-06-11
7
+ ## [0.3.3] - 2021-07-14
8
+ Changed
9
+ - Bugfix of message equality check
10
+
11
+ ## [0.3.2] - 2021-06-11
12
+ Changed
13
+ - Bugfix
14
+
15
+ ## [0.3.1] - 2021-06-11
8
16
  Changed
9
17
  - Command
10
18
  - SqsClient
data/Dockerfile ADDED
@@ -0,0 +1,10 @@
1
+ FROM ruby:2.6.5-buster
2
+ RUN apt-get update \
3
+ && apt-get install -y --no-install-recommends \
4
+ postgresql-client
5
+ WORKDIR /gem
6
+ COPY lib/cyclone_lariat/version.rb ./lib/cyclone_lariat/version.rb
7
+ COPY cyclone_lariat.gemspec ./
8
+ COPY Gemfile* ./
9
+ RUN bundle install --jobs 20 --retry 5
10
+ CMD ["rake"]
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cyclone_lariat (0.3.1)
4
+ cyclone_lariat (0.3.5)
5
5
  aws-sdk-sns
6
6
  aws-sdk-sqs
7
7
  luna_park (~> 0.11)
@@ -12,20 +12,20 @@ GEM
12
12
  addressable (2.7.0)
13
13
  public_suffix (>= 2.0.2, < 5.0)
14
14
  ast (2.4.2)
15
- aws-eventstream (1.1.1)
16
- aws-partitions (1.462.0)
17
- aws-sdk-core (3.114.0)
15
+ aws-eventstream (1.2.0)
16
+ aws-partitions (1.541.0)
17
+ aws-sdk-core (3.124.0)
18
18
  aws-eventstream (~> 1, >= 1.0.2)
19
- aws-partitions (~> 1, >= 1.239.0)
19
+ aws-partitions (~> 1, >= 1.525.0)
20
20
  aws-sigv4 (~> 1.1)
21
21
  jmespath (~> 1.0)
22
- aws-sdk-sns (1.40.0)
23
- aws-sdk-core (~> 3, >= 3.112.0)
22
+ aws-sdk-sns (1.49.0)
23
+ aws-sdk-core (~> 3, >= 3.122.0)
24
24
  aws-sigv4 (~> 1.1)
25
- aws-sdk-sqs (1.39.0)
26
- aws-sdk-core (~> 3, >= 3.112.0)
25
+ aws-sdk-sqs (1.48.0)
26
+ aws-sdk-core (~> 3, >= 3.122.0)
27
27
  aws-sigv4 (~> 1.1)
28
- aws-sigv4 (1.2.3)
28
+ aws-sigv4 (1.4.0)
29
29
  aws-eventstream (~> 1, >= 1.0.2)
30
30
  byebug (11.1.3)
31
31
  coderay (1.1.3)
@@ -74,7 +74,7 @@ GEM
74
74
  dry-schema (~> 1.5, >= 1.5.2)
75
75
  hashdiff (1.0.1)
76
76
  jmespath (1.4.0)
77
- luna_park (0.11.1)
77
+ luna_park (0.11.3)
78
78
  method_source (1.0.0)
79
79
  parallel (1.20.1)
80
80
  parser (3.0.1.1)
@@ -132,10 +132,11 @@ GEM
132
132
  yard (0.9.26)
133
133
 
134
134
  PLATFORMS
135
+ ruby
135
136
  x86_64-linux
136
137
 
137
138
  DEPENDENCIES
138
- bundler (~> 2.1)
139
+ bundler (~> 1.17)
139
140
  byebug (~> 11.1)
140
141
  cyclone_lariat!
141
142
  database_cleaner-sequel (~> 2.0)
@@ -152,4 +153,4 @@ DEPENDENCIES
152
153
  yard (~> 0.9)
153
154
 
154
155
  BUNDLED WITH
155
- 2.2.19
156
+ 1.17.3
data/README.md CHANGED
@@ -159,7 +159,6 @@ class Receiver
159
159
  queue: 'your_sqs_queue_name'
160
160
 
161
161
  server_middleware do |chain|
162
-
163
162
  # Options dataset, errors_notifier and message_notifier is optionals.
164
163
  # If you dont define notifiers - middleware does not notify
165
164
  # If you dont define dataset - middleware does store events in db
data/Rakefile CHANGED
@@ -1,11 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rake'
4
+ require 'bundler/gem_tasks'
5
+ require 'rspec/core/rake_task'
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
4
8
 
5
9
  # tasks from lib directory
6
10
  Dir[File.expand_path('lib/tasks/**/*.rake', __dir__)].each do |entity|
7
- puts entity
8
- load entity
11
+ print "#{entity} : "
12
+ puts load entity
9
13
  end
10
14
 
11
15
  task default: %i[spec] # rubocop]
data/bin/docker/diff ADDED
@@ -0,0 +1,3 @@
1
+ # Show differences between local Dockerfile and production Dockerfile
2
+
3
+ diff Dockerfile local.Dockerfile -aBw
data/bin/docker/init ADDED
@@ -0,0 +1,38 @@
1
+ # Initialize project to use Docker and prepare app in Docker
2
+ #
3
+ # WARNING
4
+ # if your default ssh key `id_rsa` is protected by password,
5
+ # you need to create a new key without password only for Github (and authorize this key in github)
6
+ # @example
7
+ # `ssh-keygen -b 4096 -f ~/.ssh/id_rsa_git -N ""`
8
+ #
9
+ # And define a name of new key when calling this script.
10
+ # @example:
11
+ # `bin/docker-init id_rsa_git`
12
+
13
+ bin/docker-privatekey $@
14
+
15
+ echo "> Preparing volume directories"
16
+ mkdir local
17
+ mkdir local/postgres
18
+ mkdir local/postgres/pgdata
19
+ grep -q "# docker-compose" .gitignore || echo "\n# docker-compose\n/local/\n/privatekey" >> .gitignore
20
+
21
+ echo "> Build"
22
+ docker compose down
23
+ docker compose build
24
+ docker compose up -d
25
+
26
+ # Restart because of some problems with PG first startup
27
+ echo "> Restart"
28
+ docker compose down
29
+ docker compose up -d
30
+
31
+ echo "> Wait for pg startup"
32
+ sleep 10
33
+
34
+ echo "> Create databases"
35
+ docker compose exec app rake db:create
36
+ docker compose exec app rake db:create INSTANCE=test
37
+ docker compose exec app rake db:migrate
38
+ docker compose exec app rake db:migrate INSTANCE=test
@@ -0,0 +1,17 @@
1
+ # Note:
2
+ # Docker needs for ssh privatekey to fetch data from github
3
+ # To do that, this script creates hardlink to privatekey
4
+ #
5
+ # WARNING
6
+ # privatekey MUST NOT be protected by password
7
+ # If your `id_rsa` is protected by password, you need to create new key without password (for example, `id_rsa_git`)
8
+ # And use that key when running this script:
9
+ # `bin/docker-init id_rsa_git`
10
+
11
+ if test "$@"
12
+ then privatekey_name="$@"
13
+ else privatekey_name="id_rsa"
14
+ fi
15
+
16
+ echo "> Trying to create link 'privatekey'"
17
+ ln ~/.ssh/$privatekey_name privatekey && echo "> Created link to '~/.ssh/$privatekey_name' named 'privatekey'"
data/bin/docker/rm ADDED
@@ -0,0 +1,5 @@
1
+ # Remove Doсker local files created by docker-init
2
+
3
+ docker compose down
4
+ rm -rf local
5
+ rm privatekey
data/config/db.example.rb CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  DB_CONF = {
4
4
  adapter: 'postgresql',
5
- host: 'host',
6
- username: 'postgres',
7
- password: 'password',
8
- database: 'cyclone-lariat-test'
5
+ host: ENV.fetch('DB_HOST', 'host'),
6
+ username: ENV.fetch('DB_USER', 'postgres'),
7
+ password: ENV.fetch('DB_PASSWORD', 'password'),
8
+ database: ENV.fetch('DB_NAME', 'cyclone-lariat-test')
9
9
  }.freeze
@@ -36,7 +36,7 @@ Gem::Specification.new do |spec|
36
36
  spec.add_dependency 'aws-sdk-sqs'
37
37
  spec.add_dependency 'luna_park', '~> 0.11'
38
38
 
39
- spec.add_development_dependency 'bundler', '~> 2.1'
39
+ spec.add_development_dependency 'bundler', '~> 1.17'
40
40
  spec.add_development_dependency 'byebug', '~> 11.1'
41
41
  spec.add_development_dependency 'database_cleaner-sequel', '~> 2.0'
42
42
  spec.add_development_dependency 'dry-validation', '~> 1.1'
@@ -0,0 +1,24 @@
1
+ version: "3.9"
2
+
3
+ services:
4
+ app:
5
+ build: .
6
+ volumes:
7
+ - .:/gem
8
+ command: /bin/bash -c "while true; do sleep 1; done"
9
+ links:
10
+ - pg
11
+ environment:
12
+ - DB_HOST=pg
13
+ - DB_USER=ruby
14
+ - DB_PASSWORD=ruby
15
+ restart: always
16
+
17
+ pg:
18
+ image: postgres
19
+ volumes:
20
+ - ./local/postgres/pgdata:/var/lib/postgresql/data/pgdata
21
+ environment:
22
+ POSTGRES_USER: ruby
23
+ POSTGRES_PASSWORD: ruby
24
+ PGDATA: /var/lib/postgresql/data/pgdata
@@ -9,13 +9,8 @@ module CycloneLariat
9
9
  attr :uuid, String, :new
10
10
  attr :publisher, String, :new
11
11
  attr :type, String, :new
12
- attr :client_error
13
- attr :version
14
- attr :data
15
-
16
- attr_reader :sent_at,
17
- :processed_at,
18
- :received_at
12
+ attrs :client_error, :version, :data,
13
+ :sent_at, :processed_at, :received_at
19
14
 
20
15
  def kind
21
16
  raise LunaPark::Errors::AbstractMethod
@@ -37,6 +32,10 @@ module CycloneLariat
37
32
  @processed_at = wrap_time(value)
38
33
  end
39
34
 
35
+ def processed?
36
+ !@processed_at.nil?
37
+ end
38
+
40
39
  def client_error_message=(txt)
41
40
  return unless txt
42
41
 
@@ -57,11 +56,10 @@ module CycloneLariat
57
56
  publisher == other.publisher &&
58
57
  type == other.type &&
59
58
  client_error&.message == other.client_error&.message &&
60
- client_error&.details == other.client_error&.details &&
61
59
  version == other.version &&
62
60
  sent_at.to_i == other.sent_at.to_i &&
63
- received_at.to_i == other.received_at.to_i
64
- processed_at.to_i == other.processed_at.to_i
61
+ received_at.to_i == other.received_at.to_i &&
62
+ processed_at.to_i == other.processed_at.to_i
65
63
  end
66
64
 
67
65
  def to_json(*args)
@@ -77,7 +75,7 @@ module CycloneLariat
77
75
  when String then Time.parse(value)
78
76
  when Time then value
79
77
  when NilClass then nil
80
- else raise Argumentevent.rbError, "Unknown type `#{value.class}`"
78
+ else raise ArgumentError, "Unknown type `#{value.class}`"
81
79
  end
82
80
  end
83
81
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CycloneLariat
4
+ class MessagesMapper
5
+ class << self
6
+ def from_row(row)
7
+ return if row.nil?
8
+
9
+ row[:data] = hash_from_json_column(row[:data])
10
+ row[:client_error_details] = hash_from_json_column(row[:client_error_details]) if row[:client_error_details]
11
+ row
12
+ end
13
+
14
+ def to_row(input)
15
+ row = {
16
+ uuid: input.uuid,
17
+ kind: input.kind,
18
+ type: input.type,
19
+ publisher: input.publisher,
20
+ data: JSON.generate(input.data),
21
+ client_error_message: input.client_error&.message,
22
+ client_error_details: JSON.generate(input.client_error&.details),
23
+ version: input.version,
24
+ sent_at: input.sent_at
25
+ }
26
+ row
27
+ end
28
+
29
+ private
30
+
31
+ def hash_from_json_column(data)
32
+ return JSON.parse(data) if data.is_a?(String)
33
+
34
+ if pg_json_extension_enabled?
35
+ return data.to_h if data.is_a?(Sequel::Postgres::JSONHash)
36
+ return JSON.parse(data.to_s) if data.is_a?(Sequel::Postgres::JSONString)
37
+ end
38
+
39
+ raise ArgumentError, "Unknown type of `#{data}`"
40
+ end
41
+
42
+ def pg_json_extension_enabled?
43
+ Object.const_defined?('Sequel::Postgres::JSONHash')
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'event'
4
+ require_relative 'messages_mapper'
4
5
 
5
6
  module CycloneLariat
6
7
  class MessagesRepo
@@ -11,17 +12,7 @@ module CycloneLariat
11
12
  end
12
13
 
13
14
  def create(msg)
14
- dataset.insert(
15
- uuid: msg.uuid,
16
- kind: msg.kind,
17
- type: msg.type,
18
- publisher: msg.publisher,
19
- data: JSON.generate(msg.data),
20
- client_error_message: msg.client_error&.message,
21
- client_error_details: JSON.generate(msg.client_error&.details),
22
- version: msg.version,
23
- sent_at: msg.sent_at
24
- )
15
+ dataset.insert MessagesMapper.to_row(msg)
25
16
  end
26
17
 
27
18
  def exists?(uuid:)
@@ -36,32 +27,22 @@ module CycloneLariat
36
27
  end
37
28
 
38
29
  def find(uuid:)
39
- raw = dataset.where(uuid: uuid).first
40
- raw[:data] = JSON.parse(raw[:data], symbolize_names: true)
41
- if raw[:client_error_details]
42
- raw[:client_error_details] = JSON.parse(raw[:client_error_details], symbolize_names: true)
43
- end
44
- build raw
30
+ row = dataset.where(uuid: uuid).first
31
+ return if row.nil?
32
+
33
+ build MessagesMapper.from_row(row)
45
34
  end
46
35
 
47
36
  def each_unprocessed
48
- dataset.where(processed_at: nil).each do |raw|
49
- raw[:data] = JSON.parse(raw[:data], symbolize_names: true)
50
- if raw[:client_error_details]
51
- raw[:client_error_details] = JSON.parse(raw[:client_error_details], symbolize_names: true)
52
- end
53
- msg = build raw
37
+ dataset.where(processed_at: nil).each do |row|
38
+ msg = build MessagesMapper.from_row(row)
54
39
  yield(msg)
55
40
  end
56
41
  end
57
42
 
58
43
  def each_with_client_errors
59
- dataset.where { (processed_at !~ nil) & (client_error_message !~ nil) }.each do |raw|
60
- raw[:data] = JSON.parse(raw[:data], symbolize_names: true)
61
- if raw[:client_error_details]
62
- raw[:client_error_details] = JSON.parse(raw[:client_error_details], symbolize_names: true)
63
- end
64
- msg = build raw
44
+ dataset.where { (processed_at !~ nil) & (client_error_message !~ nil) }.each do |row|
45
+ msg = build MessagesMapper.from_row(row)
65
46
  yield(msg)
66
47
  end
67
48
  end
@@ -20,8 +20,8 @@ module CycloneLariat
20
20
  catch_standard_error(queue, msg) do
21
21
  event = Event.wrap(msg)
22
22
 
23
- catch_business_error(event) do
24
- store_in_dataset(event, &block)
23
+ store_in_dataset(event) do
24
+ catch_business_error(event, &block)
25
25
  end
26
26
  end
27
27
  end
@@ -36,9 +36,11 @@ module CycloneLariat
36
36
 
37
37
  def store_in_dataset(event)
38
38
  return yield if events_repo.nil?
39
- return true if events_repo.exists?(uuid: event.uuid)
40
39
 
41
- events_repo.create(event)
40
+ existed = events_repo.find(uuid: event.uuid)
41
+ return true if existed&.processed?
42
+
43
+ events_repo.create(event) unless existed
42
44
  yield
43
45
  events_repo.processed! uuid: event.uuid, error: event.client_error
44
46
  end
@@ -52,7 +54,7 @@ module CycloneLariat
52
54
 
53
55
  def catch_standard_error(queue, msg)
54
56
  yield
55
- rescue StandardError => e
57
+ rescue Exception => e
56
58
  errors_notifier&.error(e, queue: queue, message: msg)
57
59
  raise e
58
60
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CycloneLariat
4
- VERSION = '0.3.1'
4
+ VERSION = '0.3.5'
5
5
  end
@@ -3,6 +3,7 @@
3
3
  require_relative 'cyclone_lariat/sns_client'
4
4
  require_relative 'cyclone_lariat/errors'
5
5
  require_relative 'cyclone_lariat/event'
6
+ require_relative 'cyclone_lariat/messages_mapper'
6
7
  require_relative 'cyclone_lariat/messages_repo'
7
8
  require_relative 'cyclone_lariat/middleware'
8
9
  require_relative 'cyclone_lariat/version'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyclone_lariat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Kudrin
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-06-11 00:00:00.000000000 Z
12
+ date: 2021-12-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk-sns
@@ -59,14 +59,14 @@ dependencies:
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '2.1'
62
+ version: '1.17'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '2.1'
69
+ version: '1.17'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: byebug
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -263,14 +263,20 @@ files:
263
263
  - ".ruby-gemset"
264
264
  - ".ruby-version"
265
265
  - CHANGELOG.md
266
+ - Dockerfile
266
267
  - Gemfile
267
268
  - Gemfile.lock
268
269
  - README.md
269
270
  - Rakefile
271
+ - bin/docker/diff
272
+ - bin/docker/init
273
+ - bin/docker/privatekey
274
+ - bin/docker/rm
270
275
  - config/db.example.rb
271
276
  - cyclone_lariat.gemspec
272
277
  - db/migrate/01_add_uuid_extensions.rb
273
278
  - db/migrate/02_add_events.rb
279
+ - docker-compose.yml
274
280
  - docs/_imgs/diagram.png
275
281
  - docs/_imgs/lariat.jpg
276
282
  - lib/cyclone_lariat.rb
@@ -279,6 +285,7 @@ files:
279
285
  - lib/cyclone_lariat/command.rb
280
286
  - lib/cyclone_lariat/errors.rb
281
287
  - lib/cyclone_lariat/event.rb
288
+ - lib/cyclone_lariat/messages_mapper.rb
282
289
  - lib/cyclone_lariat/messages_repo.rb
283
290
  - lib/cyclone_lariat/middleware.rb
284
291
  - lib/cyclone_lariat/sns_client.rb