lepus 0.0.1.beta2 → 0.1.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.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linter.yml +21 -0
  3. data/.github/workflows/specs.yml +93 -13
  4. data/.gitignore +2 -0
  5. data/.rubocop.yml +10 -0
  6. data/.tool-versions +1 -1
  7. data/Gemfile +7 -0
  8. data/Gemfile.lock +36 -9
  9. data/Makefile +19 -0
  10. data/README.md +562 -7
  11. data/bin/setup +5 -2
  12. data/config.ru +14 -0
  13. data/docker-compose.yml +5 -3
  14. data/docs/README.md +80 -0
  15. data/docs/cli.md +108 -0
  16. data/docs/configuration.md +171 -0
  17. data/docs/consumers.md +168 -0
  18. data/docs/getting-started.md +136 -0
  19. data/docs/images/lepus-web.png +0 -0
  20. data/docs/middleware.md +240 -0
  21. data/docs/producers.md +173 -0
  22. data/docs/prometheus.md +112 -0
  23. data/docs/rails.md +161 -0
  24. data/docs/supervisor.md +112 -0
  25. data/docs/testing.md +141 -0
  26. data/docs/web.md +85 -0
  27. data/examples/grafana-dashboard.json +450 -0
  28. data/gemfiles/Gemfile.rails-5.2 +7 -0
  29. data/gemfiles/{rails52.gemfile.lock → Gemfile.rails-5.2.lock} +102 -69
  30. data/gemfiles/Gemfile.rails-6.1 +7 -0
  31. data/gemfiles/{rails61.gemfile.lock → Gemfile.rails-6.1.lock} +113 -79
  32. data/gemfiles/{rails52.gemfile → Gemfile.rails-7.2} +1 -1
  33. data/gemfiles/Gemfile.rails-7.2.lock +321 -0
  34. data/gemfiles/{rails61.gemfile → Gemfile.rails-8.0} +1 -1
  35. data/gemfiles/Gemfile.rails-8.0.lock +322 -0
  36. data/lepus.gemspec +7 -1
  37. data/lib/lepus/cli.rb +35 -4
  38. data/lib/lepus/configuration.rb +107 -0
  39. data/lib/lepus/connection_pool.rb +135 -0
  40. data/lib/lepus/consumer.rb +59 -41
  41. data/lib/lepus/consumers/config.rb +183 -0
  42. data/lib/lepus/consumers/handler.rb +56 -0
  43. data/lib/lepus/consumers/middleware_chain.rb +22 -0
  44. data/lib/lepus/consumers/middlewares/exception_logger.rb +27 -0
  45. data/lib/lepus/consumers/middlewares/honeybadger.rb +33 -0
  46. data/lib/lepus/consumers/middlewares/json.rb +37 -0
  47. data/lib/lepus/consumers/middlewares/max_retry.rb +83 -0
  48. data/lib/lepus/consumers/middlewares/unique.rb +65 -0
  49. data/lib/lepus/consumers/stats.rb +70 -0
  50. data/lib/lepus/consumers/stats_registry.rb +29 -0
  51. data/lib/lepus/consumers/worker.rb +141 -0
  52. data/lib/lepus/consumers/worker_factory.rb +124 -0
  53. data/lib/lepus/consumers.rb +6 -0
  54. data/lib/lepus/message/delivery_info.rb +72 -0
  55. data/lib/lepus/message/metadata.rb +99 -0
  56. data/lib/lepus/message.rb +88 -5
  57. data/lib/lepus/middleware_chain.rb +83 -0
  58. data/lib/lepus/primitive/hash.rb +29 -0
  59. data/lib/lepus/process.rb +24 -24
  60. data/lib/lepus/process_registry/backend.rb +49 -0
  61. data/lib/lepus/process_registry/file_backend.rb +108 -0
  62. data/lib/lepus/process_registry/message_builder.rb +72 -0
  63. data/lib/lepus/process_registry/rabbitmq_backend.rb +153 -0
  64. data/lib/lepus/process_registry.rb +56 -23
  65. data/lib/lepus/processes/base.rb +0 -5
  66. data/lib/lepus/processes/callbacks.rb +3 -0
  67. data/lib/lepus/processes/interruptible.rb +4 -8
  68. data/lib/lepus/processes/procline.rb +1 -1
  69. data/lib/lepus/processes/registrable.rb +1 -1
  70. data/lib/lepus/processes/runnable.rb +1 -1
  71. data/lib/lepus/processes.rb +15 -0
  72. data/lib/lepus/producer.rb +141 -30
  73. data/lib/lepus/producers/config.rb +46 -0
  74. data/lib/lepus/producers/definition.rb +48 -0
  75. data/lib/lepus/producers/hooks.rb +170 -0
  76. data/lib/lepus/producers/middleware_chain.rb +22 -0
  77. data/lib/lepus/producers/middlewares/correlation_id.rb +37 -0
  78. data/lib/lepus/producers/middlewares/header.rb +47 -0
  79. data/lib/lepus/producers/middlewares/instrumentation.rb +30 -0
  80. data/lib/lepus/producers/middlewares/json.rb +47 -0
  81. data/lib/lepus/producers/middlewares/unique.rb +67 -0
  82. data/lib/lepus/producers.rb +7 -0
  83. data/lib/lepus/prometheus/collector.rb +149 -0
  84. data/lib/lepus/prometheus/instrumentation.rb +168 -0
  85. data/lib/lepus/prometheus.rb +48 -0
  86. data/lib/lepus/publisher.rb +67 -0
  87. data/lib/lepus/supervisor/children_pipes.rb +25 -0
  88. data/lib/lepus/supervisor/lifecycle_hooks.rb +50 -0
  89. data/lib/lepus/supervisor/pidfiled.rb +1 -1
  90. data/lib/lepus/supervisor/registry_cleaner.rb +22 -0
  91. data/lib/lepus/supervisor.rb +129 -25
  92. data/lib/lepus/testing/exchange.rb +95 -0
  93. data/lib/lepus/testing/message_builder.rb +177 -0
  94. data/lib/lepus/testing/rspec_matchers.rb +258 -0
  95. data/lib/lepus/testing.rb +210 -0
  96. data/lib/lepus/unique.rb +18 -0
  97. data/lib/lepus/version.rb +1 -1
  98. data/lib/lepus/web/aggregator.rb +154 -0
  99. data/lib/lepus/web/api.rb +132 -0
  100. data/lib/lepus/web/app.rb +37 -0
  101. data/lib/lepus/web/management_api.rb +192 -0
  102. data/lib/lepus/web/respond_with.rb +28 -0
  103. data/lib/lepus/web.rb +238 -0
  104. data/lib/lepus.rb +39 -28
  105. data/test_offline.html +189 -0
  106. data/web/assets/css/styles.css +635 -0
  107. data/web/assets/js/app.js +6 -0
  108. data/web/assets/js/bootstrap.js +20 -0
  109. data/web/assets/js/controllers/connection_controller.js +44 -0
  110. data/web/assets/js/controllers/dashboard_controller.js +499 -0
  111. data/web/assets/js/controllers/queue_controller.js +17 -0
  112. data/web/assets/js/controllers/theme_controller.js +31 -0
  113. data/web/assets/js/offline-manager.js +233 -0
  114. data/web/assets/js/service-worker-manager.js +65 -0
  115. data/web/index.html +159 -0
  116. data/web/sw.js +144 -0
  117. metadata +177 -18
  118. data/lib/lepus/consumer_config.rb +0 -149
  119. data/lib/lepus/consumer_wrapper.rb +0 -46
  120. data/lib/lepus/lifecycle_hooks.rb +0 -49
  121. data/lib/lepus/middlewares/honeybadger.rb +0 -23
  122. data/lib/lepus/middlewares/json.rb +0 -35
  123. data/lib/lepus/middlewares/max_retry.rb +0 -57
  124. data/lib/lepus/processes/consumer.rb +0 -113
  125. data/lib/lepus/supervisor/config.rb +0 -45
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aecb8b8247c618b92702f4d38ddd12662dbb5e8d4b1c18782796ab7caf790c6b
4
- data.tar.gz: 3da8d288fad18c9174db8e18c989e1f6e861d0ced3116e6ea20c6ce892d80f53
3
+ metadata.gz: 79f0f6758c114b63fdc54298ffe89a0d314fde163f38603632fd249d4136c5e3
4
+ data.tar.gz: a644ff3638a8be640d79c625fa8ce338cc15ab838cd12c731833716e6324775e
5
5
  SHA512:
