much-plugin 0.1.0 → 0.2.3

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: fdbddb73262158cb2261ed12d723e7fe54267fa06918211664cfb61f39a838d0
4
+ data.tar.gz: '085b09a6f64eced79f590df6bfacc5baa3595b3c2429f4ff453b824c33e366ce'
5
+ SHA512:
6
+ metadata.gz: f213b81efdfabae338b351d95cbf9a4ee3bbd16d90343ba9bff6fc300f382b870d441ef2a1bd253dfcad8716872567bd0a45379dbd9c1e68e0badf5086aa0f6f
7
+ data.tar.gz: a882e8279f35d99aa3f8cda31bca0d7452ba27e620a4f705c715859904c45f0e62afcb5d018d434f06345e1fbbd24561737b764d571efb2beb2a9844a28ebec2
data/Gemfile CHANGED
@@ -1,6 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
5
+ ruby "~> 2.5"
6
+
3
7
  gemspec
4
8
 
5
- gem 'rake', "~> 10.4.0"
6
- gem 'pry', "~> 0.9.0"
9
+ gem "pry"
10
+
11
+ # to release, uncomment this and run `bundle exec ggem r -f`
12
+ gem "ggem"
data/README.md CHANGED
@@ -5,20 +5,17 @@ An API to ensure mixin included logic (the "plugin") only runs once.
5
5
  ## Usage
6
6
 
7
7
  ```ruby
8
- requre 'much-plugin'
8
+ requre "much-plugin"
9
9
 
10
10
  module MyPluginMixin
11
11
  include MuchPlugin
12
12
 
13
13
  plugin_included do
14
-
15
- # ... do some stuff ...
14
+ # do some stuff ...
16
15
  # - will be class eval'd in the scope of the receiver of `MyPluginMixin`
17
16
  # - will only be executed once per receiver, no matter how many times
18
17
  # `MyPluginMixin` is included in that receiver
19
-
20
18
  end
21
-
22
19
  end
23
20
  ```
24
21
 
@@ -26,11 +23,96 @@ Mix `MuchPlugin` in on other mixins that act as "plugins" to other components.
26
23
 
27
24
  This allows you to define multiple hooks separately and ensures each hook will only be executed once - even if your plugin is mixed in multiple times on the same receiver.
28
25
 
26
+ ### `plugin_class_methods` / `plugin_instance_methods`
27
+
28
+ MuchPlugin provides convenience methods for defining instance/class methods on plugin receivers:
29
+
30
+ ```ruby
31
+ requre "much-plugin"
32
+
33
+ module MyPluginMixin
34
+ include MuchPlugin
35
+
36
+ plugin_class_methods do
37
+ # define some methods ...
38
+ # - these methods will become class methods on the receiver
39
+ end
40
+
41
+ plugin_instance_methods do
42
+ # define some methods ...
43
+ # - these methods will become instance methods on the receiver
44
+ end
45
+ end
46
+ ```
47
+
48
+ ### `after_plugin_included`
49
+
50
+ These hooks work just like the `plugin_included` hooks, except they are evaluated _after_ any plugin class/instance methods have been evaluated. E.g. use this to call a class method that the plugin defines.
51
+
52
+ ```ruby
53
+ requre "much-plugin"
54
+
55
+ module MyPluginMixin
56
+ include MuchPlugin
57
+
58
+ after_plugin_included do
59
+ configure_the_plugin
60
+ end
61
+
62
+ plugin_class_methods do
63
+ def configure_the_plugin
64
+ # ...
65
+ end
66
+ end
67
+ end
68
+ ```
69
+
70
+ ## Example
71
+
72
+ ```ruby
73
+ requre "much-plugin"
74
+
75
+ module AnotherMixin
76
+ def another
77
+ "another"
78
+ end
79
+ end
80
+
81
+ module MyPlugin
82
+ include MuchPlugin
83
+
84
+ plugin_included do
85
+ include AnotherMixin
86
+ end
87
+
88
+ plugin_class_methods do
89
+ def a_class_method
90
+ "a-class-method"
91
+ end
92
+ end
93
+
94
+ plugin_instance_methods do
95
+ def an_instance_method
96
+ "an-instance-method"
97
+ end
98
+ end
99
+ end
100
+
101
+ class MyClass
102
+ include MyPlugin
103
+ end
104
+
105
+ my_class = MyClass.new
106
+ my_class.another # => "another"
107
+ my_class.an_instance_method # => "an-instance-method"
108
+ MyClass.a_class_method # => "a-class-method"
109
+ ```
110
+
29
111
  ## Installation
