snfoil 0.9.0 → 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 +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/{sn_foil → snfoil}/adapters/orms/active_record.rb +14 -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 +100 -33
  27. data/Rakefile +0 -4
  28. data/lib/sn_foil/context.rb +0 -24
  29. data/lib/sn_foil/contexts/build_context.rb +0 -67
  30. data/lib/sn_foil/contexts/change_context.rb +0 -101
  31. data/lib/sn_foil/contexts/create_context.rb +0 -158
  32. data/lib/sn_foil/contexts/destroy_context.rb +0 -164
  33. data/lib/sn_foil/contexts/index_context.rb +0 -64
  34. data/lib/sn_foil/contexts/setup_context.rb +0 -119
  35. data/lib/sn_foil/contexts/show_context.rb +0 -61
  36. data/lib/sn_foil/contexts/update_context.rb +0 -168
  37. data/lib/sn_foil/policy.rb +0 -55
  38. data/lib/sn_foil/searcher.rb +0 -123
  39. data/lib/sn_foil/version.rb +0 -5
  40. data/lib/sn_foil.rb +0 -49
@@ -1,123 +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.map do |key, value|
103
- value = if booleans.include?(key.to_sym)
104
- value_to_boolean(value)
105
- else
106
- value
107
- end
108
- [key, value]
109
- end.to_h
110
- end
111
-
112
- def value_to_boolean(value)
113
- string_val = value.to_s
114
- if value == true || %w[true 1].include?(string_val)
115
- true
116
- elsif value == false || %w[false 0].include?(string_val)
117
- false
118
- else
119
- value
120
- end
121
- end
122
- end
123
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SnFoil
4
- VERSION = '0.9.0'
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