6
- metadata.gz: eb553b2b3b980b9d64c5a04f9c4c56634003e7f3e850b17a2437343ebc9834019d5778673e891ce2f0ec8abec02b2f54155fbf5b3c9766a80348497139a47995
7
- data.tar.gz: cbea89d36fffc882720d0f148549c39a5f0d7211ff38035218e387549c14d2a716012ddafa616599c4e819a6346ccb5b9ed794c8b73369aaf5e223af6dc0449e
6
+ metadata.gz: e607ed235f468663e71dddedd6aaed1953ef7aaa4a265cbd92454354fa1a2cd60a3495b243c750d89055db2dced9eda7eb97068aa0785c0f2d6347ed55b8908f
7
+ data.tar.gz: c54bbaf33e0dda1cbe46a81fb2756623c49ef1c8bdeefdc5ebae9ba988c3b8c7dfc7d00da5ec14cbbede7e8ff47c3d2e241b4244ef8db0bc67b4c7240f639bf3
@@ -0,0 +1,21 @@
1
+ name: Linter
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ jobs:
10
+ rubocop:
11
+ name: "Rubocop"
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: ruby/setup-ruby@v1
16
+ with:
17
+ ruby-version: "3.0"
18
+ bundler-cache: true
19
+ - name: Run rubocop
20
+ run: |
21
+ bundle exec rubocop --parallel
@@ -2,23 +2,93 @@ name: Specs
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [ master ]
5
+ branches: [ main ]
6
6
  pull_request:
7
- branches: [ master ]
7
+ branches: [ main ]
8
8
 
9
9
  jobs:
10
- test:
10
+ ruby-2-7:
11
11
  runs-on: ubuntu-latest
12
12
  strategy:
13
13
  fail-fast: false
14
14
  matrix:
15
- ruby: ['2.7', '3.0']
15
+ ruby-version:
16
+ - "2.7"
16
17
  gemfile:
17
18
  - Gemfile
18
- - gemfiles/rails61.gemfile
19
- name: ${{ matrix.ruby }}-${{ matrix.gemfile }}
19
+ - gemfiles/Gemfile.rails-5.2
20
+ name: ${{ matrix.ruby-version }}-${{ matrix.gemfile }}
20
21
  env:
21
22
  BUNDLE_GEMFILE: ${{ matrix.gemfile }}
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: ruby/setup-ruby@v1
26
+ with:
27
+ ruby-version: ${{ matrix.ruby-version }}
28
+ bundler-cache: true
29
+ - name: Install dependencies
30
+ run: bundle install --jobs 4 --retry 3
31
+ - name: Run tests
32
+ run: bundle exec rspec
33
+
34
+ ruby-3-0:
35
+ runs-on: ubuntu-latest
36
+ strategy:
37
+ fail-fast: false
38
+ matrix:
39
+ ruby-version:
40
+ - "3.0"
41
+ - "3.1"
42
+ gemfile:
43
+ - Gemfile
44
+ - gemfiles/Gemfile.rails-6.1
45
+
46
+ name: ${{ matrix.ruby-version }}-${{ matrix.gemfile }}
47
+ env:
48
+ BUNDLE_GEMFILE: ${{ matrix.gemfile }}
49
+ steps:
50
+ - uses: actions/checkout@v4
51
+ - uses: ruby/setup-ruby@v1
52
+ with:
53
+ ruby-version: ${{ matrix.ruby-version }}
54
+ bundler-cache: true
55
+ - name: Install dependencies
56
+ run: bundle install --jobs 4 --retry 3
57
+ - name: Run tests
58
+ run: bundle exec rspec
59
+
60
+ ruby-3-2:
61
+ runs-on: ubuntu-latest
62
+ strategy:
63
+ fail-fast: false
64
+ matrix:
65
+ ruby-version:
66
+ - "3.2"
67
+ - "3.3"
68
+ - "3.4"
69
+ gemfile:
70
+ - gemfiles/Gemfile.rails-7.2
71
+ - gemfiles/Gemfile.rails-8.0
72
+
73
+ name: ${{ matrix.ruby-version }}-${{ matrix.gemfile }}
74
+ env:
75
+ BUNDLE_GEMFILE: ${{ matrix.gemfile }}
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+ - uses: ruby/setup-ruby@v1
79
+ with:
80
+ ruby-version: ${{ matrix.ruby-version }}
81
+ bundler-cache: true
82
+ - name: Install dependencies
83
+ run: bundle install --jobs 4 --retry 3
84
+ - name: Run tests
85
+ run: bundle exec rspec
86
+
87
+ integration:
88
+ runs-on: ubuntu-latest
89
+ name: integration-tests
90
+ env:
91
+ BUNDLE_GEMFILE: gemfiles/Gemfile.rails-8.0
22
92
  services:
23
93
  rabbitmq:
24
94
  image: rabbitmq:3-management
@@ -30,15 +100,25 @@ jobs:
30
100
  ports:
31
101
  - 5672:5672
32
102
  - 15672:15672
103
+ redis:
104
+ image: redis:7-alpine
105
+ options: >-
106
+ --health-cmd "redis-cli ping"
107
+ --health-interval 10s
108
+ --health-timeout 5s
109
+ --health-retries 5
110
+ ports:
111
+ - 6379:6379
33
112
  steps:
34
113
  - uses: actions/checkout@v4
35
114
  - uses: ruby/setup-ruby@v1
36
115
  with:
37
- ruby-version: ${{ matrix.ruby }}
116
+ ruby-version: "3.4"
38
117
  bundler-cache: true
39
- - name: Install dependencies
40
- run: bundle install
41
- - name: Run tests
42
- run: bundle exec rspec
43
- env:
44
- RABBITMQ_URL: amqp://localhost:5672
118
+ - name: Install dependencies
119
+ run: bundle install --jobs 4 --retry 3
120
+ - name: Run integration tests
121
+ run: bundle exec rspec --tag integration
122
+ env:
123
+ RABBITMQ_URL: amqp://localhost:5672
124
+ REDIS_URL: redis://localhost:6379
data/.gitignore CHANGED
@@ -10,3 +10,5 @@
10
10
  /tmp/
11
11
  *.gem
12
12
  /app/consumers/
13
+ /web/test/
14
+ /*.md
data/.rubocop.yml CHANGED
@@ -33,3 +33,13 @@ RSpec/MessageSpies:
33
33
 
34
34
  RSpec/StubbedMock:
35
35
  Enabled: false
36
+
37
+ RSpec/AnyInstance:
38
+ Enabled: false
39
+
40
+ RSpec/SubjectStub:
41
+ Enabled: false
42
+
43
+ RSpec/DescribeClass:
44
+ Exclude:
45
+ - "spec/integration/**/*"
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 2.7.8
1
+ ruby 3.2
data/Gemfile CHANGED
@@ -4,3 +4,10 @@ source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in lepus.gemspec
6
6
  gemspec
7
+
8
+ gem "connection_pool", "< 3"
9
+
10
+ # prometheus_exporter 2.1.1+ requires Ruby 3.0+; 2.3+ requires Ruby 3.2+.
11
+ # The CI matrix runs this Gemfile on Ruby 2.7 and 3.0, so pin to a version
12
+ # compatible across the matrix.
13
+ gem "prometheus_exporter", "= 2.1.0"
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lepus (0.0.1.beta2)
4
+ lepus (0.1.0)
5
+ base64
5
6
  bunny
6
7
  concurrent-ruby
7
8
  multi_json
@@ -13,18 +14,24 @@ GEM
13
14
  specs:
14
15
  addressable (2.8.7)
15
16
  public_suffix (>= 2.0.2, < 7.0)
16
- amq-protocol (2.3.2)
17
+ amq-protocol (2.5.1)
17
18
  ast (2.4.2)
19
+ base64 (0.3.0)
18
20
  bigdecimal (3.1.8)
19
- bunny (2.23.0)
20
- amq-protocol (~> 2.3, >= 2.3.1)
21
+ bunny (2.24.0)
22
+ amq-protocol (~> 2.3)
21
23
  sorted_set (~> 1, >= 1.0.2)
22
24
  coderay (1.1.3)
23
- concurrent-ruby (1.3.5)
25
+ concurrent-ruby (1.3.6)
26
+ connection_pool (2.5.5)
24
27
  crack (1.0.0)
25
28
  bigdecimal
26
29
  rexml
30
+ de-dupe (0.0.2)
31
+ redis
32
+ zeitwerk
27
33
  diff-lcs (1.5.1)
34
+ docile (1.4.1)
28
35
  dotenv (2.8.1)
29
36
  hashdiff (1.1.1)
30
37
  json (2.7.5)
@@ -36,13 +43,22 @@ GEM
36
43
  parser (3.3.5.0)
37
44
  ast (~> 2.4.1)
38
45
  racc
46
+ prometheus_exporter (2.1.0)
47
+ webrick
39
48
  pry (0.14.2)
40
49
  coderay (~> 1.1)
41
50
  method_source (~> 1.0)
42
51
  public_suffix (5.1.1)
43
52
  racc (1.8.1)