30
112
 
31
113
  Add this line to your application's Gemfile:
32
114
 
33
- gem 'much-plugin'
115
+ gem "much-plugin"
34
116
 
35
117
  And then execute:
36
118
 
@@ -0,0 +1,27 @@
1
+ require "much-plugin"
2
+ require "benchmark"
3
+
4
+ module Methods; end
5
+
6
+ module MyMixin
7
+ def self.included(receiver)
8
+ receiver.class_eval{ include Methods }
9
+ end
10
+ end
11
+
12
+ module MyPlugin
13
+ include MuchPlugin
14
+
15
+ plugin_included do
16
+ include Methods
17
+ end
18
+ end
19
+
20
+ Benchmark.bmbm do |x|
21
+ x.report("MyMixin") do
22
+ 10_000.times{ Class.new{ include MyMixin } }
23
+ end
24
+ x.report("MyPlugin") do
25
+ 10_000.times{ Class.new{ include MyPlugin } }
26
+ end
27
+ end
@@ -1,36 +1,92 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "much-plugin/version"
2
4
 
3
5
  module MuchPlugin
4
-
5
6
  def self.included(receiver)
6
- receiver.class_eval do
7
- extend ClassMethods
7
+ receiver.class_eval{ extend ClassMethods }
8
+ end
9
+
10
+ module ClassMethods
11
+ # install an included block that first checks if this plugin's receiver mixin
12
+ # has already been included. If it has not been, include the receiver mixin
13
+ # and run all of the `plugin_included` blocks
14
+ def included(plugin_receiver)
15
+ return if plugin_receiver.include?(self.much_plugin_included_detector)
16
+ plugin_receiver.send(:include, self.much_plugin_included_detector)
8
17
 
9
- # install an included hook that first checks if this plugin has
10
- # already been installed on the reciever. If it has not been,
11
- # class eval each callback on the receiver.
18
+ self.much_plugin_included_blocks.each do |block|
19
+ plugin_receiver.class_eval(&block)
20
+ end
12
21
 
13
- def self.included(plugin_receiver)
14
- return if self.much_plugin_receivers.include?(plugin_receiver)
22
+ self.much_plugin_class_method_blocks.each do |block|
23
+ self.much_plugin_class_methods_module.class_eval(&block)
24
+ end
25
+ plugin_receiver.send(:extend, self.much_plugin_class_methods_module)
15
26
 
16
- self.much_plugin_receivers.push(plugin_receiver)
17
- self.much_plugin_included_hooks.each do |hook|
18
- plugin_receiver.class_eval(&hook)
19
- end
27
+ self.much_plugin_instance_method_blocks.each do |block|
28
+ self.much_plugin_instance_methods_module.class_eval(&block)
20
29
  end
30
+ plugin_receiver.send(:include, self.much_plugin_instance_methods_module)
21
31
 
32
+ self.much_plugin_after_included_blocks.each do |block|
33
+ plugin_receiver.class_eval(&block)
34
+ end
22
35
  end
23
- end
24
36
 
