metasploit-concern 0.0.2 → 0.0.4

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDM5ZDczNDk1NzkwNTYzMTMzZGZlMTNlMmY3NzJjNDExMDMyNDg1Zg==
4
+ MzYzMTU5MmEzNWYwZjI0MWM1NDVlNTJmYThhYWU5ZjVmMmYxMmU5Yw==
5
5
  data.tar.gz: !binary |-
6
- ODI3MTBjNzAxNDdhNWY3ZTliYjVmMjFjN2NmNWU0MTM5NTY5Mjc2OA==
6
+ NjdjZDdlYzRlN2JjNTJmOWQyMTJiNTI2YTZlYzA3YTAzNDFiNDZlMw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MDBiMzliNWFlYzk5OWZjOGExMjc4MDYxZjQyMzJlNjRlYzIxNjJiNWFkM2Y3
10
- N2ViNjYxY2MyZmM3MzUxMGY5YTg2NmE5YmJmNTkxZTU3MGY5Mzk3YmNhMjZk
11
- NTk4YmMyODYwYTI1YTk0MWI2MDRmNjc4NTVkMTRlMjE3ZWI0NTQ=
9
+ YTIwZDRmNmZiNmNhODA4NDExYmRlNWQ4MDJjZTFhOWE1MDQ2NjRiYzUxYTIz
10
+ ZWRkZGU2ZDgxMzhhNDZjZGFiYzI5NWRkNTgyNzhkNGYwYWMxY2NlNGU5YmJh
11
+ OWQ1YjdhYjRiNzQyMGU0NWM2ODU1NWE0ZjdiMmRkZDBjYjIyNzk=
12
12
  data.tar.gz: !binary |-
13
- ODM0MGY3YTZiMTNkOTYwYTg5NWRjMDIxN2JlZDA2ZDllYTVmN2E2Y2ZkZDEy
14
- OGU3MDQyZWEyZmY5ZWFlZDcxM2ZlODg0Zjg4MGVkNmU2YjM4ZjUwYjc3YWY4
15
- YThlYzE0Mjg5MGYyMmE4ZjlmYTZjNDAyMGJkMWI5ZTIxYWU4NmY=
13
+ NjUzY2U3YjkwNWNmMmJmNWE0MGI2NDkwZWUwMmIxNDk0ZDVmZTkwOGM3ODVk
14
+ ODJhMDk4YzZmZmIxZTEzMWU2Y2M3MjA4MjU1YTkzOTg4NGE3NTE4MDZhNDAz
15
+ NDIwM2FmYjQ3NDdiNTRiZmVmYjZhODJiM2VjNjI0MDE3YjVlNzQ=
data/README.md CHANGED
@@ -1,7 +1,121 @@
1
1
  # Metasploit::Concern [![Build Status](https://travis-ci.org/rapid7/metasploit-concern.png)](https://travis-ci.org/rapid7/metasploit-concern)[![Code Climate](https://codeclimate.com/github/rapid7/metasploit-concern.png)](https://codeclimate.com/github/rapid7/metasploit-concern)[![Coverage Status](https://coveralls.io/repos/rapid7/metasploit-concern/badge.png)](https://coveralls.io/r/rapid7/metasploit-concern)[![Dependency Status](https://gemnasium.com/rapid7/metasploit-concern.png)](https://gemnasium.com/rapid7/metasploit-concern)[![Gem Version](https://badge.fury.io/rb/metasploit-concern.png)](http://badge.fury.io/rb/metasploit-concern)
2
2
 
3
+ `Metasploit::Concern` allows you to define concerns in `app/concerns` that will automatically be included in matching
4
+ classes. It can be used to automate adding new associations to `ActiveRecord::Base` models from gems and
5
+ `Rails::Engine`s.
6
+
3
7
  ## Versioning
4
8
 
