snfoil 0.9.1 → 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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE.txt +201 -0
  5. data/README.md +95 -505
  6. data/docs/build-context.md +56 -0
  7. data/docs/create-context.md +109 -0
  8. data/docs/destroy-context.md +102 -0
  9. data/docs/index-context.md +70 -0
  10. data/docs/show-context.md +71 -0
  11. data/docs/update-context.md +107 -0
  12. data/lib/snfoil/adapters/orms/active_record.rb +46 -0
  13. data/lib/{sn_foil → snfoil}/adapters/orms/base_adapter.rb +15 -1
  14. data/lib/snfoil/crud/build_context.rb +49 -0
  15. data/lib/snfoil/crud/change_context.rb +48 -0
  16. data/lib/snfoil/crud/context.rb +41 -0
  17. data/lib/snfoil/crud/create_context.rb +45 -0
  18. data/lib/snfoil/crud/destroy_context.rb +57 -0
  19. data/lib/snfoil/crud/index_context.rb +46 -0
  20. data/lib/snfoil/crud/setup_context.rb +90 -0
  21. data/lib/snfoil/crud/show_context.rb +52 -0
  22. data/lib/snfoil/crud/update_context.rb +60 -0
  23. data/lib/snfoil/version.rb +19 -0
  24. data/lib/snfoil.rb +69 -0
  25. data/snfoil.gemspec +47 -0
  26. metadata +205 -23
  27. data/Rakefile +0 -4
  28. data/lib/sn_foil/adapters/orms/active_record.rb +0 -32
  29. data/lib/sn_foil/context.rb +0 -24
  30. data/lib/sn_foil/contexts/build_context.rb +0 -68
  31. data/lib/sn_foil/contexts/change_context.rb +0 -101
  32. data/lib/sn_foil/contexts/create_context.rb +0 -158
  33. data/lib/sn_foil/contexts/destroy_context.rb +0 -165
  34. data/lib/sn_foil/contexts/index_context.rb +0 -64
  35. data/lib/sn_foil/contexts/setup_context.rb +0 -119
  36. data/lib/sn_foil/contexts/show_context.rb +0 -62
  37. data/lib/sn_foil/contexts/update_context.rb +0 -169
  38. data/lib/sn_foil/policy.rb +0 -55
  39. data/lib/sn_foil/searcher.rb +0 -119
  40. data/lib/sn_foil/version.rb +0 -5
  41. data/lib/sn_foil.rb +0 -49
@@ -1,119 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/concern'
4
-
5
- module SnFoil
6
- module Searcher
7
- extend ActiveSupport::Concern
8
-
9
- class_methods do
10
- attr_reader :i_model, :i_setup, :i_filters, :i_search_step, :i_booleans
11
-
12
- def model(klass = nil)
13
- @i_model = klass
14
- end
15
-
16
- def setup(setup_method = nil, &setup_block)
17
- @i_setup = setup_method || setup_block
18
- end
19
-
20
- def filter(method = nil, **options, &block)
21
- raise ArgumentError, 'filter requires either a method name or a block' if method.nil? && block.nil?
22
-
23
- (@i_filters ||= []) << {
24
- method: method,
25
- block: block,
26
- if: options[:if],
27
- unless: options[:unless]
28
- }
29
- end
30
-
31
- def booleans(*fields)
32
- @i_booleans ||= []
33
- @i_booleans |= fields.map(&:to_sym)
34
- end
35
- end
36
-
37
- def model
38
- self.class.i_model
39
- end
40
-
41
- attr_reader :scope
42
-
43
- def initialize(scope: nil)
44
- @scope = scope || model.all
45
- end
46
-
47
- def search(params = {})
48
- params = transform_params_booleans(params) # this is required for params coming in from http-like sources
49
- filtered_scope = filter || scope # start usimg the default scope of the class or the filter method
50
- filtered_scope = apply_setup(filtered_scope, params)
51
- apply_filters(filtered_scope, params)
52
- end
53
-
54
- def filter; end
55
-
56
- def setup
57
- self.class.i_setup
58
- end
59
-
60
- def filters
61
- self.class.i_filters || []
62
- end
63
-
64
- def booleans
65
- self.class.i_booleans || []
66
- end
67
-
68
- private
69
-
70
- def apply_setup(filtered_scope, params)
71
- return filtered_scope if setup.nil?
72
-
73
- if setup.is_a?(Symbol) || setup.is_a?(String)
74
- send(setup, filtered_scope, params)
75
- else
76
- instance_exec filtered_scope, params, &setup
77
- end
78
- end
79
-
80
- def apply_filters(filtered_scope, params)
81
- filters&.reduce(filtered_scope) do |i_scope, i_filter|
82
- apply_filter(i_filter, i_scope, params)
83
- end
84
- end
85
-
86
- def apply_filter(i_filter, filtered_scope, params)
87
- return filtered_scope unless filter_valid?(i_filter, params)
88
-
89
- return send(i_filter[:method], filtered_scope, params) if i_filter[:method]
90
-
91
- instance_exec filtered_scope, params, &i_filter[:block]
92
- end
93
-
94
- def filter_valid?(i_filter, params)
95
- return false if !i_filter[:if].nil? && i_filter[:if].call(params) == false
96
- return false if !i_filter[:unless].nil? && i_filter[:unless].call(params) == true
97
-
98
- true
99
- end
100
-
101
- def transform_params_booleans(params)
102
- params.to_h do |key, value|
103
- value = value_to_boolean(value) if booleans.include?(key.to_sym)
104
- [key, value]
105
- end
106
- end
107
-
108
- def value_to_boolean(value)
109
- string_val = value.to_s
110
- if value == true || %w[true 1].include?(string_val)
111
- true
112
- elsif value == false || %w[false 0].include?(string_val)
113
- false
114
- else
115
- value
116
- end
117
- end
118
- end
119
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SnFoil
4
- VERSION = '0.9.1'
5
- end
data/lib/sn_foil.rb DELETED
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'sn_foil/version'
4
- require_relative 'sn_foil/contexts/build_context'
5
- require_relative 'sn_foil/contexts/index_context'
6
- require_relative 'sn_foil/contexts/show_context'
7
- require_relative 'sn_foil/contexts/create_context'
8
- require_relative 'sn_foil/contexts/update_context'
9
- require_relative 'sn_foil/contexts/destroy_context'
10
- require_relative 'sn_foil/context'
11
- require_relative 'sn_foil/policy'
12
- require_relative 'sn_foil/searcher'
13
- require_relative 'sn_foil/adapters/orms/base_adapter'
14
- require_relative 'sn_foil/adapters/orms/active_record'
15
- require 'active_support/core_ext/module/attribute_accessors'
16
- require 'logger'
17
-
18
- module SnFoil
19
- class Error < StandardError; end
20
-
21
- mattr_accessor :orm, default: 'active_record'
22
- mattr_writer :logger
23
-
24
- class << self
25
- def logger
26
- @logger ||= Logger.new($stdout).tap do |log|
27
- log.progname = name
28
- end
29
- end
30
-
31
- def adapter
32
- return @adapter if @adapter
33
-
34
- @adapter ||= if orm.instance_of?(String) || orm.instance_of?(Symbol)
35
- if Object.const_defined?("SnFoil::Adapters::ORMs::#{orm.camelcase}")
36
- "SnFoil::Adapters::ORMs::#{orm.camelcase}".constantize
37
- else
38
- orm.constantize
39
- end
40
- else
41
- orm
42
- end
43
- end
44
-
45
- def configure
46
- yield self
47
- end
48
- end
49
- end