workarea-circuit_breaker 1.0.3

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 (76) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  3. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.github/workflows/ci.yml +66 -0
  6. data/.gitignore +20 -0
  7. data/.rubocop.yml +2 -0
  8. data/.stylelintrc.json +8 -0
  9. data/CHANGELOG.md +54 -0
  10. data/Gemfile +12 -0
  11. data/LICENSE +52 -0
  12. data/README.md +103 -0
  13. data/Rakefile +59 -0
  14. data/app/assets/stylesheets/circuit_breaker/.keep +0 -0
  15. data/app/controllers/workarea/admin/circuits_controller.rb +26 -0
  16. data/app/view_models/workarea/admin/circuit_view_model.rb +33 -0
  17. data/app/view_models/workarea/admin/circuits_view_model.rb +41 -0
  18. data/app/views/workarea/admin/circuits/index.html.haml +69 -0
  19. data/app/views/workarea/admin/shared/_circuit_breaker_link.html.haml +1 -0
  20. data/bin/rails +25 -0
  21. data/config/initializers/appends.rb +4 -0
  22. data/config/initializers/workarea.rb +11 -0
  23. data/config/locales/en.yml +29 -0
  24. data/config/routes.rb +10 -0
  25. data/lib/workarea/circuit_breaker.rb +96 -0
  26. data/lib/workarea/circuit_breaker/circuit.rb +137 -0
  27. data/lib/workarea/circuit_breaker/engine.rb +12 -0
  28. data/lib/workarea/circuit_breaker/failure_message.rb +51 -0
  29. data/lib/workarea/circuit_breaker/version.rb +5 -0
  30. data/script/admin_ci +5 -0
  31. data/script/ci +8 -0
  32. data/script/core_ci +5 -0
  33. data/script/plugins_ci +5 -0
  34. data/script/storefront_ci +5 -0
  35. data/test/dummy/.ruby-version +1 -0
  36. data/test/dummy/Rakefile +6 -0
  37. data/test/dummy/bin/bundle +3 -0
  38. data/test/dummy/bin/rails +4 -0
  39. data/test/dummy/bin/rake +4 -0
  40. data/test/dummy/bin/setup +28 -0
  41. data/test/dummy/bin/update +28 -0
  42. data/test/dummy/bin/yarn +11 -0
  43. data/test/dummy/config.ru +5 -0
  44. data/test/dummy/config/application.rb +33 -0
  45. data/test/dummy/config/boot.rb +5 -0
  46. data/test/dummy/config/environment.rb +5 -0
  47. data/test/dummy/config/environments/development.rb +52 -0
  48. data/test/dummy/config/environments/production.rb +83 -0
  49. data/test/dummy/config/environments/test.rb +45 -0
  50. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  51. data/test/dummy/config/initializers/assets.rb +14 -0
  52. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  53. data/test/dummy/config/initializers/content_security_policy.rb +25 -0
  54. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  55. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  56. data/test/dummy/config/initializers/inflections.rb +16 -0
  57. data/test/dummy/config/initializers/mime_types.rb +4 -0
  58. data/test/dummy/config/initializers/workarea.rb +5 -0
  59. data/test/dummy/config/initializers/wrap_parameters.rb +9 -0
  60. data/test/dummy/config/locales/en.yml +33 -0
  61. data/test/dummy/config/puma.rb +34 -0
  62. data/test/dummy/config/routes.rb +5 -0
  63. data/test/dummy/config/secrets.yml +33 -0
  64. data/test/dummy/config/spring.rb +6 -0
  65. data/test/dummy/db/seeds.rb +2 -0
  66. data/test/dummy/lib/assets/.keep +0 -0
  67. data/test/dummy/log/.keep +0 -0
  68. data/test/integration/workarea/admin/circuits_integration_test.rb +27 -0
  69. data/test/lib/workarea/circuit_breaker/circuit_test.rb +135 -0
  70. data/test/lib/workarea/circuit_breaker/failure_message_test.rb +41 -0
  71. data/test/lib/workarea/circuit_breaker_test.rb +42 -0
  72. data/test/support/circuit_breaker_support.rb +16 -0
  73. data/test/teaspoon_env.rb +6 -0
  74. data/test/test_helper.rb +15 -0
  75. data/workarea-circuit_breaker.gemspec +17 -0
  76. metadata +151 -0