25
- module ClassMethods
37
+ # the included detector is an empty module that is only used to detect if
38
+ # the plugin has been included or not, it doesn't add any behavior or
39
+ # methods to the object receiving the plugin; we use `const_set` to name the
40
+ # module so if its seen in the ancestors it doesn't look like some random
41
+ # module and it can be tracked back to much-plugin
42
+ def much_plugin_included_detector
43
+ @much_plugin_included_detector ||= Module.new.tap do |m|
44
+ self.const_set("MuchPluginIncludedDetector", m)
45
+ end
46
+ end
26
47
 
27
- def much_plugin_receivers; @much_plugin_receivers ||= []; end
28
- def much_plugin_included_hooks; @much_plugin_included_hooks ||= []; end
48
+ def much_plugin_class_methods_module
49
+ @much_plugin_class_methods_module ||= Module.new.tap do |m|
50
+ self.const_set("MuchPluginClassMethods", m)
51
+ end
52
+ end
29
53
 
30
- def plugin_included(&hook)
31
- self.much_plugin_included_hooks << hook
54
+ def much_plugin_instance_methods_module
55
+ @much_plugin_instance_methods_module ||= Module.new.tap do |m|
56
+ self.const_set("MuchPluginInstanceMethods", m)
57
+ end
32
58
  end
33
59
 
34
- end
60
+ def much_plugin_included_blocks
61
+ @much_plugin_included_blocks ||= []
62
+ end
63
+
64
+ def much_plugin_after_included_blocks
65
+ @much_plugin_after_included_blocks ||= []
66
+ end
67
+
68
+ def much_plugin_class_method_blocks
69
+ @much_plugin_class_method_blocks ||= []
70
+ end
71
+
72
+ def much_plugin_instance_method_blocks
73
+ @much_plugin_instance_method_blocks ||= []
74
+ end
35
75
 
76
+ def plugin_included(&block)
77
+ self.much_plugin_included_blocks << block
78
+ end
79
+
80
+ def after_plugin_included(&block)
81
+ self.much_plugin_after_included_blocks << block
82
+ end
83
+
84
+ def plugin_class_methods(&block)
85
+ self.much_plugin_class_method_blocks << block
86
+ end
87
+
88
+ def plugin_instance_methods(&block)
89
+ self.much_plugin_instance_method_blocks << block
90
+ end
91
+ end
36
92
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MuchPlugin
2
- VERSION = "0.1.0"
4
+ VERSION = "0.2.3"
3
5
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib', __FILE__)
4
+ lib = File.expand_path("../lib", __FILE__)
3
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
6
  require "much-plugin/version"
5
7
 
@@ -8,16 +10,17 @@ Gem::Specification.new do |gem|
8
10
  gem.version = MuchPlugin::VERSION
9
11
  gem.authors = ["Kelly Redding", "Collin Redding"]
10
12
  gem.email = ["kelly@kellyredding.com", "collin.redding@me.com"]
11
- gem.description = %q{An API to ensure mixin included logic (the "plugin") only runs once.}
12
13
  gem.summary = %q{An API to ensure mixin included logic (the "plugin") only runs once.}
14
+ gem.description = %q{An API to ensure mixin included logic (the "plugin") only runs once.}
13
15
  gem.homepage = "http://github.com/redding/much-plugin"
14
- gem.license = 'MIT'
16
+ gem.license = "MIT"
15
17
 
16
18
  gem.files = `git ls-files`.split($/)
17
19
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
20
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
21
  gem.require_paths = ["lib"]
20
22
 
21
- gem.add_development_dependency("assert", ["~> 2.15"])
23
+ gem.required_ruby_version = "~> 2.5"
22
24
 
25
+ gem.add_development_dependency("assert", ["~> 2.19.0"])
23
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # this file is automatically required when you run `assert`
2
4
  # put any test helpers here
3
5
 
@@ -5,6 +7,6 @@
5
7
  $LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
6
8
 
7
9
  # require pry for debugging (`binding.pry`)
8
- require 'pry'
10
+ require "pry"
9
11
 
10
- require 'test/support/factory'
12
+ require "test/support/factory"
@@ -1,6 +1,7 @@
1
- require 'assert/factory'
1
+ # frozen_string_literal: true
2
+
3
+ require "assert/factory"
2
4
 
