active_method 0.5.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +101 -9
- data/lib/active_method/base.rb +14 -0
- data/lib/active_method/executor.rb +18 -0
- data/lib/active_method/util.rb +43 -0
- data/lib/active_method/version.rb +1 -1
- data/lib/active_method.rb +20 -0
- metadata +4 -3
- data/Gemfile.lock +0 -50
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '09981bf259603ed5a3702d558f61812780801c59af7dc1f61e0a8a4d9785e211'
|
4
|
+
data.tar.gz: 6ac6cc4ab0f822592bd355f2d57cb9c7bddfd5d743685e2e20115da8a6f6eae3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44df9e385113755724745f2fc0a022b71d44611b7443f627dc04a78dc3b26d529259315ee8eaada7172fc6791a2eab22b0f2ee9c368b1c933d1c25c2314ee1b1
|
7
|
+
data.tar.gz: eb4cb181d3112ae398aaae750a7bf431f71265d21f0b6084fc804bd4368e78bb07fbabc14bd756a00f1e840299e1d2e9ea5521cb03591b4e0ba781043c88b9a2
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [1.1.0] - 2022-10-08
|
4
|
+
|
5
|
+
- Support `module_function`
|
6
|
+
|
7
|
+
## [1.0.0] - 2022-09-16
|
8
|
+
|
9
|
+
- Now you can use `.active_method` through `include ActiveMethod`
|
10
|
+
- Get each method with owner like `Foo[user].call(a: 1)` for testing
|
3
11
|
## [0.5.0] - 2022-08-28
|
4
12
|
|
5
13
|
- Initial release
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# ActiveMethod
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Refactor your obscure method to a method object with `ActiveMethod`
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -16,17 +14,111 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
16
14
|
|
17
15
|
## Usage
|
18
16
|
|
19
|
-
|
17
|
+
Refactor `Foo#bar` to `Bar` with `ActiveMethod`
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
class Foo
|
21
|
+
def bar(a, b, c: , d:)
|
22
|
+
puts "a: #{a}"
|
23
|
+
puts "b: #{b}"
|
24
|
+
puts "c: #{c}"
|
25
|
+
puts "d: #{d}"
|
26
|
+
|
27
|
+
buzz
|
28
|
+
end
|
29
|
+
|
30
|
+
def buzs
|
31
|
+
puts 'buzz'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
Refactor to:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
class Bar < ActiveMethod::Base
|
40
|
+
argument :a
|
41
|
+
argument :b, default: 2
|
42
|
+
keyword_argument :c
|
43
|
+
keyword_argument :d, default: 4
|
44
|
+
|
45
|
+
def call
|
46
|
+
puts "a: #{a}"
|
47
|
+
puts "b: #{b}"
|
48
|
+
puts "c: #{c}"
|
49
|
+
puts "d: #{d}"
|
50
|
+
|
51
|
+
foo.buzz
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class Foo
|
56
|
+
include ActiveMethod
|
57
|
+
|
58
|
+
active_method :bar
|
59
|
+
end
|
60
|
+
|
61
|
+
Bar.call(1)
|
62
|
+
# => a: 1
|
63
|
+
# => b: 2
|
64
|
+
# => c: nil
|
65
|
+
# => d: 4
|
66
|
+
# => buzz
|
67
|
+
|
68
|
+
Bar.call(1, 3)
|
69
|
+
# => a: 1
|
70
|
+
# => b: 3
|
71
|
+
# => c: nil
|
72
|
+
# => d: 4
|
73
|
+
# => buzz
|
74
|
+
|
75
|
+
Bar.call(1, 3, c: 6)
|
76
|
+
# => a: 1
|
77
|
+
# => b: 3
|
78
|
+
# => c: 6
|
79
|
+
# => d: 4
|
80
|
+
# => buzz
|
81
|
+
|
82
|
+
Bar.call(1, 3, c: 4, d: 5)
|
83
|
+
# => a: 1
|
84
|
+
# => b: 3
|
85
|
+
# => c: 4
|
86
|
+
# => d: 5
|
87
|
+
# => buzz
|
88
|
+
```
|
89
|
+
|
90
|
+
### Work on module
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
class Hi < ActiveMethod::Base
|
94
|
+
argument :name
|
95
|
+
|
96
|
+
def call
|
97
|
+
"Hi, #{name}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
module Say
|
102
|
+
include ActiveMethod
|
103
|
+
|
104
|
+
active_method :hi, module_function: true
|
105
|
+
end
|
106
|
+
|
107
|
+
Say.hi('John')
|
108
|
+
# => "Hi, John"
|
109
|
+
```
|
20
110
|
|
21
111
|
## Development
|
22
112
|
|
23
|
-
|
24
|
-
|
25
|
-
|
113
|
+
```bash
|
114
|
+
bundle install
|
115
|
+
meval rake # Run test
|
116
|
+
meval -a rake # Run tests against all Ruby versions and Rails versions
|
117
|
+
```
|
26
118
|
|
27
119
|
## Contributing
|
28
120
|
|
29
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
121
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/hoppergee/active_method. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/hoppergee/active_method/blob/master/CODE_OF_CONDUCT.md).
|
30
122
|
|
31
123
|
## License
|
32
124
|
|
@@ -34,4 +126,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
34
126
|
|
35
127
|
## Code of Conduct
|
36
128
|
|
37
|
-
Everyone interacting in the ActiveMethod project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
129
|
+
Everyone interacting in the ActiveMethod project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/hoppergee/active_method/blob/master/CODE_OF_CONDUCT.md).
|
data/lib/active_method/base.rb
CHANGED
@@ -12,6 +12,11 @@ module ActiveMethod
|
|
12
12
|
|
13
13
|
class << self
|
14
14
|
|
15
|
+
def [](owner)
|
16
|
+
Executor.new(self, owner)
|
17
|
+
end
|
18
|
+
alias_method :on, :[]
|
19
|
+
|
15
20
|
def call(*args)
|
16
21
|
new(*args).call
|
17
22
|
end
|
@@ -96,6 +101,15 @@ module ActiveMethod
|
|
96
101
|
end
|
97
102
|
end
|
98
103
|
|
104
|
+
def __set_owner(owner)
|
105
|
+
@__method_owner = owner
|
106
|
+
|
107
|
+
instance_name = Util.snake_case(owner.class.name.split("::").last)
|
108
|
+
self.class.define_method instance_name do
|
109
|
+
@__method_owner
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
99
113
|
def call
|
100
114
|
end
|
101
115
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ActiveMethod
|
2
|
+
class Executor
|
3
|
+
|
4
|
+
attr_reader :method_class, :owner
|
5
|
+
|
6
|
+
def initialize(klass, owner)
|
7
|
+
@method_class = klass
|
8
|
+
@owner = owner
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(*args)
|
12
|
+
method = method_class.new(*args)
|
13
|
+
method.__set_owner(owner)
|
14
|
+
method.call
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module ActiveMethod
|
2
|
+
module Util
|
3
|
+
module_function
|
4
|
+
|
5
|
+
def constantize(klass, name)
|
6
|
+
constant = klass.const_get(name) rescue nil
|
7
|
+
return constant unless constant.nil?
|
8
|
+
|
9
|
+
namespaces_of(klass).each do |namespace|
|
10
|
+
constant = namespace.const_get(name) rescue nil
|
11
|
+
return constant unless constant.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
raise NameError.new("wrong constant name #{name}") if constant.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
def namespaces_of(klass)
|
18
|
+
namespaces = []
|
19
|
+
|
20
|
+
names = klass.name.split("::")
|
21
|
+
names.pop
|
22
|
+
while !names.empty?
|
23
|
+
namespaces << Object.const_get(names.join("::"))
|
24
|
+
names.pop
|
25
|
+
end
|
26
|
+
|
27
|
+
namespaces
|
28
|
+
end
|
29
|
+
|
30
|
+
def camel_case(str)
|
31
|
+
str = str.to_s
|
32
|
+
return str if str !~ /_/ && str =~ /[A-Z]+.*/
|
33
|
+
str.split("_").map(&:capitalize).join
|
34
|
+
end
|
35
|
+
|
36
|
+
def snake_case(str)
|
37
|
+
return str.downcase if str =~ /^[A-Z_]+$/
|
38
|
+
str.gsub(/\B[A-Z]/, '_\&').squeeze("_") =~ /_*(.*)/
|
39
|
+
$+.downcase
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
data/lib/active_method.rb
CHANGED
@@ -3,5 +3,25 @@
|
|
3
3
|
require_relative "active_method/version"
|
4
4
|
|
5
5
|
module ActiveMethod
|
6
|
+
autoload :Util, "active_method/util"
|
7
|
+
autoload :Executor, "active_method/executor"
|
6
8
|
autoload :Base, "active_method/base"
|
9
|
+
|
10
|
+
def self.included(base)
|
11
|
+
base.extend ClassMethods
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
def active_method(name, method_class = nil, **options)
|
16
|
+
method_class ||= Util.constantize self, Util.camel_case(name)
|
17
|
+
|
18
|
+
define_method name do |*args|
|
19
|
+
method_class[self].call(*args)
|
20
|
+
end
|
21
|
+
|
22
|
+
if options[:module_function]
|
23
|
+
module_function name
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
7
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_method
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hopper Gee
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08
|
11
|
+
date: 2022-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Refactor your obscure method to a method object
|
14
14
|
email:
|
@@ -20,12 +20,13 @@ files:
|
|
20
20
|
- CHANGELOG.md
|
21
21
|
- CODE_OF_CONDUCT.md
|
22
22
|
- Gemfile
|
23
|
-
- Gemfile.lock
|
24
23
|
- LICENSE.txt
|
25
24
|
- README.md
|
26
25
|
- Rakefile
|
27
26
|
- lib/active_method.rb
|
28
27
|
- lib/active_method/base.rb
|
28
|
+
- lib/active_method/executor.rb
|
29
|
+
- lib/active_method/util.rb
|
29
30
|
- lib/active_method/version.rb
|
30
31
|
- matrixeval.yml
|
31
32
|
homepage: https://github.com/hoppergee/active_method
|
data/Gemfile.lock
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
active_method (0.1.0)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
concurrent-ruby (1.1.10)
|
10
|
-
debug (1.6.2)
|
11
|
-
irb (>= 1.3.6)
|
12
|
-
reline (>= 0.3.1)
|
13
|
-
docile (1.4.0)
|
14
|
-
io-console (0.5.11)
|
15
|
-
irb (1.4.1)
|
16
|
-
reline (>= 0.3.0)
|
17
|
-
matrixeval (0.4.3)
|
18
|
-
concurrent-ruby
|
19
|
-
rainbow (~> 3.1)
|
20
|
-
terminal-table
|
21
|
-
matrixeval-ruby (0.4.0)
|
22
|
-
matrixeval (~> 0.4.2)
|
23
|
-
minitest (5.16.2)
|
24
|
-
rainbow (3.1.1)
|
25
|
-
rake (13.0.6)
|
26
|
-
reline (0.3.1)
|
27
|
-
io-console (~> 0.5)
|
28
|
-
simplecov (0.21.2)
|
29
|
-
docile (~> 1.1)
|
30
|
-
simplecov-html (~> 0.11)
|
31
|
-
simplecov_json_formatter (~> 0.1)
|
32
|
-
simplecov-html (0.12.3)
|
33
|
-
simplecov_json_formatter (0.1.4)
|
34
|
-
terminal-table (3.0.2)
|
35
|
-
unicode-display_width (>= 1.1.1, < 3)
|
36
|
-
unicode-display_width (2.2.0)
|
37
|
-
|
38
|
-
PLATFORMS
|
39
|
-
arm64-darwin-21
|
40
|
-
|
41
|
-
DEPENDENCIES
|
42
|
-
active_method!
|
43
|
-
debug
|
44
|
-
matrixeval-ruby
|
45
|
-
minitest (~> 5.0)
|
46
|
-
rake (~> 13.0)
|
47
|
-
simplecov
|
48
|
-
|
49
|
-
BUNDLED WITH
|
50
|
-
2.3.12
|