snfoil 0.9.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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