3
5
  module Factory
4
6
  extend Assert::Factory
5
-
6
7
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert"
4
+ require "much-plugin"
5
+
6
+ module MuchPlugin
7
+ class SystemTests < Assert::Context
8
+ desc "MuchPlugin"
9
+ setup do
10
+ @my_class = MyClass.new
11
+ end
12
+ subject{ @my_class }
13
+
14
+ should "class eval the plugin included block on MyClass" do
15
+ assert_equal "another", subject.another
16
+ end
17
+
18
+ should "add the plugin class methods to MyClass" do
19
+ assert_equal "a-class-method", MyClass.a_class_method
20
+ end
21
+
22
+ should "add the plugin instance methods to MyClass" do
23
+ assert_equal "an-instance-method", subject.an_instance_method
24
+ end
25
+
26
+ module AnotherMixin
27
+ def another
28
+ "another"
29
+ end
30
+ end
31
+
32
+ module MyPlugin
33
+ include MuchPlugin
34
+
35
+ plugin_included do
36
+ include AnotherMixin
37
+ end
38
+
39
+ plugin_class_methods do
40
+ def a_class_method
41
+ "a-class-method"
42
+ end
43
+ end
44
+
45
+ plugin_instance_methods do
46
+ def an_instance_method
47
+ "an-instance-method"
48
+ end
49
+ end
50
+ end
51
+
52
+ class MyClass
53
+ include MyPlugin
54
+ end
55
+ end
56
+ end
@@ -1,73 +1,84 @@
1
- require 'assert'
2
- require 'much-plugin'
1
+ # frozen_string_literal: true
3
2
 
4
- module MuchPlugin
3
+ require "assert"
4
+ require "much-plugin"
5
5
 
6
+ module MuchPlugin
6
7
  class UnitTests < Assert::Context
7
8
  desc "MuchPlugin"
8
9
  setup do
9
- @hook1 = proc{ 1 }
10
- @hook2 = proc{ 2 }
10
+ @block1 = proc{ 1 }
11
+ @block2 = proc{ 2 }
11
12
 
12
13
  @plugin = Module.new{ include MuchPlugin }
13
14
  end
14
15
  subject{ @plugin }
15
16
 
16
- should have_imeths :much_plugin_included_hooks, :much_plugin_receivers
17
- should have_imeths :plugin_included
17
+ should have_imeths :much_plugin_included_detector, :much_plugin_included_blocks
18
+ should have_imeths :plugin_included, :after_plugin_included
18
19
 
19
- should "have no plugin included hooks by default" do
20
- assert_empty subject.much_plugin_included_hooks
20
+ should "know its included detector" do
21
+ mixin = subject.much_plugin_included_detector
22
+ assert_instance_of Module, mixin
23
+ assert_same mixin, subject.much_plugin_included_detector
24
+ exp = subject::MuchPluginIncludedDetector
25
+ assert_same exp, subject.much_plugin_included_detector
21
26
  end
22
27
 
23
- should "have no plugin receivers by default" do
24
- assert_empty subject.much_plugin_receivers
28
+ should "have no plugin included blocks by default" do
29
+ assert_empty subject.much_plugin_included_blocks
30
+ assert_empty subject.much_plugin_after_included_blocks
25
31
  end
26
32
 
27
- should "append hooks" do
28
- subject.plugin_included(&@hook1)
29
- subject.plugin_included(&@hook2)
33
+ should "append blocks" do
34
+ subject.plugin_included(&@block1)
35
+ subject.plugin_included(&@block2)
30
36
 
31
- assert_equal @hook1, subject.much_plugin_included_hooks.first
32
- assert_equal @hook2, subject.much_plugin_included_hooks.last
37
+ assert_equal @block1, subject.much_plugin_included_blocks.first
38
+ assert_equal @block2, subject.much_plugin_included_blocks.last
33
39
  end
