active_admin_filter_extensions 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.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +42 -0
  3. data/.gitignore +7 -0
  4. data/.rspec +3 -0
  5. data/Gemfile +22 -0
  6. data/LICENSE +21 -0
  7. data/README.md +357 -0
  8. data/Rakefile +18 -0
  9. data/active_admin_filter_extensions.gemspec +29 -0
  10. data/config/locales/en.yml +10 -0
  11. data/lib/active_admin_filter_extensions/data_access.rb +22 -0
  12. data/lib/active_admin_filter_extensions/filter_defaults.rb +327 -0
  13. data/lib/active_admin_filter_extensions/filter_options.rb +70 -0
  14. data/lib/active_admin_filter_extensions/filters_form.rb +47 -0
  15. data/lib/active_admin_filter_extensions/notice.rb +38 -0
  16. data/lib/active_admin_filter_extensions/policies.rb +539 -0
  17. data/lib/active_admin_filter_extensions/redirect.rb +82 -0
  18. data/lib/active_admin_filter_extensions/required_filters.rb +83 -0
  19. data/lib/active_admin_filter_extensions/search_keys.rb +71 -0
  20. data/lib/active_admin_filter_extensions/version.rb +5 -0
  21. data/lib/active_admin_filter_extensions.rb +46 -0
  22. data/spec/data_access_spec.rb +252 -0
  23. data/spec/integration/extensions_container_spec.rb +38 -0
  24. data/spec/integration/filter_defaults_spec.rb +229 -0
  25. data/spec/integration/numeric_builtins_spec.rb +104 -0
  26. data/spec/integration/on_invalid_spec.rb +174 -0
  27. data/spec/integration/policies_spec.rb +204 -0
  28. data/spec/integration/redirect_spec.rb +204 -0
  29. data/spec/integration/require_any_filter_spec.rb +132 -0
  30. data/spec/integration/required_spec.rb +155 -0
  31. data/spec/integration/structural_keys_spec.rb +77 -0
  32. data/spec/integration/window_spec.rb +208 -0
  33. data/spec/integration/with_spec.rb +175 -0
  34. data/spec/rails_helper.rb +62 -0
  35. data/spec/redirect_install_spec.rb +27 -0
  36. data/spec/spec_helper.rb +68 -0
  37. data/spec/support/capybara_driver.rb +12 -0
  38. data/spec/support/rails_template.rb +637 -0
  39. data/tasks/test.rake +32 -0
  40. metadata +103 -0
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "active_admin_filter_extensions/redirect"
5
+
6
+ # ActiveAdmin.before_load fires on every dev-mode reload against the same non-reloaded gem
7
+ # classes, and Ruby runs the `included` hook on every include call even when the module is
8
+ # already in the ancestors - so the hook must not register its callback again.
9
+ RSpec.describe ActiveAdminFilterExtensions::Redirect do
10
+ let(:base) do
11
+ Class.new do
12
+ def self.registered_callbacks
13
+ @registered_callbacks ||= []
14
+ end
15
+
16
+ def self.before_action(*args, &block)
17
+ registered_callbacks << block
18
+ end
19
+ end
20
+ end
21
+
22
+ it "installs its callback once, however many times it is included" do
23
+ 3.times { base.include described_class }
24
+
25
+ expect(base.registered_callbacks.size).to eq(1)
26
+ end
27
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/object/blank"
4
+ require "active_support/core_ext/hash/indifferent_access"
5
+ require "active_support/hash_with_indifferent_access"
6
+ # Pure Ruby, no Active Admin boot required - `visible_filters` resolves `:if` / `:unless` with it.
7
+ require "active_admin/view_helpers/method_or_proc_helper"
8
+ require "active_admin_filter_extensions/data_access"
9
+ require "active_admin_filter_extensions/filter_options"
10
+ require "active_admin_filter_extensions/search_keys"
11
+ require "active_admin_filter_extensions/required_filters"
12
+ require "active_admin_filter_extensions/filter_defaults"
13
+ require "active_admin_filter_extensions/policies"
14
+
15
+ # `DataAccess` only needs `params`, `active_admin_config` and something that answers `ransack`.
16
+ # That lets the unit suite run without booting Active Admin or Rails; the integration suite in
17
+ # spec/integration exercises the real thing.
18
+ class FakeChain
19
+ attr_reader :ransacked_with
20
+
21
+ def ransack(params)
22
+ @ransacked_with = params
23
+ self
24
+ end
25
+
26
+ def result
27
+ self
28
+ end
29
+ end
30
+
31
+ class FakeController
32
+ # The resource settings the policy layer reads unconditionally in a real install.
33
+ Config = Struct.new(:filters) do
34
+ def require_any_filter_notice = nil
35
+ def default_filters_notice = nil
36
+ end
37
+
38
+ def self.before_action(*); end # the guard registers one; FakeController has no chain
39
+ def performed? = false
40
+
41
+ attr_reader :params, :active_admin_config
42
+
43
+ # Deriving a search key means building a Formtastic input, which needs Rails. What the input
44
+ # would answer is supplied here instead, so these examples cover the step above derivation -
45
+ # splitting a value across the keys - while spec/integration covers the derivation itself.
46
+ def initialize(params: {}, filters: {}, search_keys: {})
47
+ @params = ActiveSupport::HashWithIndifferentAccess.new(params)
48
+ @active_admin_config = Config.new(filters)
49
+ @search_keys = search_keys
50
+ end
51
+
52
+ # Plain override: FilterDefaults is included, so the class wins.
53
+ def filter_search_keys(attribute, _options)
54
+ @search_keys.fetch(attribute) { [attribute.to_s] }
55
+ end
56
+
57
+ prepend ActiveAdminFilterExtensions::DataAccess
58
+ include ActiveAdminFilterExtensions::Policies::Controller
59
+ include ActiveAdminFilterExtensions::FilterOptions
60
+ include ActiveAdminFilterExtensions::SearchKeys
61
+ include ActiveAdminFilterExtensions::RequiredFilters
62
+ include ActiveAdminFilterExtensions::FilterDefaults
63
+ end
64
+
65
+ RSpec.configure do |config|
66
+ config.disable_monkey_patching!
67
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
68
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "capybara/cuprite"
4
+
5
+ Capybara.server = :webrick
6
+ Capybara.register_driver :cuprite do |app|
7
+ # Ferrum waits 10 seconds by default for Chrome to report its websocket URL, which a cold CI
8
+ # runner does not always manage.
9
+ Capybara::Cuprite::Driver.new(app, headless: true, window_size: [1280, 800], process_timeout: 60)
10
+ end
11
+ Capybara.javascript_driver = :cuprite
12
+ Capybara.default_max_wait_time = 5