5
9
  `Metasploit::Concern` is versioned using [semantic versioning 2.0](http://semver.org/spec/v2.0.0.html). Each branch
6
10
  should set `Metasploit::Concern::Version::PRERELEASE` to the branch name, while master should have no `PRERELEASE`
7
11
  and the `PRERELEASE` section of `Metasploit::Concern::VERSION` does not exist.
12
+
13
+ ## Installation
14
+
15
+ Add this line to your application's `Gemfile`:
16
+
17
+ gem 'metasploit-concern'
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install metasploit-concern
26
+
27
+ ## Supporting concerns
28
+
29
+ `Metasploit::Concern` support is a cooperative effort that involves the classes from the gem being setup
30
+ to allow downstream dependents to inject concerns.
31
+
32
+ In order for `Metasploit::Concern` to load concerns for `app/concerns`, the class on which `Module#include` will be
33
+ called must support `ActiveSupport` load hooks with a specific name format. You can run the appropriate load hooks
34
+ at the bottom of the class body:
35
+
36
+ class GemNamespace::GemClass < ActiveRecord::Base
37
+ # class body
38
+
39
+ Metasploit::Concern.run(self)
40
+ end
41
+
42
+ ### Testing
43
+
44
+ Include the shared examples from `Metasploit::Concern` in your `spec_helper.rb`:
45
+
46
+
47
+ Dir[Metasploit::Concern.root.join("spec/support/**/*.rb")].each do |f|
48
+ require f
49
+ end
50
+
51
+
52
+ To verify that your classes call `Metasploit::Concern.run` correctly, you can use the `'Metasploit::Concern.run'` shared
53
+ example:
54
+
55
+ # spec/app/models/gem_namespace/gem_class_spec.rb
56
+ describe GemNamespace::GemClass do
57
+ it_should_behave_like 'Metasploit::Concern.run'
58
+ end
59
+
60
+ ## Using concerns
61
+
62
+ Concerns are added in downstream dependents of gems that support concerns. These dependents can be a `Rails::Engines`
63
+ or full `Rails::Application`.
64
+
65
+ ### app/concerns
66
+
67
+ #### Rails::Application
68
+
69
+ Add this line to your application's `config/application.rb`:
70
+
71
+ config.paths.add 'app/concerns', autoload: true
72
+
73
+ Or if you're already using `config.autoload_paths +=`:
74
+
75
+ config.autoload_paths += config.root.join('app', 'concerns')
76
+
77
+ #### Rails::Engine
78
+
79
+ Add this line to your engine's class body:
80
+
81
+ module EngineNamespace
82
+ class Engine < ::Rails::Engine
83
+ config.paths.add 'app/concerns', autoload: true
84
+ end
85
+ end
86
+
87
+ ### Concerns
88
+
89
+ Define concerns for class under `app/concerns` by creating files under directories named after the namespaced class
90
+ names:
91
+
92
+ $ mkdir -p app/concerns/gem_namespace/gem_class
93
+ $ edit app/concerns/gem_namespace/gem_class/my_concern.rb
94
+
95
+ Inside each concern, make sure the `module` name matches file name:
96
+
97
+ module GemNamespace::GemClass::MyConcern
98
+ ...
99
+ end
100
+
101
+ Each concern is included using `Module#include` which means that the `included` method on each concern will be called.
102
+ Using `ActiveSupport::Concern` allow you to add new associations and or validations to `ActiveRecord::Base` subclass:
103
+
104
+ module GemNamespace::GemClass::MyConcern
105
+ extend ActiveSupport::Concern
106
+
107
+ included do
108
+ #
109
+ # Associations
110
+ #
111
+
112
+ # @!attribute widgets
113
+ # Widgets for this gem_class.
114
+ #
115
+ # @return [ActiveRecord::Relation<Widget>]
116
+ has_many :widgets,
117
+ class_name: 'Widget',
118
+ dependent: :destroy,
119
+ inverse_of :gem_namespace_gem_class
120
+ end
121
+ end
data/Rakefile CHANGED
@@ -30,6 +30,13 @@ Dir.glob(rakefile_glob) do |rakefile|
30
30
  load rakefile
31
31
  end
32
32
 
33
+ require 'cucumber'
34
+ require 'cucumber/rake/task'
35
+
36
+ Cucumber::Rake::Task.new(:features) do |t|
37
+ t.cucumber_opts = 'features --format pretty'
38
+ end
39
+
33
40
  begin
34
41
  require 'rspec/core'
35
42
  rescue LoadError
@@ -6,7 +6,7 @@ class Metasploit::Concern::Loader
6
6
  # Attributes
7
7
  #
8
8
 
9
- # @!attributes [rw] root
9
+ # @!attribute [rw] root
10
10
  # Pathname under which to find concerns.
11
11
  #
12
12
  # @return [Pathname]
@@ -1,8 +1,23 @@
1
+ #
2
+ # Gems
3
+ #
4
+
5
+ # `String#underscore``
6
+ require 'active_support/core_ext/string/inflections'
7
+ # `ActiveSupport.run_load_hooks`
8
+ require 'active_support/lazy_load_hooks'
9
+
10
+ #
11
+ # Project
12
+ #
13
+
1
14
  # Only include the Rails engine when using Rails. This is for compatibility with metasploit-framework.
2
15
  if defined? Rails
3
16
  require 'metasploit/concern/engine'
4
17
  end
5
18
 
19
+ require 'metasploit/concern/version'
20
+
6
21
  # Shared namespace for metasploit gems; used in {https://github.com/rapid7/metasploit-concern metasploit-concern},
7
22
  # {https://github.com/rapid7/metasploit-framework metasploit-framework}, and
8
23
  # {https://github.com/rapid7/metasploit-model metasploit-model}
@@ -10,13 +25,12 @@ module Metasploit
10
25
  # Automates the inclusion of concerns into classes and models from other `Rail::Engine`s by use of an app/concerns
11
26
  # directory in the `Rails::Engine` that declares the concerns.
12
27
  #
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.
28
+ # The `Class` or `Module` must support the use of concerns by calling {run}.
15
29
  #
16
30
  # @example engine_that_supports_concerns/app/models/model_that_supports_concerns.rb
17
31
  # class EngineThatSupportsConcerns::ModelThatSupportsConcerns
18
32
  # # 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)
33
+ # Metasploit::Concern.run(self)
20
34
  # end
21
35
  #
22
36
  # To include concerns from a Rails::Application add 'app/concerns' to paths and then declare concerns under
@@ -68,6 +82,29 @@ module Metasploit
68
82
  # end
69
83
  # end
70
84
  module Concern
85
+ # @note If `Rails` is loaded and {Metasploit::Concern::Engine} is defined, just use
86
+ # `Metasploit::Concern::Engine.root`.
87
+ #
88
+ # The root of the `metasploit-concern` gem's file tree.
89
+ #
90
+ # @return [Pathname]
91
+ def self.root
92
+ @root ||= Pathname.new(__FILE__).parent.parent.parent
93
+ end
71
94
 
95
+ # @note As `ActiveSupport.run_load_hooks` is used, it is safe to call {run} prior to {Metasploit::Concern}'s
96
+ # initializer {Metasploit::Concern::Loader#register registering} all the load hooks as any late load hooks will run
97
+ # as they are registered.
98
+ #
99
+ # @note `klass` must have a `Module#name` so that the load hook symbol can be derived.
100
+ #
101
+ # Runs the load hooks setup to include app/concerns concerns this `klass`.
102
+ #
103
+ # @param klass [Class] A class that should support loading concerns from app/concerns.
104
+ # @return [void]
105
+ def self.run(klass)
106
+ load_hook_name = klass.name.underscore.gsub('/', '_').to_sym
107
+ ActiveSupport.run_load_hooks(load_hook_name, klass)
108
+ end
72
109
  end
73
110
  end
@@ -7,7 +7,7 @@ module Metasploit
7
7
  # The minor version number, scoped to the {MAJOR} version number.
8
8
  MINOR = 0
9
9
  # The patch number, scoped to the {MINOR} version number.
10
- PATCH = 2
10
+ PATCH = 4
11
11
 
12
12
  # The full version string, including the {MAJOR}, {MINOR}, {PATCH}, and optionally, the `PRERELEASE` in the
13
13
  # {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
@@ -0,0 +1,34 @@
1
+ shared_examples_for 'Metasploit::Concern.run' do
2
+ let(:load_hook_name) {
3
+ described_class.name.underscore.gsub('/', '_').to_sym
4
+ }
5
+
6
+ let(:loaded_bases_by_name) {
7
+ ActiveSupport.module_eval { @loaded }
8
+ }
9
+
10
+ context 'with correct base' do
11
+ it 'calls ActiveSupport.run_load_hooks with correct load hook name' do
12
+ actual_names = []
13
+
14
+ loaded_bases_by_name.each do |name, bases|
15
+ bases.each do |base|
16
+ if base == described_class
17
+ actual_names << name
18
+ break
19
+ end
20
+ end
21
+ end
22
+
23
+ expect(actual_names).to include(load_hook_name)
24
+ end
25
+ end
26
+
27
+ context 'with correct load hook name' do
28
+ it 'calls ActiveSupport.run_load_hooks with correct base' do
29
+ actual_bases = loaded_bases_by_name[load_hook_name]
30
+
31
+ expect(actual_bases).to include(described_class)
32
+ end
33
+ end
34
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metasploit-concern
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luke Imhoff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-16 00:00:00.000000000 Z
11
+ date: 2014-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -48,6 +48,7 @@ files:
48
48
  - lib/metasploit/concern/engine.rb
49
49
  - lib/metasploit/concern/version.rb
50
50
  - lib/tasks/yard.rake
51
+ - spec/support/shared/examples/metasploit/concern/run.rb
51
52
  homepage: https://github.com/rapid7/metasploit-concern
52
53
  licenses:
53
54
  - BSD-3-clause