34
-
35
40
  end
36
41
 
37
42
  class MixedInTests < UnitTests
38
43
  desc "when mixed in"
39
44
  setup do
40
45
  @receiver = Class.new do
41
- def self.inc_hook1; @hook1_count ||= 0; @hook1_count += 1; end
42
- def self.hook1_count; @hook1_count ||= 0; end
43
- def self.inc_hook2; @hook2_count ||= 0; @hook2_count += 1; end
44
- def self.hook2_count; @hook2_count ||= 0; end
46
+ def self.inc_block1; @block1_count ||= 0; @block1_count += 1; end
47
+ def self.block1_count; @block1_count ||= 0; end
48
+ def self.inc_block2; @block2_count ||= 0; @block2_count += 1; end
49
+ def self.block2_count; @block2_count ||= 0; end
50
+
51
+ def self.do_something_count; @do_something_count ||= 0; end
45
52
  end
46
53
  end
47
54
 
48
- should "call the plugin included hooks" do
49
- assert_equal 0, @receiver.hook1_count
50
- assert_equal 0, @receiver.hook2_count
55
+ should "call the plugin included blocks" do
56
+ assert_equal 0, @receiver.block1_count
57
+ assert_equal 0, @receiver.block2_count
58
+ assert_equal 0, @receiver.do_something_count
51
59
 
52
60
  @receiver.send(:include, TestPlugin)
53
61
 
54
- assert_equal 1, @receiver.hook1_count
55
- assert_equal 1, @receiver.hook2_count
62
+ assert_equal 1, @receiver.block1_count
63
+ assert_equal 1, @receiver.block2_count
64
+ assert_equal 1, @receiver.do_something_count
56
65
  end
57
66
 
58
- should "call hooks only once no matter even if previously mixed in" do
67
+ should "call blocks only once no matter even if previously mixed in" do
59
68
  @receiver.send(:include, TestPlugin)
60
69
 
61
- assert_equal 1, @receiver.hook1_count
62
- assert_equal 1, @receiver.hook2_count
70
+ assert_equal 1, @receiver.block1_count
71
+ assert_equal 1, @receiver.block2_count
72
+ assert_equal 1, @receiver.do_something_count
63
73
 
64
74
  @receiver.send(:include, TestPlugin)
65
75
 
66
- assert_equal 1, @receiver.hook1_count
67
- assert_equal 1, @receiver.hook2_count
76
+ assert_equal 1, @receiver.block1_count
77
+ assert_equal 1, @receiver.block2_count
78
+ assert_equal 1, @receiver.do_something_count
68
79
  end
69
80
 
70
- should "call hooks only once even if mixed in by a 3rd party" do
81
+ should "call blocks only once even if mixed in by a 3rd party" do
71
82
  third_party = Module.new do
72
83
  def self.included(receiver)
73
84
  receiver.send(:include, TestPlugin)
@@ -75,27 +86,39 @@ module MuchPlugin
75
86
  end
76
87
  @receiver.send(:include, third_party)
77
88
 
78
- assert_equal 1, @receiver.hook1_count
79
- assert_equal 1, @receiver.hook2_count
89
+ assert_equal 1, @receiver.block1_count
90
+ assert_equal 1, @receiver.block2_count
91
+ assert_equal 1, @receiver.do_something_count
80
92
 
81
93
  @receiver.send(:include, TestPlugin)
82
94
 
83
- assert_equal 1, @receiver.hook1_count
84
- assert_equal 1, @receiver.hook2_count
95
+ assert_equal 1, @receiver.block1_count
96
+ assert_equal 1, @receiver.block2_count
97
+ assert_equal 1, @receiver.do_something_count
85
98
 
86
99
  @receiver.send(:include, third_party)
87
100
 
