much-plugin 0.1.0 → 0.2.3

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