53
+ rack (3.2.1)
54
+ rack-test (2.2.0)
55
+ rack (>= 1.3)
44
56
  rainbow (3.1.1)
45
57
  rbtree (0.4.6)
58
+ redis (5.4.1)
59
+ redis-client (>= 0.22.0)
60
+ redis-client (0.27.0)
61
+ connection_pool
46
62
  regexp_parser (2.9.2)
47
63
  rexml (3.3.9)
48
64
  rspec (3.13.0)
@@ -77,10 +93,14 @@ GEM
77
93
  rubocop-rspec (3.2.0)
78
94
  rubocop (~> 1.61)
79
95
  ruby-progressbar (1.13.0)
80
- set (1.0.4)
81
- sorted_set (1.0.3)
96
+ simplecov (0.22.0)
97
+ docile (~> 1.1)
98
+ simplecov-html (~> 0.11)
99
+ simplecov_json_formatter (~> 0.1)
100
+ simplecov-html (0.13.2)
101
+ simplecov_json_formatter (0.1.4)
102
+ sorted_set (1.1.0)
82
103
  rbtree
83
- set (~> 1.0)
84
104
  standard (1.37.0)
85
105
  language_server-protocol (~> 3.17.0.2)
86
106
  lint_roller (~> 1.0)
@@ -93,12 +113,13 @@ GEM
93
113
  standard-performance (1.4.0)
94
114
  lint_roller (~> 1.1)
95
115
  rubocop-performance (~> 1.21.0)
96
- thor (1.3.2)
116
+ thor (1.5.0)
97
117
  unicode-display_width (2.6.0)
98
118
  webmock (3.24.0)
99
119
  addressable (>= 2.8.0)
100
120
  crack (>= 0.3.2)
101
121
  hashdiff (>= 0.4.0, < 2.0.0)
122
+ webrick (1.9.2)
102
123
  zeitwerk (2.6.18)
103
124
 
104
125
  PLATFORMS
@@ -106,13 +127,19 @@ PLATFORMS
106
127
  x86_64-linux
107
128
 
108
129
  DEPENDENCIES
130
+ connection_pool (< 3)
131
+ de-dupe
109
132
  dotenv
110
133
  lepus!
134
+ prometheus_exporter (= 2.1.0)
111
135
  pry
136
+ rack (>= 2.2)
137
+ rack-test
112
138
  rspec
113
139
  rubocop
114
140
  rubocop-performance
115
141
  rubocop-rspec
142
+ simplecov
116
143
  standard
117
144
  webmock
118
145
 
data/Makefile ADDED
@@ -0,0 +1,19 @@
1
+ .PHONY: lock lock-conservative
2
+
3
+ DOCKER_RUN = docker run --rm -v "$(CURDIR)":/app -w /app
4
+
5
+ # Update all lockfiles (conservative - only add new gems, no upgrades)
6
+ lock-conservative:
7
+ $(DOCKER_RUN) ruby:2.7 bash -c "gem install bundler:2.3.22 && bundle lock --conservative"
8
+ $(DOCKER_RUN) ruby:2.7 bash -c "gem install bundler:2.3.22 && BUNDLE_GEMFILE=gemfiles/Gemfile.rails-5.2 bundle lock --conservative"
9
+ $(DOCKER_RUN) ruby:3.1 bash -c "BUNDLE_GEMFILE=gemfiles/Gemfile.rails-6.1 bundle lock --conservative"
10
+ BUNDLE_GEMFILE=gemfiles/Gemfile.rails-7.2 bundle lock --conservative
11
+ BUNDLE_GEMFILE=gemfiles/Gemfile.rails-8.0 bundle lock --conservative
12
+
13
+ # Update all lockfiles (full update - may upgrade gems)
14
+ lock:
15
+ $(DOCKER_RUN) ruby:2.7 bash -c "gem install bundler:2.3.22 && bundle lock --update"
16
+ $(DOCKER_RUN) ruby:2.7 bash -c "gem install bundler:2.3.22 && BUNDLE_GEMFILE=gemfiles/Gemfile.rails-5.2 bundle lock --update"
17
+ $(DOCKER_RUN) ruby:3.1 bash -c "BUNDLE_GEMFILE=gemfiles/Gemfile.rails-6.1 bundle lock --update"
18
+ BUNDLE_GEMFILE=gemfiles/Gemfile.rails-7.2 bundle lock --update
19
+ BUNDLE_GEMFILE=gemfiles/Gemfile.rails-8.0 bundle lock --update