@@ -0,0 +1,42 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class CircuitBreakerTest < Workarea::TestCase
5
+ def test_add_service
6
+ Workarea.with_config do |config|
7
+ CircuitBreaker.add_service(:fake_service)
8
+
9
+ assert(config.circuit_breaker.circuits.has_key?("fake_service"))
10
+ end
11
+ end
12
+
13
+ def test_brackets
14
+ Workarea.with_config do |_config|
15
+ options = { max_fails: 3, window: 5.minutes, break_for: 5.minutes }
16
+ CircuitBreaker.add_service(:fake_service, **options)
17
+
18
+ circuit = CircuitBreaker[:fake_service]
19
+
20
+ assert_equal("fake_service", circuit.name)
21
+ assert_equal(options, circuit.options)
22
+ end
23
+ end
24
+
25
+ if running_from_source?
26
+ def test_config_is_frozen
27
+ Workarea::CircuitBreaker.freeze_config!
28
+
29
+ assert(Workarea.config.circuit_breaker.frozen?)
30
+ assert(Workarea.config.circuit_breaker.circuits.frozen?)
31
+ assert(Workarea.config.circuit_breaker.circuit_defaults.frozen?)
32
+ end
33
+ end
34
+
35
+ def test_capture_exception_returns_nil_when_capture_disallowed
36
+ error = StandardError.new("This will not be captured.")
37
+ event = CircuitBreaker.capture_exception(error)
38
+
39
+ assert_nil(event)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,16 @@
1
+ module Workarea
2
+ module CircuitBreakerSupport
3
+ def with_connection_pool_timeouts(&block)
4
+ @_original_pool = CircuitBreaker.redis
5
+ timeout_pool = ConnectionPool.new(timeout: 0, size: 0) do
6
+ Redis.new(url: Workarea::Configuration::Redis.persistent.to_url)
7
+ end
8
+ CircuitBreaker.instance_variable_set(:@redis, timeout_pool)
9
+
10
+ block.call
11
+
12
+ ensure
13
+ CircuitBreaker.instance_variable_set(:@redis, @_original_pool)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ require 'workarea/testing/teaspoon'
2
+
3
+ Teaspoon.configure do |config|
4
+ config.root = Workarea::CircuitBreaker::Engine.root
5
+ Workarea::Teaspoon.apply(config)
6
+ end
@@ -0,0 +1,15 @@
1
+ require 'simplecov'
2
+ SimpleCov.start 'rails' do
3
+ add_filter 'lib/workarea/circuit_breaker/version.rb'
4
+ end
5
+
6
+ # Configure Rails Environment
7
+ ENV['RAILS_ENV'] = 'test'
8
+
9
+ require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
10
+ require 'rails/test_help'
11
+ require 'workarea/test_help'
12
+
13
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
14
+ # to be shown.
15
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
@@ -0,0 +1,17 @@
1
+ $:.push File.expand_path("lib", __dir__)
2
+
3
+ require "workarea/circuit_breaker/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "workarea-circuit_breaker"
7
+ s.version = Workarea::CircuitBreaker::VERSION
8
+ s.authors = ["Eric Pigeon"]
9
+ s.email = ["epigeon@weblinc.com"]
10
+ s.summary = "Circuit breaker library for Workarea"
11
+ s.description = "Small libray to implement circuit breaker design pattern around external service calls"
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+
15
+ s.add_dependency 'workarea', '~> 3.x'
16
+ s.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.2'
17
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: workarea-circuit_breaker
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Eric Pigeon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-03-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: workarea
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.x
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.x
27
+ - !ruby/object:Gem::Dependency
28
+ name: connection_pool
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.2'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 2.2.2
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '2.2'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.2.2
47
+ description: Small libray to implement circuit breaker design pattern around external
48
+ service calls
49
+ email:
50
+ - epigeon@weblinc.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
56
+ - ".github/ISSUE_TEMPLATE/documentation-request.md"
57
+ - ".github/ISSUE_TEMPLATE/feature_request.md"
58
+ - ".github/workflows/ci.yml"
59
+ - ".gitignore"
60
+ - ".rubocop.yml"
61
+ - ".stylelintrc.json"
62
+ - CHANGELOG.md
63
+ - Gemfile
64
+ - LICENSE
65
+ - README.md
66
+ - Rakefile
67
+ - app/assets/stylesheets/circuit_breaker/.keep
68
+ - app/controllers/workarea/admin/circuits_controller.rb
69
+ - app/view_models/workarea/admin/circuit_view_model.rb
70
+ - app/view_models/workarea/admin/circuits_view_model.rb
71
+ - app/views/workarea/admin/circuits/index.html.haml
72
+ - app/views/workarea/admin/shared/_circuit_breaker_link.html.haml
73
+ - bin/rails
74
+ - config/initializers/appends.rb
75
+ - config/initializers/workarea.rb
76
+ - config/locales/en.yml
77
+ - config/routes.rb
78
+ - lib/workarea/circuit_breaker.rb
79
+ - lib/workarea/circuit_breaker/circuit.rb
80
+ - lib/workarea/circuit_breaker/engine.rb
81
+ - lib/workarea/circuit_breaker/failure_message.rb
82
+ - lib/workarea/circuit_breaker/version.rb
83
+ - script/admin_ci
84
+ - script/ci
85
+ - script/core_ci
86
+ - script/plugins_ci
87
+ - script/storefront_ci
88
+ - test/dummy/.ruby-version
89
+ - test/dummy/Rakefile
90
+ - test/dummy/bin/bundle
91
+ - test/dummy/bin/rails
92
+ - test/dummy/bin/rake
93
+ - test/dummy/bin/setup
94
+ - test/dummy/bin/update
95
+ - test/dummy/bin/yarn
96
+ - test/dummy/config.ru
97
+ - test/dummy/config/application.rb
98
+ - test/dummy/config/boot.rb
99
+ - test/dummy/config/environment.rb
100
+ - test/dummy/config/environments/development.rb
101
+ - test/dummy/config/environments/production.rb
102
+ - test/dummy/config/environments/test.rb
103
+ - test/dummy/config/initializers/application_controller_renderer.rb
104
+ - test/dummy/config/initializers/assets.rb
105
+ - test/dummy/config/initializers/backtrace_silencers.rb
106
+ - test/dummy/config/initializers/content_security_policy.rb
107
+ - test/dummy/config/initializers/cookies_serializer.rb
108
+ - test/dummy/config/initializers/filter_parameter_logging.rb
109
+ - test/dummy/config/initializers/inflections.rb
110
+ - test/dummy/config/initializers/mime_types.rb
111
+ - test/dummy/config/initializers/workarea.rb
112
+ - test/dummy/config/initializers/wrap_parameters.rb
113
+ - test/dummy/config/locales/en.yml
114
+ - test/dummy/config/puma.rb
115
+ - test/dummy/config/routes.rb
116
+ - test/dummy/config/secrets.yml
117
+ - test/dummy/config/spring.rb
118
+ - test/dummy/db/seeds.rb
119
+ - test/dummy/lib/assets/.keep
120
+ - test/dummy/log/.keep
121
+ - test/integration/workarea/admin/circuits_integration_test.rb
122
+ - test/lib/workarea/circuit_breaker/circuit_test.rb
123
+ - test/lib/workarea/circuit_breaker/failure_message_test.rb
124
+ - test/lib/workarea/circuit_breaker_test.rb
125
+ - test/support/circuit_breaker_support.rb
126
+ - test/teaspoon_env.rb
127
+ - test/test_helper.rb
128
+ - workarea-circuit_breaker.gemspec
129
+ homepage:
130
+ licenses: []
131
+ metadata: {}
132
+ post_install_message:
133
+ rdoc_options: []
134
+ require_paths:
135
+ - lib
136
+ required_ruby_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ requirements: []
147
+ rubygems_version: 3.0.6
148
+ signing_key:
149
+ specification_version: 4
150
+ summary: Circuit breaker library for Workarea
151
+ test_files: []