super_current 0.1.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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +85 -0
- data/Rakefile +3 -0
- data/lib/super_current/railtie.rb +6 -0
- data/lib/super_current/version.rb +5 -0
- data/lib/super_current.rb +47 -0
- data/lib/tasks/super_current_tasks.rake +4 -0
- metadata +95 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c7b06278344d52daeca7f894da9550e61b31949db0aeab3d8b253ecd715745b4
|
4
|
+
data.tar.gz: 73966d1ce60a49767b6510c77e268f7d792cb5a33bf89831822bc476ad955234
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 399e4951acc3605e3e88865b987f6af2627216889571450ad2186cb938e4aa856b18defd257e7e432f0e8611e596bdd6c701da7c5345f65c2d691dfb7634f465
|
7
|
+
data.tar.gz: 316da47d7a8161393f221166276ef556c3c03b04fe2797ee5899a33a080bbd5beaaa904991f31868b4ee1d5e0b95e8f6677d1ab8b758bcdcb2f0a382bf214a67
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2022 Sampo Kuokkanen
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# SuperCurrent
|
2
|
+
`SuperCurrent` takes away the need to define a `Current` class and instead makes it available from anywhere in your app without having to define it.
|
3
|
+
|
4
|
+
This means that your test coverage will not suffer from `ActiveSupport::CurrentAttributes`!
|
5
|
+
|
6
|
+
You can define the class name of the `Current` class, so if you're already using `Current` for something else, you can use a different name.
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
# config/initializers/super_current.rb
|
10
|
+
SuperCurrent.config.current_class_name = 'SuperCurrent'
|
11
|
+
```
|
12
|
+
|
13
|
+
Then you can have your existing `Current` class be a subclass of `SuperCurrent` and it will still work with all the exciting features of `SuperCurrent`.
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
class Current < SuperCurrent
|
17
|
+
# ...
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
Just think up a name for your attribute and assign it! It will be created on the `Current` class automatically.
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
Current.foo = 'bar'
|
26
|
+
Current.foo # => 'bar'
|
27
|
+
```
|
28
|
+
|
29
|
+
`SuperCurrent` also adds the ability to use `[]` and `[]=` to access the attributes.
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
Current[:foo] = 'bar'
|
33
|
+
Current[:foo] # => 'bar'
|
34
|
+
```
|
35
|
+
|
36
|
+
Even something like `Current[:foo][:bar]` will work!
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
# No need to define Current[:hoge] beforehand!
|
40
|
+
Current[:hoge][:bar] = "hello"
|
41
|
+
Current[:hoge][:bar] # => 'bar'
|
42
|
+
```
|
43
|
+
|
44
|
+
This means that you no longer need to define the attributes on the `Current` class beforehand.
|
45
|
+
|
46
|
+
So if you have a class like this:
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
class Current < ActiveSupport::CurrentAttributes
|
50
|
+
attribute :foo
|
51
|
+
attribute :bar
|
52
|
+
attribute :baz
|
53
|
+
attribute :hoge
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
You can just delete it and enjoy the benefits of `SuperCurrent`! Test coverage might go up, too!
|
58
|
+
|
59
|
+
## Installation
|
60
|
+
Add this line to your application's Gemfile:
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
gem "super_current"
|
64
|
+
```
|
65
|
+
|
66
|
+
And then execute:
|
67
|
+
```bash
|
68
|
+
$ bundle
|
69
|
+
```
|
70
|
+
|
71
|
+
Or install it yourself as:
|
72
|
+
```bash
|
73
|
+
$ gem install super_current
|
74
|
+
```
|
75
|
+
|
76
|
+
## Inspiration
|
77
|
+
|
78
|
+
Inspired by:
|
79
|
+
https://wiki.php.net/rfc/deprecate_dynamic_properties
|
80
|
+
|
81
|
+
## Contributing
|
82
|
+
Feel free to contribute.
|
83
|
+
|
84
|
+
## License
|
85
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'super_current/version'
|
4
|
+
require 'super_current/railtie'
|
5
|
+
require 'dry-configurable'
|
6
|
+
|
7
|
+
# SuperCurrent makes it easier to use ActiveSupport::CurrentAttributes
|
8
|
+
module SuperCurrent
|
9
|
+
extend Dry::Configurable
|
10
|
+
|
11
|
+
setting :current_class_name, default: 'Current', reader: true
|
12
|
+
|
13
|
+
# The class that actually has the CurrentAttributes as parent class
|
14
|
+
# Named SuperSuperCurrent to avoid conflicts with the SuperCurrent module
|
15
|
+
class SuperSuperCurrent < ActiveSupport::CurrentAttributes
|
16
|
+
attribute :__current_hash
|
17
|
+
|
18
|
+
@methods = []
|
19
|
+
|
20
|
+
def self.[](key)
|
21
|
+
self.__current_hash ||= {}
|
22
|
+
self.__current_hash[key] || self.__current_hash[key] = {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.[]=(key, value)
|
26
|
+
self.__current_hash ||= {}
|
27
|
+
self.__current_hash[key] = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.method_missing(method, *args)
|
31
|
+
super unless method.to_s.end_with?('=')
|
32
|
+
|
33
|
+
attribute_name = method.to_s.chomp('=')
|
34
|
+
attribute_value = args.first
|
35
|
+
|
36
|
+
class_eval { attribute attribute_name.to_sym }
|
37
|
+
public_send "#{attribute_name}=", attribute_value
|
38
|
+
@methods << attribute_name
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.respond_to_missing?(method, include_private = false)
|
42
|
+
@methods.include?(method.to_s) || method.to_s.end_with?('=') || super
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Object.const_set(SuperCurrent.config.current_class_name, SuperCurrent::SuperSuperCurrent)
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: super_current
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sampo Kuokkanen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-11-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 7.0.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 7.0.4
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dry-configurable
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: standard
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: SuperCurrent adds more fun to your Rails app by making it harder to predict!
|
56
|
+
email:
|
57
|
+
- sampo.kuokkanen@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- MIT-LICENSE
|
63
|
+
- README.md
|
64
|
+
- Rakefile
|
65
|
+
- lib/super_current.rb
|
66
|
+
- lib/super_current/railtie.rb
|
67
|
+
- lib/super_current/version.rb
|
68
|
+
- lib/tasks/super_current_tasks.rake
|
69
|
+
homepage: https://www.google.com
|
70
|
+
licenses:
|
71
|
+
- MIT
|
72
|
+
metadata:
|
73
|
+
homepage_uri: https://www.google.com
|
74
|
+
source_code_uri: https://www.google.com
|
75
|
+
changelog_uri: https://www.google.com
|
76
|
+
post_install_message:
|
77
|
+
rdoc_options: []
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
requirements: []
|
91
|
+
rubygems_version: 3.3.13
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: SuperCurrent is a way to add magic to CurrentAttributes.
|
95
|
+
test_files: []
|