metasploit-concern 0.0.2
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 +15 -0
- data/LICENSE +30 -0
- data/README.md +7 -0
- data/Rakefile +52 -0
- data/app/models/metasploit/concern/loader.rb +129 -0
- data/config/initializers/load_concerns.rb +23 -0
- data/lib/metasploit/concern.rb +73 -0
- data/lib/metasploit/concern/engine.rb +20 -0
- data/lib/metasploit/concern/version.rb +31 -0
- data/lib/tasks/yard.rake +30 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MDM5ZDczNDk1NzkwNTYzMTMzZGZlMTNlMmY3NzJjNDExMDMyNDg1Zg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ODI3MTBjNzAxNDdhNWY3ZTliYjVmMjFjN2NmNWU0MTM5NTY5Mjc2OA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MDBiMzliNWFlYzk5OWZjOGExMjc4MDYxZjQyMzJlNjRlYzIxNjJiNWFkM2Y3
|
10
|
+
N2ViNjYxY2MyZmM3MzUxMGY5YTg2NmE5YmJmNTkxZTU3MGY5Mzk3YmNhMjZk
|
11
|
+
NTk4YmMyODYwYTI1YTk0MWI2MDRmNjc4NTVkMTRlMjE3ZWI0NTQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ODM0MGY3YTZiMTNkOTYwYTg5NWRjMDIxN2JlZDA2ZDllYTVmN2E2Y2ZkZDEy
|
14
|
+
OGU3MDQyZWEyZmY5ZWFlZDcxM2ZlODg0Zjg4MGVkNmU2YjM4ZjUwYjc3YWY4
|
15
|
+
YThlYzE0Mjg5MGYyMmE4ZjlmYTZjNDAyMGJkMWI5ZTIxYWU4NmY=
|
data/LICENSE
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
```
|
2
|
+
Copyright (c) 2013 Rapid7, Inc.
|
3
|
+
|
4
|
+
License: BSD-3-clause
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without modification,
|
7
|
+
are permitted provided that the following conditions are met:
|
8
|
+
.
|
9
|
+
* Redistributions of source code must retain the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer.
|
11
|
+
.
|
12
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
14
|
+
and/or other materials provided with the distribution.
|
15
|
+
.
|
16
|
+
* Neither the name of Rapid7 LLC nor the names of its contributors
|
17
|
+
may be used to endorse or promote products derived from this software
|
18
|
+
without specific prior written permission.
|
19
|
+
.
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
21
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
22
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
23
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
24
|
+
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
25
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
26
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
27
|
+
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
29
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
```
|
data/README.md
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
# Metasploit::Concern [](https://travis-ci.org/rapid7/metasploit-concern)[](https://codeclimate.com/github/rapid7/metasploit-concern)[](https://coveralls.io/r/rapid7/metasploit-concern)[](https://gemnasium.com/rapid7/metasploit-concern)[](http://badge.fury.io/rb/metasploit-concern)
|
2
|
+
|
3
|
+
## Versioning
|
4
|
+
|
5
|
+
`Metasploit::Concern` is versioned using [semantic versioning 2.0](http://semver.org/spec/v2.0.0.html). Each branch
|
6
|
+
should set `Metasploit::Concern::Version::PRERELEASE` to the branch name, while master should have no `PRERELEASE`
|
7
|
+
and the `PRERELEASE` section of `Metasploit::Concern::VERSION` does not exist.
|
data/Rakefile
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
|
8
|
+
print_without = false
|
9
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
10
|
+
|
11
|
+
begin
|
12
|
+
load 'rails/tasks/engine.rake'
|
13
|
+
rescue LoadError
|
14
|
+
puts "railties not in bundle, so can't load engine tasks."
|
15
|
+
print_without = true
|
16
|
+
end
|
17
|
+
|
18
|
+
Bundler::GemHelper.install_tasks
|
19
|
+
|
20
|
+
#
|
21
|
+
# load rake files like a normal rails app
|
22
|
+
# @see http://viget.com/extend/rails-engine-testing-with-rspec-capybara-and-factorygirl
|
23
|
+
#
|
24
|
+
|
25
|
+
pathname = Pathname.new(__FILE__)
|
26
|
+
root = pathname.parent
|
27
|
+
rakefile_glob = root.join('lib', 'tasks', '**', '*.rake').to_path
|
28
|
+
|
29
|
+
Dir.glob(rakefile_glob) do |rakefile|
|
30
|
+
load rakefile
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'rspec/core'
|
35
|
+
rescue LoadError
|
36
|
+
puts "rspec not in bundle, so can't set up spec tasks. " \
|
37
|
+
"To run specs ensure to install the development and test groups."
|
38
|
+
print_without = true
|
39
|
+
else
|
40
|
+
require 'rspec/core/rake_task'
|
41
|
+
|
42
|
+
# @see http://viget.com/extend/rails-engine-testing-with-rspec-capybara-and-factorygirl
|
43
|
+
RSpec::Core::RakeTask.new(:spec)
|
44
|
+
|
45
|
+
task :default => :spec
|
46
|
+
end
|
47
|
+
|
48
|
+
if print_without
|
49
|
+
puts "Bundle currently installed '--without #{Bundler.settings.without.join(' ')}'."
|
50
|
+
puts "To clear the without option do `bundle install --without ''` (the --without flag with an empty string) or " \
|
51
|
+
"`rm -rf .bundle` to remove the .bundle/config manually and then `bundle install`"
|
52
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# Loads ActiveSupport::Concerns (or anything that can be passed to `include` really) under {#root}
|
2
|
+
class Metasploit::Concern::Loader
|
3
|
+
include ActiveModel::Validations
|
4
|
+
|
5
|
+
#
|
6
|
+
# Attributes
|
7
|
+
#
|
8
|
+
|
9
|
+
# @!attributes [rw] root
|
10
|
+
# Pathname under which to find concerns.
|
11
|
+
#
|
12
|
+
# @return [Pathname]
|
13
|
+
attr_accessor :root
|
14
|
+
|
15
|
+
#
|
16
|
+
# Validations
|
17
|
+
#
|
18
|
+
|
19
|
+
validates :root,
|
20
|
+
presence: true
|
21
|
+
|
22
|
+
#
|
23
|
+
# Methods
|
24
|
+
#
|
25
|
+
|
26
|
+
# Yields each constant under `parent_pathname`.
|
27
|
+
#
|
28
|
+
# @param parent_pathname [Pathname]
|
29
|
+
# @yield [constant]
|
30
|
+
# @yieldparam constant [Module] constant declared under `parent_pathname`.
|
31
|
+
# @yieldreturn [void]
|
32
|
+
# @return [void]
|
33
|
+
def each_pathname_constant(parent_pathname)
|
34
|
+
parent_pathname.each_child do |child_pathname|
|
35
|
+
constant = constantize_pathname(child_pathname)
|
36
|
+
|
37
|
+
if constant
|
38
|
+
yield constant
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Glob pattern for concerns.
|
44
|
+
#
|
45
|
+
# @return [Pathname]
|
46
|
+
def glob
|
47
|
+
root.join('**', '*.rb')
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param attributes [Hash{Symbol => String,nil}]
|
51
|
+
def initialize(attributes={})
|
52
|
+
attributes.each do |attribute, value|
|
53
|
+
public_send("#{attribute}=", value)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Set of Pathnames for `Module`s that will have concerns included.
|
58
|
+
#
|
59
|
+
# @return [Set<Pathname>]
|
60
|
+
def module_pathname_set
|
61
|
+
concern_paths = Dir.glob(glob)
|
62
|
+
|
63
|
+
concern_paths.each_with_object(Set.new) { |concern_path, module_pathname_set|
|
64
|
+
concern_pathname = Pathname.new(concern_path)
|
65
|
+
module_pathname = concern_pathname.parent
|
66
|
+
|
67
|
+
module_pathname_set.add module_pathname
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
# Registers load hooks with `ActiveSupport.on_load`.
|
72
|
+
#
|
73
|
+
# @return [void]
|
74
|
+
def register
|
75
|
+
module_pathname_set.each do |module_pathname|
|
76
|
+
relative_module_pathname = module_pathname.relative_path_from(root)
|
77
|
+
relative_module_path = relative_module_pathname.to_path
|
78
|
+
underscored_module_name = relative_module_path.gsub(File::SEPARATOR, '_')
|
79
|
+
on_load_name = underscored_module_name.to_sym
|
80
|
+
|
81
|
+
# on_load block is instance_evaled, so need to capture self
|
82
|
+
loader = self
|
83
|
+
|
84
|
+
ActiveSupport.on_load(on_load_name) do
|
85
|
+
loader.each_pathname_constant(module_pathname) do |concern|
|
86
|
+
include concern
|
87
|
+
end
|
88
|
+
|
89
|
+
if defined?(Rails) && Rails.env.development?
|
90
|
+
unloadable
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
# Converts `descendant_pathname`, which should be under {#root}, into a constant.
|
99
|
+
#
|
100
|
+
# @param descendant_pathname [Pathname] a Pathname under {#root}.
|
101
|
+
# @return [Object] if {#pathname_to_constant_name} returns a constant name
|
102
|
+
# @return [nil] otherwise
|
103
|
+
def constantize_pathname(descendant_pathname)
|
104
|
+
constant_name = pathname_to_constant_name(descendant_pathname)
|
105
|
+
|
106
|
+
constant = nil
|
107
|
+
|
108
|
+
if constant_name
|
109
|
+
constant = constant_name.constantize
|
110
|
+
end
|
111
|
+
|
112
|
+
constant
|
113
|
+
end
|
114
|
+
|
115
|
+
# Converts `descendant_pathname`, which should be under {#root}, into a constant name.
|
116
|
+
#
|
117
|
+
# @param descendant_pathname [Pathname] a Pathname under {#root}.
|
118
|
+
def pathname_to_constant_name(descendant_pathname)
|
119
|
+
extension_name = descendant_pathname.extname
|
120
|
+
constant_name = nil
|
121
|
+
|
122
|
+
if extension_name == '.rb'
|
123
|
+
constant_pathname = descendant_pathname.relative_path_from(root)
|
124
|
+
constant_name = constant_pathname.to_s.gsub(/.rb$/, '').camelize
|
125
|
+
end
|
126
|
+
|
127
|
+
constant_name
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
application = Rails.application
|
2
|
+
engines = application.railties.engines
|
3
|
+
|
4
|
+
# application is an engine
|
5
|
+
engines = [application, *engines]
|
6
|
+
|
7
|
+
engines.each do |engine|
|
8
|
+
concerns_path = engine.paths['app/concerns']
|
9
|
+
|
10
|
+
if concerns_path
|
11
|
+
concerns_directories = concerns_path.existent_directories
|
12
|
+
else
|
13
|
+
# app/concerns is not set, so just derive it from root. Cannot derive from app because it will glob app/models too
|
14
|
+
concerns_directories = [engine.root.join('app', 'concerns').to_path]
|
15
|
+
end
|
16
|
+
|
17
|
+
concerns_directories.each do |concerns_directory|
|
18
|
+
concerns_pathname = Pathname.new(concerns_directory)
|
19
|
+
loader = Metasploit::Concern::Loader.new(root: concerns_pathname)
|
20
|
+
loader.register
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Only include the Rails engine when using Rails. This is for compatibility with metasploit-framework.
|
2
|
+
if defined? Rails
|
3
|
+
require 'metasploit/concern/engine'
|
4
|
+
end
|
5
|
+
|
6
|
+
# Shared namespace for metasploit gems; used in {https://github.com/rapid7/metasploit-concern metasploit-concern},
|
7
|
+
# {https://github.com/rapid7/metasploit-framework metasploit-framework}, and
|
8
|
+
# {https://github.com/rapid7/metasploit-model metasploit-model}
|
9
|
+
module Metasploit
|
10
|
+
# Automates the inclusion of concerns into classes and models from other `Rail::Engine`s by use of an app/concerns
|
11
|
+
# directory in the `Rails::Engine` that declares the concerns.
|
12
|
+
#
|
13
|
+
# The `Class` or `Module` must support the use of concerns by calling ActiveSupport.run_load_hooks with a symbol equal
|
14
|
+
# to the underscore of its name with any '/' replaced with underscores also.
|
15
|
+
#
|
16
|
+
# @example engine_that_supports_concerns/app/models/model_that_supports_concerns.rb
|
17
|
+
# class EngineThatSupportsConcerns::ModelThatSupportsConcerns
|
18
|
+
# # declared as last statement in body so that concerns can redefine everything in class
|
19
|
+
# ActiveSupport.run_load_hooks(:engine_that_supports_concerns_model_that_supports_concerns, self)
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# To include concerns from a Rails::Application add 'app/concerns' to paths and then declare concerns under
|
23
|
+
# app/concerns.
|
24
|
+
#
|
25
|
+
# @example config/application.rb
|
26
|
+
# config.paths.add 'app/concerns', autoload: true
|
27
|
+
#
|
28
|
+
# @example Concern declared in application
|
29
|
+
# # app/concerns/engine_that_supports_concerns/model_that_supports_concerns/concern_from_application.rb
|
30
|
+
# module EngineThatSupportsConcerns::ModelThatSupportsConcerns::ConcernFromApplication
|
31
|
+
# extend ActiveSupport::Concern
|
32
|
+
#
|
33
|
+
# included do
|
34
|
+
# # run with self equal to EngineThatSupportsConcerns::ModelThatSupportsConcerns, but at the end of the class
|
35
|
+
# # definition, instead of at the beginning as would be the case with
|
36
|
+
# # class EngineThatSupportsConcerns::ModelThatSupportsConcerns
|
37
|
+
# # include EngineThatSupportsConcerns::ModelThatSupportsConcerns::ModelThatSupportsConcerns
|
38
|
+
# #
|
39
|
+
# # # body
|
40
|
+
# # end
|
41
|
+
# end
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# To include concerns from a Rails::Engine add 'app/concerns' to the paths and then declare concerns under
|
45
|
+
# app/concerns.
|
46
|
+
#
|
47
|
+
# @example Rails::Engine configuration for app/concerns
|
48
|
+
# # engine_defining_concerns/lib/engine_defining_concerns/engine.rb
|
49
|
+
# module EngineDefiningConcerns
|
50
|
+
# class Engine < Rails::Engine
|
51
|
+
# config.paths.add 'app/concerns', autoload: true
|
52
|
+
# end
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# @example Concern declared in Rails::Engine
|
56
|
+
# # engine_defining_concerns/app/concerns
|
57
|
+
# module EngineThatSupportsConcerns::ModelThatSupportsConcerns::ConcernFromEngine
|
58
|
+
# extend ActiveSupport::Concern
|
59
|
+
#
|
60
|
+
# included do
|
61
|
+
# # run with self equal to EngineThatSupportsConcerns::ModelThatSupportsConcerns, but at the end of the class
|
62
|
+
# # definition, instead of at the beginning as would be the case with
|
63
|
+
# # class EngineThatSupportsConcerns::ModelThatSupportsConcerns
|
64
|
+
# # include EngineThatSupportsConcerns::ModelThatSupportsConcerns::ModelThatSupportsConcerns
|
65
|
+
# #
|
66
|
+
# # # body
|
67
|
+
# # end
|
68
|
+
# end
|
69
|
+
# end
|
70
|
+
module Concern
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
begin
|
2
|
+
require 'rails'
|
3
|
+
rescue LoadError => error
|
4
|
+
warn "rails could not be loaded, so Metasploit::Concern::Engine will not be defined: #{error}"
|
5
|
+
else
|
6
|
+
module Metasploit
|
7
|
+
module Concern
|
8
|
+
class Engine < ::Rails::Engine
|
9
|
+
# @see http://viget.com/extend/rails-engine-testing-with-rspec-capybara-and-factorygirl
|
10
|
+
config.generators do |g|
|
11
|
+
g.assets false
|
12
|
+
g.helper false
|
13
|
+
g.test_framework :rspec, fixture: false
|
14
|
+
end
|
15
|
+
|
16
|
+
isolate_namespace Metasploit::Concern
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Metasploit
|
2
|
+
module Concern
|
3
|
+
# Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
|
4
|
+
module Version
|
5
|
+
# The major version number.
|
6
|
+
MAJOR = 0
|
7
|
+
# The minor version number, scoped to the {MAJOR} version number.
|
8
|
+
MINOR = 0
|
9
|
+
# The patch number, scoped to the {MINOR} version number.
|
10
|
+
PATCH = 2
|
11
|
+
|
12
|
+
# The full version string, including the {MAJOR}, {MINOR}, {PATCH}, and optionally, the `PRERELEASE` in the
|
13
|
+
# {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
|
14
|
+
#
|
15
|
+
# @return [String] '{MAJOR}.{MINOR}.{PATCH}' on master. '{MAJOR}.{MINOR}.{PATCH}-<PRERELEASE>' on any branch
|
16
|
+
# other than master.
|
17
|
+
def self.full
|
18
|
+
version = "#{MAJOR}.#{MINOR}.#{PATCH}"
|
19
|
+
|
20
|
+
if defined? PRERELEASE
|
21
|
+
version = "#{version}-#{PRERELEASE}"
|
22
|
+
end
|
23
|
+
|
24
|
+
version
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# @see Version.full
|
29
|
+
VERSION = Version.full
|
30
|
+
end
|
31
|
+
end
|
data/lib/tasks/yard.rake
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# @note All options not specific to any given rake task should go in the .yardopts file so they are available to both
|
2
|
+
# the below rake tasks and when invoking `yard` from the command line
|
3
|
+
|
4
|
+
if defined? YARD
|
5
|
+
namespace :yard do
|
6
|
+
YARD::Rake::YardocTask.new(:doc) do |t|
|
7
|
+
# --no-stats here as 'stats' task called after will print fuller stats
|
8
|
+
t.options = ['--no-stats']
|
9
|
+
|
10
|
+
t.after = Proc.new {
|
11
|
+
Rake::Task['yard:stats'].execute
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Shows stats for YARD Documentation including listing undocumented modules, classes, constants, and methods"
|
16
|
+
task :stats => :environment do
|
17
|
+
stats = YARD::CLI::Stats.new
|
18
|
+
stats.run('--compact', '--list-undoc')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# @todo Figure out how to just clone description from yard:doc
|
23
|
+
desc "Generate YARD documentation"
|
24
|
+
# allow calling namespace to as a task that goes to default task for namespace
|
25
|
+
task :yard => ['yard:doc']
|
26
|
+
|
27
|
+
task :default => :yard
|
28
|
+
else
|
29
|
+
puts 'YARD not defined, so yard tasks cannot be setup.'
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: metasploit-concern
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Luke Imhoff
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.0.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.0.0
|
33
|
+
description: Automatically includes Modules from app/concerns/<module_with_concerns>/<concern>.rb
|
34
|
+
into <module_with_concerns> to ease monkey-patching associations and validations
|
35
|
+
on ActiveRecord::Base descendents from other gems when layering schemas.
|
36
|
+
email:
|
37
|
+
- luke_imhoff@rapid7.com
|
38
|
+
executables: []
|
39
|
+
extensions: []
|
40
|
+
extra_rdoc_files: []
|
41
|
+
files:
|
42
|
+
- LICENSE
|
43
|
+
- README.md
|
44
|
+
- Rakefile
|
45
|
+
- app/models/metasploit/concern/loader.rb
|
46
|
+
- config/initializers/load_concerns.rb
|
47
|
+
- lib/metasploit/concern.rb
|
48
|
+
- lib/metasploit/concern/engine.rb
|
49
|
+
- lib/metasploit/concern/version.rb
|
50
|
+
- lib/tasks/yard.rake
|
51
|
+
homepage: https://github.com/rapid7/metasploit-concern
|
52
|
+
licenses:
|
53
|
+
- BSD-3-clause
|
54
|
+
metadata: {}
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
requirements: []
|
70
|
+
rubyforge_project:
|
71
|
+
rubygems_version: 2.2.2
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: Automatically include Modules from app/concerns
|
75
|
+
test_files: []
|
76
|
+
has_rdoc:
|