snfoil 0.3.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f4c3c6c2bbf6b1d288ee5f82144854abeecad67d8d4f62bd59855daf19ebe8e
4
- data.tar.gz: cfb7ba55d479ed8998418d4038ed12874f7463c1102fdb53e1f276edb12ef648
3
+ metadata.gz: '08550dd2ea79c81a206bd765375d240a28ff5fadc734c279cbace455ae617650'
4
+ data.tar.gz: 934a30ee35d2c6e07f739e0e01c219efcbb6e9bb782b341477a70b06f51a60fd
5
5
  SHA512:
6
- metadata.gz: 6c2b4ef73d0dee5473903e3063a9472c4ba58f6715514711305ab19854135f8c16d4eecf3c7e00bb450b540ef81579c773bcd62f34d585c1ad046d5fa9803b59
7
- data.tar.gz: 0e3d98d0275a02396381d1a7e63e32be803f792fde4ddcd4432d43eba642ed96bc3e35f5c79d1a831a799d21c9b68b41757699d9c280b14a8a7819b810a5a1a5
6
+ metadata.gz: 96ac100420b4276442ccc955cfb5b35f93ea60bd11af4fdb4725b0e6a0a307e67391016dbab97cdeffc3af0532d419526138cb3770d76c1e8ed4388813fbc66a
7
+ data.tar.gz: f8d3cb25b57174aeea76be073d9a37b6fb12862cd0e6b5986468d33051038e84412315221db13a26d5a5f1b9e5b61d4143afcd10620045f69bb8a00420ad30b9
@@ -0,0 +1,74 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age, body
8
+ size, disability, ethnicity, gender identity and expression, level of experience,
9
+ nationality, personal appearance, race, religion, or sexual identity and
10
+ orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an appointed
52
+ representative at an online or offline event. Representation of a project may be
53
+ further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at howeszy@gmail.com. All
59
+ complaints will be reviewed and investigated and will result in a response that
60
+ is deemed necessary and appropriate to the circumstances. The project team is
61
+ obligated to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at [http://contributor-covenant.org/version/1/4][version]
72
+
73
+ [homepage]: http://contributor-covenant.org
74
+ [version]: http://contributor-covenant.org/version/1/4/
data/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # Sn::Foil
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/sn_foil`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'snfoil'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install snfoil
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/snfoil. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
40
+
41
+ ## Code of Conduct
42
+
43
+ Everyone interacting in the Sn::Foil project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/snfoil/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ task default: :spec
@@ -12,15 +12,22 @@ module SnFoil
12
12
  include SetupContext
13
13
  end
14
14
 
15
- class_methods do
16
- attr_reader :i_params, :i_before_change_hooks, :i_after_change_hooks, :i_after_change_success_hooks, :i_after_change_failure_hooks
15
+ class_methods do # rubocop:disable Metrics/BlockLength
16
+ attr_reader :i_params, :i_setup_change_hooks, :i_before_change_hooks, :i_after_change_hooks,
17
+ :i_after_change_success_hooks, :i_after_change_failure_hooks
17
18
  def params(*whitelisted_params)
18
19
  @i_params ||= []
19
20
  @i_params |= whitelisted_params
20
21
  end
21
22
 
23
+ def setup_change(method = nil, **options, &block)
24
+ raise ArgumentError, '#setup_change requires either a method name or a block' if method.nil? && block.nil?
25
+
26
+ (@i_setup_change_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
27
+ end
28
+
22
29
  def before_change(method = nil, **options, &block)
23
- raise ArgumentError, '#on_change requires either a method name or a block' if method.nil? && block.nil?
30
+ raise ArgumentError, '#before_change requires either a method name or a block' if method.nil? && block.nil?
24
31
 
25
32
  (@i_before_change_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
26
33
  end
@@ -69,6 +76,10 @@ module SnFoil
69
76
  options
70
77
  end
71
78
 
79
+ def setup_change_hooks
80
+ self.class.i_setup_change_hooks || []
81
+ end
82
+
72
83
  def before_change_hooks
73
84
  self.class.i_before_change_hooks || []
74
85
  end
@@ -84,21 +95,6 @@ module SnFoil
84
95
  def after_change_failure_hooks
85
96
  self.class.i_after_change_failure_hooks || []
86
97
  end
87
-
88
- def run_hook(hook, **options)
89
- return options unless hook_valid?(hook, **options)
90
-
91
- return send(hook[:method], **options) if hook[:method]
92
-
93
- instance_exec options, &hook[:block]
94
- end
95
-
96
- def hook_valid?(hook, **options)
97
- return false if !hook[:if].nil? && hook[:if].call(options) == false
98
- return false if !hook[:unless].nil? && hook[:unless].call(options) == true
99
-
100
- true
101
- end
102
98
  end
103
99
  end
104
100
  end
@@ -15,13 +15,20 @@ module SnFoil
15
15
  end
16
16
 
17
17
  class_methods do
18
- attr_reader :i_before_create_hooks, :i_after_create_hooks, :i_after_create_success_hooks, :i_after_create_failure_hooks
18
+ attr_reader :i_setup_create_hooks, :i_before_create_hooks, :i_after_create_hooks,
19
+ :i_after_create_success_hooks, :i_after_create_failure_hooks
19
20
  def create(params:, user: nil, **options)
20
21
  new(user).create(**options, params: params)
21
22
  end
22
23
 
24
+ def setup_create(method = nil, **options, &block)
25
+ raise ArgumentError, '#setup_create requires either a method name or a block' if method.nil? && block.nil?
26
+
27
+ (@i_setup_create_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
28
+ end
29
+
23
30
  def before_create(method = nil, **options, &block)
24
- raise ArgumentError, '#on_create requires either a method name or a block' if method.nil? && block.nil?
31
+ raise ArgumentError, '#before_create requires either a method name or a block' if method.nil? && block.nil?
25
32
 
26
33
  (@i_before_create_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
27
34
  end
@@ -59,7 +66,7 @@ module SnFoil
59
66
 
60
67
  def create(**options)
61
68
  options[:action] = :create
62
- options = setup_change(setup_create(**options))
69
+ options = before_setup_create_object(**options)
63
70
  options = setup_create_object(**options)
64
71
  authorize(options[:object], :create?, **options)
65
72
  options = create_hooks(**options)
@@ -86,6 +93,10 @@ module SnFoil
86
93
  options
87
94
  end
88
95
 
96
+ def setup_create_hooks
97
+ self.class.i_setup_create_hooks || []
98
+ end
99
+
89
100
  def before_create_hooks
90
101
  self.class.i_before_create_hooks || []
91
102
  end
@@ -104,6 +115,15 @@ module SnFoil
104
115
 
105
116
  private
106
117
 
118
+ def before_setup_create_object(**options)
119
+ options = setup_create(**options)
120
+ options = setup_create_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
121
+ options = setup_change(**options)
122
+ options = setup_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
123
+ options = setup(**options)
124
+ setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
125
+ end
126
+
107
127
  # This method is private to help protect the order of execution of hooks
108
128
  def create_hooks(options)
109
129
  options = before_create_save(**options)
@@ -6,7 +6,7 @@ require_relative './change_context'
6
6
 
7
7
  module SnFoil
8
8
  module Contexts
9
- module DestroyContext
9
+ module DestroyContext # rubocop:disable Metrics/ModuleLength
10
10
  extend ActiveSupport::Concern
11
11
 
12
12
  included do
@@ -15,13 +15,20 @@ module SnFoil
15
15
  end
16
16
 
17
17
  class_methods do
18
- attr_reader :i_before_destroy_hooks, :i_after_destroy_hooks, :i_after_destroy_success_hooks, :i_after_destroy_failure_hooks
18
+ attr_reader :i_setup_destroy_hooks, :i_before_destroy_hooks, :i_after_destroy_hooks,
19
+ :i_after_destroy_success_hooks, :i_after_destroy_failure_hooks
19
20
  def destroy(id:, user: nil, **options)
20
21
  new(user).destroy(**options, id: id)
21
22
  end
22
23
 
24
+ def setup_destroy(method = nil, **options, &block)
25
+ raise ArgumentError, '#setup_destroy requires either a method name or a block' if method.nil? && block.nil?
26
+
27
+ (@i_setup_destroy_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
28
+ end
29
+
23
30
  def before_destroy(method = nil, **options, &block)
24
- raise ArgumentError, '#on_destroy requires either a method name or a block' if method.nil? && block.nil?
31
+ raise ArgumentError, '#before_destroy requires either a method name or a block' if method.nil? && block.nil?
25
32
 
26
33
  (@i_before_destroy_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
27
34
  end
@@ -53,7 +60,7 @@ module SnFoil
53
60
 
54
61
  def destroy(**options)
55
62
  options[:action] = :destroy
56
- options = setup_destroy(setup_change(**options))
63
+ options = before_setup_destroy_object(**options)
57
64
  options = setup_destroy_object(**options)
58
65
  authorize(options[:object], :destroy?, **options)
59
66
  options = destroy_hooks(**options)
@@ -80,6 +87,10 @@ module SnFoil
80
87
  options
81
88
  end
82
89
 
90
+ def setup_destroy_hooks
91
+ self.class.i_setup_destroy_hooks || []
92
+ end
93
+
83
94
  def before_destroy_hooks
84
95
  self.class.i_before_destroy_hooks || []
85
96
  end
@@ -98,6 +109,15 @@ module SnFoil
98
109
 
99
110
  private
100
111
 
112
+ def before_setup_destroy_object(**options)
113
+ options = setup_destroy(**options)
114
+ options = setup_destroy_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
115
+ options = setup_change(**options)
116
+ options = setup_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
117
+ options = setup(**options)
118
+ setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
119
+ end
120
+
101
121
  # This method is private to help protect the order of execution of hooks
102
122
  def destroy_hooks(options)
103
123
  options = before_destroy_save(options)
@@ -13,7 +13,7 @@ module SnFoil
13
13
  end
14
14
 
15
15
  class_methods do
16
- attr_reader :i_searcher
16
+ attr_reader :i_searcher, :i_setup_index_hooks
17
17
 
18
18
  def index(params: {}, user: nil, **options)
19
19
  new(user).index(**options, params: params)
@@ -22,24 +22,43 @@ module SnFoil
22
22
  def searcher(klass = nil)
23
23
  @i_searcher = klass
24
24
  end
25
+
26
+ def setup_index(method = nil, **options, &block)
27
+ raise ArgumentError, '#setup_index requires either a method name or a block' if method.nil? && block.nil?
28
+
29
+ (@i_setup_index_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
30
+ end
25
31
  end
26
32
 
27
33
  def searcher
28
34
  self.class.i_searcher
29
35
  end
30
36
 
37
+ def setup_index_hooks
38
+ self.class.i_setup_index_hooks || []
39
+ end
40
+
31
41
  def index(params:, **options)
32
42
  options[:action] = :index
33
- options = setup_index(**options)
43
+ options = before_setup_index(**options)
44
+ authorize(nil, :index?, **options)
34
45
  options.fetch(:searcher) { searcher }
35
46
  .new(scope: scope.resolve)
36
47
  .search(params: params)
37
48
  end
38
49
 
39
- # Param manipulation based on User should be done here
40
50
  def setup_index(**options)
41
51
  options
42
52
  end
53
+
54
+ private
55
+
56
+ def before_setup_index(**options)
57
+ options = setup_index(**options)
58
+ options = setup_index_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
59
+ options = setup(**options)
60
+ setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
61
+ end
43
62
  end
44
63
  end
45
64
  end
@@ -9,7 +9,7 @@ module SnFoil
9
9
  extend ActiveSupport::Concern
10
10
 
11
11
  class_methods do
12
- attr_reader :i_model, :i_policy
12
+ attr_reader :i_model, :i_policy, :i_setup_hooks
13
13
 
14
14
  def model(klass = nil)
15
15
  @i_model = klass
@@ -18,6 +18,12 @@ module SnFoil
18
18
  def policy(klass = nil)
19
19
  @i_policy = klass
20
20
  end
21
+
22
+ def setup(method = nil, **options, &block)
23
+ raise ArgumentError, '#setup requires either a method name or a block' if method.nil? && block.nil?
24
+
25
+ (@i_setup_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
26
+ end
21
27
  end
22
28
 
23
29
  def model
@@ -28,6 +34,14 @@ module SnFoil
28
34
  self.class.i_policy
29
35
  end
30
36
 
37
+ def setup(**options)
38
+ options
39
+ end
40
+
41
+ def setup_hooks
42
+ self.class.i_setup_hooks || []
43
+ end
44
+
31
45
  attr_reader :user
32
46
  def initialize(user = nil)
33
47
  @user = user
@@ -38,6 +52,7 @@ module SnFoil
38
52
 
39
53
  policy = lookup_policy(object, options)
40
54
  raise Pundit::NotAuthorizedError, query: action, record: object, policy: policy unless policy.public_send(action)
55
+
41
56
  true
42
57
  end
43
58
 
@@ -69,13 +84,34 @@ module SnFoil
69
84
  @adapter ||= SnFoil.adapter
70
85
  end
71
86
 
87
+ def run_hook(hook, **options)
88
+ return options unless hook_valid?(hook, **options)
89
+
90
+ return send(hook[:method], **options) if hook[:method]
91
+
92
+ instance_exec options, &hook[:block]
93
+ end
94
+
95
+ def hook_valid?(hook, **options)
96
+ return false if !hook[:if].nil? && hook[:if].call(options) == false
97
+ return false if !hook[:unless].nil? && hook[:unless].call(options) == true
98
+
99
+ true
100
+ end
101
+
72
102
  private
73
103
 
74
104
  def lookup_policy(object, options)
75
- return options[:policy].new(user, object) if options[:policy]
76
- return policy.new(user, object) if policy
77
-
78
- Pundit.policy!(user, object)
105
+ lookup = if options[:policy]
106
+ options[:policy].new(user, object)
107
+ elsif policy
108
+ policy.new(user, object)
109
+ else
110
+ Pundit.policy!(user, object)
111
+ end
112
+
113
+ lookup.options = options if lookup.respond_to? :options=
114
+ lookup
79
115
  end
80
116
  end
81
117
  end
@@ -13,9 +13,17 @@ module SnFoil
13
13
  end
14
14
 
15
15
  class_methods do
16
+ attr_reader :i_setup_show_hooks
17
+
16
18
  def show(id:, user: nil, **options)
17
19
  new(user).show(**options, id: id)
18
20
  end
21
+
22
+ def setup_show(method = nil, **options, &block)
23
+ raise ArgumentError, '#setup_show requires either a method name or a block' if method.nil? && block.nil?
24
+
25
+ (@i_setup_show_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
26
+ end
19
27
  end
20
28
 
21
29
  def setup_show_object(id: nil, object: nil, **options)
@@ -24,12 +32,30 @@ module SnFoil
24
32
  options.merge! object: wrap_object(object || scope.resolve.find(id))
25
33
  end
26
34
 
35
+ def setup_show_hooks
36
+ self.class.i_setup_show_hooks || []
37
+ end
38
+
27
39
  def show(**options)
28
40
  options[:action] = :show
41
+ options = before_setup_show(**options)
29
42
  options = setup_show_object(**options)
30
43
  authorize(options[:object], :show?, **options)
31
44
  unwrap_object options[:object]
32
45
  end
46
+
47
+ def setup_show(**options)
48
+ options
49
+ end
50
+
51
+ private
52
+
53
+ def before_setup_show(**options)
54
+ options = setup_show(**options)
55
+ options = setup_show_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
56
+ options = setup(**options)
57
+ setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
58
+ end
33
59
  end
34
60
  end
35
61
  end
@@ -15,13 +15,20 @@ module SnFoil
15
15
  end
16
16
 
17
17
  class_methods do
18
- attr_reader :i_before_update_hooks, :i_after_update_hooks, :i_after_update_success_hooks, :i_after_update_failure_hooks
18
+ attr_reader :i_setup_update_hooks, :i_before_update_hooks, :i_after_update_hooks,
19
+ :i_after_update_success_hooks, :i_after_update_failure_hooks
19
20
  def update(id:, params:, user: nil, **options)
20
21
  new(user).update(**options, id: id, params: params)
21
22
  end
22
23
 
24
+ def setup_update(method = nil, **options, &block)
25
+ raise ArgumentError, '#setup_update requires either a method name or a block' if method.nil? && block.nil?
26
+
27
+ (@i_setup_update_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
28
+ end
29
+
23
30
  def before_update(method = nil, **options, &block)
24
- raise ArgumentError, '#on_update requires either a method name or a block' if method.nil? && block.nil?
31
+ raise ArgumentError, '#before_update requires either a method name or a block' if method.nil? && block.nil?
25
32
 
26
33
  (@i_before_update_hooks ||= []) << { method: method, block: block, if: options[:if], unless: options[:unless] }
27
34
  end
@@ -56,7 +63,7 @@ module SnFoil
56
63
 
57
64
  def update(**options)
58
65
  options[:action] = :update
59
- options = setup_change(setup_update(**options))
66
+ options = before_setup_update_object(**options)
60
67
  options = setup_update_object(**options)
61
68
  authorize(options[:object], :update?, **options)
62
69
  options = update_hooks(**options)
@@ -83,6 +90,10 @@ module SnFoil
83
90
  options
84
91
  end
85
92
 
93
+ def setup_update_hooks
94
+ self.class.i_setup_update_hooks || []
95
+ end
96
+
86
97
  def before_update_hooks
87
98
  self.class.i_before_update_hooks || []
88
99
  end
@@ -101,6 +112,15 @@ module SnFoil
101
112
 
102
113
  private
103
114
 
115
+ def before_setup_update_object(**options)
116
+ options = setup_update(**options)
117
+ options = setup_update_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
118
+ options = setup_change(**options)
119
+ options = setup_change_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
120
+ options = setup(**options)
121
+ setup_hooks.reduce(options) { |opts, hook| run_hook(hook, opts) }
122
+ end
123
+
104
124
  # This method is private to help protect the order of execution of hooks
105
125
  def update_hooks(options)
106
126
  options = before_update_save(options)
@@ -6,8 +6,9 @@ module SnFoil
6
6
  module Policy
7
7
  extend ActiveSupport::Concern
8
8
 
9
- attr_reader :record, :entity, :options
10
- def initialize(record, entity = nil, options = {})
9
+ attr_reader :record, :entity
10
+ attr_accessor :options
11
+ def initialize(entity, record, options = {})
11
12
  @record = record
12
13
  @entity = entity
13
14
  @options = options
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SnFoil
4
+ VERSION = '0.4.0'
5
+ end
data/lib/sn_foil.rb ADDED
@@ -0,0 +1,47 @@
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 'active_support/core_ext/module/attribute_accessors'
14
+ require 'logger'
15
+
16
+ module SnFoil
17
+ class Error < StandardError; end
18
+
19
+ mattr_accessor :orm, default: 'active_record'
20
+ mattr_writer :logger
21
+
22
+ class << self
23
+ def logger
24
+ @logger ||= Logger.new($stdout).tap do |log|
25
+ log.progname = name
26
+ end
27
+ end
28
+
29
+ def adapter
30
+ return @adapter if @adapter
31
+
32
+ @adapter ||= if orm.instance_of?(String) || orm.instance_of?(Symbol)
33
+ if Object.const_defined?("SnFoil::Adapters::ORMs::#{orm.camelcase}")
34
+ "SnFoil::Adapters::ORMs::#{orm.camelcase}".constantize
35
+ else
36
+ orm.constantize
37
+ end
38
+ else
39
+ orm
40
+ end
41
+ end
42
+
43
+ def configure
44
+ yield self
45
+ end
46
+ end
47
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snfoil
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Howes
8
8
  - Danny Murphy
9
9
  autorequire:
10
- bindir: exe
10
+ bindir: bin
11
11
  cert_chain: []
12
- date: 2020-02-18 00:00:00.000000000 Z
12
+ date: 2020-03-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '2.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: dry-struct
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '1.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '1.0'
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: pry-byebug
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -137,20 +151,6 @@ dependencies:
137
151
  - - "~>"
138
152
  - !ruby/object:Gem::Version
139
153
  version: 1.36.0
140
- - !ruby/object:Gem::Dependency
141
- name: dry-struct
142
- requirement: !ruby/object:Gem::Requirement
143
- requirements:
144
- - - "~>"
145
- - !ruby/object:Gem::Version
146
- version: '1.0'
147
- type: :development
148
- prerelease: false
149
- version_requirements: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - "~>"
152
- - !ruby/object:Gem::Version
153
- version: '1.0'
154
154
  description:
155
155
  email:
156
156
  - howeszy@gmail.com
@@ -159,6 +159,10 @@ executables: []
159
159
  extensions: []
160
160
  extra_rdoc_files: []
161
161
  files:
162
+ - CODE_OF_CONDUCT.md
163
+ - README.md
164
+ - Rakefile
165
+ - lib/sn_foil.rb
162
166
  - lib/sn_foil/adapters/orms/active_record.rb
163
167
  - lib/sn_foil/adapters/orms/base_adapter.rb
164
168
  - lib/sn_foil/context.rb
@@ -172,6 +176,7 @@ files:
172
176
  - lib/sn_foil/contexts/update_context.rb
173
177
  - lib/sn_foil/policy.rb
174
178
  - lib/sn_foil/searcher.rb
179
+ - lib/sn_foil/version.rb
175
180
  homepage: https://github.com/howeszy/snfoil
176
181
  licenses:
177
182
  - MIT