88
- assert_equal 1, @receiver.hook1_count
89
- assert_equal 1, @receiver.hook2_count
90
- end
91
-
92
- TestPlugin = Module.new do
93
- include MuchPlugin
94
-
95
- plugin_included{ inc_hook1 }
96
- plugin_included{ inc_hook2 }
101
+ assert_equal 1, @receiver.block1_count
102
+ assert_equal 1, @receiver.block2_count
103
+ assert_equal 1, @receiver.do_something_count
97
104
  end
98
105
 
106
+ TestPlugin =
107
+ Module.new do
108
+ include MuchPlugin
109
+
110
+ plugin_included{ inc_block1 }
111
+ after_plugin_included{
112
+ inc_block2
113
+ do_something
114
+ }
115
+
116
+ plugin_class_methods do
117
+ def do_something
118
+ @do_something_count ||= 0
119
+ @do_something_count += 1
120
+ end
121
+ end
122
+ end
99
123
  end
100
-
101
124
  end
metadata CHANGED
@@ -1,96 +1,77 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: much-plugin
3
- version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.3
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Kelly Redding
14
8
  - Collin Redding
15
9
  autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
-
19
- date: 2015-11-24 00:00:00 Z
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- requirement: &id001 !ruby/object:Gem::Requirement
23
- none: false
24
- requirements:
25
- - - ~>
26
- - !ruby/object:Gem::Version
27
- hash: 29
28
- segments:
29
- - 2
30
- - 15
31
- version: "2.15"
32
- type: :development
12
+ date: 2021-01-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
33
15
  name: assert
34
- version_requirements: *id001
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 2.19.0
21
+ type: :development
35
22
  prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 2.19.0
36
28
  description: An API to ensure mixin included logic (the "plugin") only runs once.
37
- email:
29
+ email:
38
30
  - kelly@kellyredding.com
39
31
  - collin.redding@me.com
40
32
  executables: []
41
-
42
33
  extensions: []
43
-
44
34
  extra_rdoc_files: []
45
-
46
- files:
47
- - .gitignore
35
+ files:
36
+ - ".gitignore"
48
37
  - Gemfile
49
38
  - LICENSE
50
39
  - README.md
51
- - Rakefile
40
+ - bench/script.rb
52
41
  - lib/much-plugin.rb
53
42
  - lib/much-plugin/version.rb
54
43
  - log/.gitkeep
55
44
  - much-plugin.gemspec
56
45
  - test/helper.rb
57
46
  - test/support/factory.rb
47
+ - test/system/much-plugin_tests.rb
58
48
  - test/unit/much-plugin_tests.rb
59
49
  - tmp/.gitkeep
60
50
  homepage: http://github.com/redding/much-plugin
61
- licenses:
51
+ licenses:
62
52
  - MIT
53
+ metadata: {}
63
54
  post_install_message:
64
55
  rdoc_options: []
65
-
66
- require_paths:
56
+ require_paths:
67
57
  - lib
68
- required_ruby_version: !ruby/object:Gem::Requirement
69
- none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- hash: 3
74
- segments:
75
- - 0
76
- version: "0"
77
- required_rubygems_version: !ruby/object:Gem::Requirement
78
- none: false
79
- requirements:
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '2.5'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
80
65
  - - ">="
81
- - !ruby/object:Gem::Version
82
- hash: 3
83
- segments:
84
- - 0
85
- version: "0"
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
86
68
  requirements: []
87
-
88
- rubyforge_project:
89
- rubygems_version: 1.8.29
69
+ rubygems_version: 3.1.2
90
70
  signing_key:
91
- specification_version: 3
71
+ specification_version: 4
92
72
  summary: An API to ensure mixin included logic (the "plugin") only runs once.
93
- test_files:
73
+ test_files:
94
74
  - test/helper.rb
95
75
  - test/support/factory.rb
76
+ - test/system/much-plugin_tests.rb
96
77
  - test/unit/much-plugin_tests.rb
data/Rakefile DELETED
@@ -1 +0,0 @@
1
- require "bundler/gem_tasks"