yard-metasploit-erd 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/.coveralls.yml +1 -0
- data/.gitignore +28 -0
- data/.rspec +2 -0
- data/.simplecov +42 -0
- data/.travis.yml +7 -0
- data/.yardopts +1 -0
- data/Gemfile +24 -0
- data/LICENSE +28 -0
- data/README.md +61 -0
- data/Rakefile +9 -0
- data/doc/example/images/mdm/module/author.erd.png +0 -0
- data/doc/example/images/mdm/module.erd.png +0 -0
- data/lib/tasks/yard.rake +32 -0
- data/lib/yard/metasploit/erd/version.rb +33 -0
- data/lib/yard/metasploit/erd.rb +43 -0
- data/lib/yard-metasploit-erd.rb +3 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/yard/metasploit/erd/version_spec.rb +143 -0
- data/spec/yard/metasploit/erd_spec.rb +15 -0
- data/templates/default/class/html/entity_relationship_diagram.erb +8 -0
- data/templates/default/class/html/setup.rb +25 -0
- data/templates/default/layout/html/entity_relationship_diagram.erb +8 -0
- data/templates/default/layout/html/setup.rb +73 -0
- data/templates/default/module/html/entity_relationship_diagram.erb +8 -0
- data/templates/default/module/html/setup.rb +60 -0
- data/yard-metasploit-erd.gemspec +33 -0
- metadata +159 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWE2Y2MxNTI0YzViNTYyZjZmN2E0Y2M2YTU4OTU0MjBkYTY5ODI5Mg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTIzNWQ5ZjgzNzU4ZjM4MzQ3NWY2MWQ4OWU5MzM4MzcxZjIwODk1Mw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ODdhNTRmYTIxNDcxNWMyMTliNDBlY2Q0OWJjNDE2MTQ3YTM3NmI4Mzc2YWU2
|
10
|
+
OWJiY2Y1MmE5OWRkN2MzYjMxNTgxZTFmYzZkZTM1Yzk0MTJlYjk4YzU4MjM4
|
11
|
+
YmI1ZmQ5NzYwMmRkMTE5NmViODcxYjBjNDNhMmI2N2U0NmNiMzY=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NjQ2YjhkNDVmMTFkNTRmYWY2OGRiNjI5ZjNlMmQ4OWU2OWRlZTkxMjM5YTIz
|
14
|
+
OGZhNTJkOTVhOTE0YzgxMmU1MTVhMjdjYjIxZTY4NDliNjgzOTBmNWI1MDNj
|
15
|
+
ZjhlZDQ0NTEyYjY0OGE2ZTEzZGZjMDExZDkwNjJlNzkyNTAxZDI=
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/.gitignore
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# bundler
|
2
|
+
.bundle
|
3
|
+
|
4
|
+
# Rubymine
|
5
|
+
.idea
|
6
|
+
|
7
|
+
# rvm files should not be checked in as multiple rubies are supported in the CI builds
|
8
|
+
.ruby-gemset
|
9
|
+
.ruby-version
|
10
|
+
.rvmrc
|
11
|
+
|
12
|
+
# YARD
|
13
|
+
.yardoc
|
14
|
+
/doc/*
|
15
|
+
!/doc/example
|
16
|
+
|
17
|
+
# simplecov
|
18
|
+
coverage
|
19
|
+
|
20
|
+
# @see http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/
|
21
|
+
Gemfile.lock
|
22
|
+
|
23
|
+
# built gems
|
24
|
+
pkg
|
25
|
+
*.gem
|
26
|
+
|
27
|
+
# compiled ruby from Rubinius
|
28
|
+
*.rbc
|
data/.rspec
ADDED
data/.simplecov
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# RM_INFO is set when using Rubymine. In Rubymine, starting SimpleCov is
|
2
|
+
# controlled by running with coverage, so don't explicitly start coverage (and
|
3
|
+
# therefore generate a report) when in Rubymine. This _will_ generate a report
|
4
|
+
# whenever `rake spec` is run.
|
5
|
+
unless ENV['RM_INFO']
|
6
|
+
SimpleCov.start
|
7
|
+
end
|
8
|
+
|
9
|
+
SimpleCov.configure do
|
10
|
+
# ignore this file
|
11
|
+
add_filter '.simplecov'
|
12
|
+
|
13
|
+
# Rake tasks aren't tested with rspec
|
14
|
+
add_filter 'Rakefile'
|
15
|
+
add_filter 'lib/tasks'
|
16
|
+
|
17
|
+
#
|
18
|
+
# Changed Files in Git Group
|
19
|
+
# @see http://fredwu.me/post/35625566267/simplecov-test-coverage-for-changed-files-only
|
20
|
+
#
|
21
|
+
|
22
|
+
untracked = `git ls-files --exclude-standard --others`
|
23
|
+
unstaged = `git diff --name-only`
|
24
|
+
staged = `git diff --name-only --cached`
|
25
|
+
all = untracked + unstaged + staged
|
26
|
+
changed_filenames = all.split("\n")
|
27
|
+
|
28
|
+
add_group 'Changed' do |source_file|
|
29
|
+
changed_filenames.detect { |changed_filename|
|
30
|
+
source_file.filename.end_with?(changed_filename)
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
add_group 'Libraries', 'lib'
|
35
|
+
|
36
|
+
#
|
37
|
+
# Specs are reported on to ensure that all examples are being run and all
|
38
|
+
# lets, befores, afters, etc are being used.
|
39
|
+
#
|
40
|
+
|
41
|
+
add_group 'Specs', 'spec'
|
42
|
+
end
|
data/.travis.yml
ADDED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--markup markdown
|
data/Gemfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in yard-metasploit-erd.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
group :development, :test do
|
7
|
+
# markdown formatting for yard
|
8
|
+
gem 'kramdown', platforms: :jruby
|
9
|
+
# markdown formatting for yard
|
10
|
+
gem 'redcarpet', platforms: :ruby
|
11
|
+
# documentation
|
12
|
+
# 0.8.7.4 has a bug where setters are not documented when @!attribute is used
|
13
|
+
gem 'yard', '< 0.8.7.4'
|
14
|
+
end
|
15
|
+
|
16
|
+
group :test do
|
17
|
+
# blank?
|
18
|
+
# restrict for compatibility with rest of metasploit ecosystem until it upgrades to Rails 4
|
19
|
+
gem 'activesupport', '>= 3.2', '< 4.0.0'
|
20
|
+
# Upload coverage reports to coveralls.io
|
21
|
+
gem 'coveralls', require: false
|
22
|
+
# code coverage of tests
|
23
|
+
gem 'simplecov', require: false
|
24
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Copyright (c) 2014 Rapid7, Inc.
|
2
|
+
|
3
|
+
License: BSD-3-clause
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
1. Redistributions of source code must retain the above copyright notice,
|
9
|
+
this list of conditions and the following disclaimer.
|
10
|
+
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
13
|
+
and/or other materials provided with the distribution.
|
14
|
+
|
15
|
+
3. Neither the name of Rapid7 LLC nor the names of its contributors
|
16
|
+
may be used to endorse or promote products derived from this software
|
17
|
+
without specific prior written permission.
|
18
|
+
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
23
|
+
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
24
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
25
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
26
|
+
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# YARD::Metasploit::ERD [](https://travis-ci.org/rapid7/yard-metasploit-erd)[](https://codeclimate.com/github/rapid7/yard-metasploit-erd)[](https://coveralls.io/r/rapid7/yard-metasploit-erd)[](https://gemnasium.com/rapid7/yard-metasploit-erd)[](http://badge.fury.io/rb/yard-metasploit-erd)
|
2
|
+
|
3
|
+
`yard-metasploit-erd` is a [YARD](yardoc.org) plugin that automatically inserts an "Entity-Relationship Diagram"
|
4
|
+
subsection containing a PNG Entity-Relationship Diagram for the entire schema (on the index page), for each Module that
|
5
|
+
contains `ActiveRecord::Base` subclasses and for each `ActiveRecord::Base` subclass.
|
6
|
+
|
7
|
+
For namespace Modules, the diagrams are restricted to the `ActiveRecord::Base` subclasses in that namespace and the
|
8
|
+
transitive closure of those classes `belongs_to` relationships.
|
9
|
+
|
10
|
+

|
11
|
+
|
12
|
+
For `ActiveRecord::Base` subclasses the diagram is restricted to the transitive closure of its `belongs_to`
|
13
|
+
relationships.
|
14
|
+
|
15
|
+

|
16
|
+
|
17
|
+
Using the `belongs_to` transitive closure means that all foreign keys are mapped to primary keys, so any diagram's
|
18
|
+
namespace or class could be extracted to another gem without leaving dangling foreign keys.
|
19
|
+
|
20
|
+
## Versioning
|
21
|
+
|
22
|
+
`YARD::Metasploit::ERD` is versioned using [semantic versioning 2.0](http://semver.org/spec/v2.0.0.html). Each branch
|
23
|
+
should set `YARD::Metasploit::ERD::Version::PRERELEASE` to the branch name, while master should have no `PRERELEASE`
|
24
|
+
and the `PRERELEASE` section of `YARD::Metasploit::ERD::VERSION` does not exist.
|
25
|
+
|
26
|
+
## Installation
|
27
|
+
|
28
|
+
Add this line to your application's `Gemfile`:
|
29
|
+
|
30
|
+
gem 'yard-metasploit-erd'
|
31
|
+
|
32
|
+
And then execute:
|
33
|
+
|
34
|
+
$ bundle
|
35
|
+
|
36
|
+
Or install it yourself as:
|
37
|
+
|
38
|
+
$ gem install yard-metasploit-erd
|
39
|
+
|
40
|
+
## Usage
|
41
|
+
|
42
|
+
Add this line to your application's `.yardopts`
|
43
|
+
|
44
|
+
--plugin yard-metasploit-erd
|
45
|
+
|
46
|
+
Ensure your `ActiveRecord::Base` subclasses are loaded when YARD runs by eager loading before the `yard:doc` task runs:
|
47
|
+
|
48
|
+
# lib/tasks/yard.rake
|
49
|
+
task 'yard:doc' => :eager_load
|
50
|
+
|
51
|
+
task eager_load: :environment do
|
52
|
+
Rails.application.eager_load!
|
53
|
+
end
|
54
|
+
|
55
|
+
## Contributing
|
56
|
+
|
57
|
+
1. Fork it ( https://github.com/[my-github-username]/yard-metasploit-erd/fork )
|
58
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
59
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
60
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
61
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
Binary file
|
Binary file
|
data/lib/tasks/yard.rake
ADDED
@@ -0,0 +1,32 @@
|
|
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
|
+
task :doc
|
16
|
+
|
17
|
+
desc "Shows stats for YARD Documentation including listing undocumented modules, classes, constants, and methods"
|
18
|
+
task :stats do
|
19
|
+
stats = YARD::CLI::Stats.new
|
20
|
+
stats.run('--compact', '--list-undoc')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# @todo Figure out how to just clone description from yard:doc
|
25
|
+
desc "Generate YARD documentation"
|
26
|
+
# allow calling namespace to as a task that goes to default task for namespace
|
27
|
+
task :yard => ['yard:doc']
|
28
|
+
|
29
|
+
task :default => :yard
|
30
|
+
else
|
31
|
+
puts 'YARD not defined, so yard tasks cannot be setup.'
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module YARD
|
2
|
+
module Metasploit
|
3
|
+
module ERD
|
4
|
+
# Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
|
5
|
+
module Version
|
6
|
+
# The major version number.
|
7
|
+
MAJOR = 0
|
8
|
+
# The minor version number, scoped to the {MAJOR} version number.
|
9
|
+
MINOR = 0
|
10
|
+
# The patch number, scoped to the {MINOR} version number.
|
11
|
+
PATCH = 2
|
12
|
+
|
13
|
+
# The full version string, including the {MAJOR}, {MINOR}, {PATCH}, and optionally, the {PRERELEASE} in the
|
14
|
+
# {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
|
15
|
+
#
|
16
|
+
# @return [String] '{MAJOR}.{MINOR}.{PATCH}' on master. '{MAJOR}.{MINOR}.{PATCH}-{PRERELEASE}' on any branch
|
17
|
+
# other than master.
|
18
|
+
def self.full
|
19
|
+
version = "#{MAJOR}.#{MINOR}.#{PATCH}"
|
20
|
+
|
21
|
+
if defined? PRERELEASE
|
22
|
+
version = "#{version}-#{PRERELEASE}"
|
23
|
+
end
|
24
|
+
|
25
|
+
version
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @see Version.full
|
30
|
+
VERSION = Version.full
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#
|
2
|
+
# Gems
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'yard'
|
6
|
+
|
7
|
+
#
|
8
|
+
# Project
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'yard/metasploit/erd/version'
|
12
|
+
|
13
|
+
# namespace inherited from `yard` gem itself
|
14
|
+
module YARD
|
15
|
+
# namespace to match primary gem, `metasploit-erd`, that is used by this yard plugin.
|
16
|
+
module Metasploit
|
17
|
+
# namespace to match primary gem, `metasploit-erd`, that is used by this yard plugin.
|
18
|
+
module ERD
|
19
|
+
# Registers {templates} in `YARD::Templates::Engine.templates_paths`.
|
20
|
+
#
|
21
|
+
# @return [void]
|
22
|
+
def self.register_template_path
|
23
|
+
YARD::Templates::Engine.register_template_path templates.to_path
|
24
|
+
end
|
25
|
+
|
26
|
+
# The root directory of the yard-metasploit-erd gem.
|
27
|
+
#
|
28
|
+
# @return [Pathname]
|
29
|
+
def self.root
|
30
|
+
@root ||= Pathname.new(__FILE__).parent.parent.parent.parent
|
31
|
+
end
|
32
|
+
|
33
|
+
# Path to the YARD templates for this YARD plugin.
|
34
|
+
#
|
35
|
+
# @return [Pathname]
|
36
|
+
def self.templates
|
37
|
+
root.join('templates')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
YARD::Metasploit::ERD.register_template_path
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
|
3
|
+
# require before 'metasploit/erd' so coverage is shown for files required by 'yard/metasploit/erd'
|
4
|
+
require 'simplecov'
|
5
|
+
require 'coveralls'
|
6
|
+
|
7
|
+
if ENV['TRAVIS'] == 'true'
|
8
|
+
# don't generate local report as it is inaccessible on travis-ci, which is why coveralls is being used.
|
9
|
+
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
10
|
+
else
|
11
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
12
|
+
# either generate the local report
|
13
|
+
SimpleCov::Formatter::HTMLFormatter
|
14
|
+
]
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'yard/metasploit/erd'
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'active_support/core_ext/object/blank'
|
4
|
+
|
5
|
+
describe YARD::Metasploit::ERD::Version do
|
6
|
+
context 'CONSTANTS' do
|
7
|
+
context 'MAJOR' do
|
8
|
+
subject(:major) do
|
9
|
+
described_class::MAJOR
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'is 0 because the API is not locked yet' do
|
13
|
+
expect(major).to eq(0)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'MINOR' do
|
18
|
+
subject(:minor) do
|
19
|
+
described_class::MINOR
|
20
|
+
end
|
21
|
+
|
22
|
+
it { should be_a Integer }
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'PATCH' do
|
26
|
+
subject(:patch) do
|
27
|
+
described_class::PATCH
|
28
|
+
end
|
29
|
+
|
30
|
+
it { should be_a Integer }
|
31
|
+
end
|
32
|
+
|
33
|
+
pull_request = ENV['TRAVIS_PULL_REQUEST']
|
34
|
+
|
35
|
+
# a pull request cannot check PRERELEASE because it will be tested in the target branch, but the source itself
|
36
|
+
# is from the source branch and so has the source branch PRERELEASE.
|
37
|
+
#
|
38
|
+
# PRERELEASE can only be set appropriately for a merge by merging to the target branch and then updating PRERELEASE
|
39
|
+
# on the target branch before committing and/or pushing to github and travis-ci.
|
40
|
+
if pull_request.nil? || pull_request == 'false'
|
41
|
+
context 'PREPRELEASE' do
|
42
|
+
subject(:prerelease) do
|
43
|
+
described_class::PRERELEASE
|
44
|
+
end
|
45
|
+
|
46
|
+
branch = ENV['TRAVIS_BRANCH']
|
47
|
+
|
48
|
+
if branch.blank?
|
49
|
+
branch = `git rev-parse --abbrev-ref HEAD`.strip
|
50
|
+
end
|
51
|
+
|
52
|
+
if branch == 'master'
|
53
|
+
it 'does not have a PRERELEASE' do
|
54
|
+
expect(defined? described_class::PRERELEASE).to be_nil
|
55
|
+
end
|
56
|
+
else
|
57
|
+
branch_regex = /\A(feature|staging)\/(?<prerelease>.*)\z/
|
58
|
+
match = branch.match(branch_regex)
|
59
|
+
|
60
|
+
if match
|
61
|
+
it 'matches the branch relative name' do
|
62
|
+
expect(prerelease).to eq(match[:prerelease])
|
63
|
+
end
|
64
|
+
else
|
65
|
+
tag_regex = /\Av(?<major>\d+).(?<minor>\d+).(?<patch>\d+)(-(?<prerelease>.*))?\z/
|
66
|
+
# travis-ci sets TRAVIS_BRANCH to the tag name for tag builds
|
67
|
+
match = branch.match(tag_regex)
|
68
|
+
|
69
|
+
if match
|
70
|
+
tag_prerelease = match[:prerelease]
|
71
|
+
|
72
|
+
if tag_prerelease
|
73
|
+
it 'matches the tag prerelease' do
|
74
|
+
expect(prerelease).to eq(tag_prerelease)
|
75
|
+
end
|
76
|
+
else
|
77
|
+
it 'does not have a PRERELEASE' do
|
78
|
+
expect(defined? described_class::PRERELEASE).to be_nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
else
|
82
|
+
it 'has a abbreviated reference that can be parsed for prerelease' do
|
83
|
+
fail "Do not know how to parse #{branch.inspect} for PRERELEASE"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'full' do
|
93
|
+
subject(:full) do
|
94
|
+
described_class.full
|
95
|
+
end
|
96
|
+
|
97
|
+
#
|
98
|
+
# lets
|
99
|
+
#
|
100
|
+
|
101
|
+
let(:major) do
|
102
|
+
1
|
103
|
+
end
|
104
|
+
|
105
|
+
let(:minor) do
|
106
|
+
2
|
107
|
+
end
|
108
|
+
|
109
|
+
let(:patch) do
|
110
|
+
3
|
111
|
+
end
|
112
|
+
|
113
|
+
before(:each) do
|
114
|
+
stub_const("#{described_class}::MAJOR", major)
|
115
|
+
stub_const("#{described_class}::MINOR", minor)
|
116
|
+
stub_const("#{described_class}::PATCH", patch)
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'with PRERELEASE' do
|
120
|
+
let(:prerelease) do
|
121
|
+
'prerelease'
|
122
|
+
end
|
123
|
+
|
124
|
+
before(:each) do
|
125
|
+
stub_const("#{described_class}::PRERELEASE", prerelease)
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'is <major>.<minor>.<patch>-<prerelease>' do
|
129
|
+
expect(full).to eq("#{major}.#{minor}.#{patch}-#{prerelease}")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'without PRERELEASE' do
|
134
|
+
before(:each) do
|
135
|
+
hide_const("#{described_class}::PRERELEASE")
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'is <major>.<minor>.<patch>' do
|
139
|
+
expect(full).to eq("#{major}.#{minor}.#{patch}")
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe YARD::Metasploit::ERD do
|
4
|
+
context 'CONSTANTS' do
|
5
|
+
context 'VERSION' do
|
6
|
+
subject(:version) do
|
7
|
+
described_class::VERSION
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'is YARD::Metasploit::ERD::Version.full' do
|
11
|
+
expect(version).to eq(YARD::Metasploit::ERD::Version.full)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<h2>Entity-Relationship Diagram</h2>
|
2
|
+
|
3
|
+
<figure>
|
4
|
+
<img src="<%= url_for_file("images/#{object.title.underscore}.erd.png") %>" alt="<%= object.title %> Entity-Relationship Diagram">
|
5
|
+
<figcaption>
|
6
|
+
The cluster found by tracing <code>belongs_to</code> associations from <code><%= object.title %></code>
|
7
|
+
</figcaption>
|
8
|
+
</figure>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# Gems
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'metasploit/erd'
|
6
|
+
|
7
|
+
def active_record?
|
8
|
+
inheritance_tree = object.inheritance_tree
|
9
|
+
inheritance_titles = inheritance_tree.map(&:title)
|
10
|
+
|
11
|
+
inheritance_titles.include? 'ActiveRecord::Base'
|
12
|
+
end
|
13
|
+
|
14
|
+
def entity
|
15
|
+
unless @entity
|
16
|
+
if active_record?
|
17
|
+
klass = object.title.constantize
|
18
|
+
@entity = ::Metasploit::ERD::Entity::Class.new(klass)
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
@entity
|
25
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#
|
2
|
+
# Gems
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'metasploit/erd'
|
6
|
+
require 'rails_erd/domain'
|
7
|
+
|
8
|
+
def init
|
9
|
+
super
|
10
|
+
|
11
|
+
if object == '_index.html'
|
12
|
+
layout = sections[:layout]
|
13
|
+
|
14
|
+
unless layout
|
15
|
+
raise ArgumentError,
|
16
|
+
"Could not find layout subsection in root sections"
|
17
|
+
end
|
18
|
+
|
19
|
+
index = layout[:index]
|
20
|
+
|
21
|
+
unless index
|
22
|
+
raise ArgumentError,
|
23
|
+
"Could not find index subsection in layout section"
|
24
|
+
end
|
25
|
+
|
26
|
+
index.place(:entity_relationship_diagram).before(:listing)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Generates a file to the output with the specified contents.
|
32
|
+
#
|
33
|
+
# @example saving a custom html file to the documenation root
|
34
|
+
#
|
35
|
+
# asset('my_custom.html','<html><body>Custom File</body></html>')
|
36
|
+
#
|
37
|
+
# @param [String] path relative to the document output where the file will be
|
38
|
+
# created.
|
39
|
+
# @param [String] content the contents that are saved to the file.
|
40
|
+
def asset(path, content)
|
41
|
+
if options.serializer
|
42
|
+
log.capture("Generating asset #{path}") do
|
43
|
+
options.serializer.serialize(path, content)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def entity_relationship_diagram
|
49
|
+
generate_entity_relationship_diagram
|
50
|
+
erb(:entity_relationship_diagram)
|
51
|
+
end
|
52
|
+
|
53
|
+
def generate_entity_relationship_diagram
|
54
|
+
domain = RailsERD::Domain.new(
|
55
|
+
ActiveRecord::Base.descendants,
|
56
|
+
# No entities should be missing because all desendents are in domain.
|
57
|
+
warn: true
|
58
|
+
)
|
59
|
+
|
60
|
+
Dir.mktmpdir { |directory|
|
61
|
+
filename = File.join(directory, '_index.erd')
|
62
|
+
diagram = ::Metasploit::ERD::Diagram.new(
|
63
|
+
domain,
|
64
|
+
filename: filename,
|
65
|
+
title: 'Entity-Relationship Diagram'
|
66
|
+
)
|
67
|
+
temporary_path = diagram.create
|
68
|
+
|
69
|
+
content = File.read(temporary_path)
|
70
|
+
asset_path = File.join('images', "_index.erd.#{diagram.send(:filetype)}")
|
71
|
+
asset(asset_path, content)
|
72
|
+
}
|
73
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<h2>Entity-Relationship Diagram</h2>
|
2
|
+
|
3
|
+
<figure>
|
4
|
+
<img src="<%= url_for_file("images/#{object.title.underscore}.erd.png") %>" alt="<%= object.title %> Entity-Relationship Diagram">
|
5
|
+
<figcaption>
|
6
|
+
The cluster found by tracing <code>belongs_to</code> associations from <code>ActiveRecord::Base</code> descendants under the <code><%= object.title %></code> namespace.
|
7
|
+
</figcaption>
|
8
|
+
</figure>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#
|
2
|
+
# Standard Library
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'tempfile'
|
6
|
+
|
7
|
+
#
|
8
|
+
# Gems
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'metasploit/erd'
|
12
|
+
|
13
|
+
def init
|
14
|
+
super
|
15
|
+
sections.place(:entity_relationship_diagram).before(:children)
|
16
|
+
end
|
17
|
+
|
18
|
+
def entity_relationship_diagram
|
19
|
+
unless erd_empty?
|
20
|
+
generate_entity_relationship_diagram
|
21
|
+
erb(:entity_relationship_diagram)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def erd_empty?
|
26
|
+
entity.cluster.class_set.empty?
|
27
|
+
end
|
28
|
+
|
29
|
+
def entity
|
30
|
+
@entity ||= ::Metasploit::ERD::Entity::Namespace.new(object.title)
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Generates a file to the output with the specified contents.
|
35
|
+
#
|
36
|
+
# @example saving a custom html file to the documenation root
|
37
|
+
#
|
38
|
+
# asset('my_custom.html','<html><body>Custom File</body></html>')
|
39
|
+
#
|
40
|
+
# @param [String] path relative to the document output where the file will be
|
41
|
+
# created.
|
42
|
+
# @param [String] content the contents that are saved to the file.
|
43
|
+
def asset(path, content)
|
44
|
+
if options.serializer
|
45
|
+
log.capture("Generating asset #{path}") do
|
46
|
+
options.serializer.serialize(path, content)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def generate_entity_relationship_diagram
|
52
|
+
Dir.mktmpdir { |directory|
|
53
|
+
diagram = entity.diagram(directory: directory)
|
54
|
+
temporary_path = diagram.create
|
55
|
+
|
56
|
+
content = File.read(temporary_path)
|
57
|
+
asset_path = File.join('images', "#{object.title.underscore}.erd.#{diagram.send(:filetype)}")
|
58
|
+
asset(asset_path, content)
|
59
|
+
}
|
60
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'yard/metasploit/erd/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'yard-metasploit-erd'
|
8
|
+
spec.version = YARD::Metasploit::ERD::VERSION
|
9
|
+
spec.authors = ['Luke Imhoff']
|
10
|
+
spec.email = ['luke_imhoff@rapid7.com']
|
11
|
+
spec.summary = 'YARD plugin that add Metasploit::ERDs to namespaces and classes'
|
12
|
+
spec.description = "YARD plugin that uses metasploit-erd to add Entity-Relationship Diagrams to each namespace " \
|
13
|
+
"Module and ActiveRecord::Base subclass's documentation."
|
14
|
+
spec.homepage = 'https://github.com/rapid7/yard-metasploit-erd'
|
15
|
+
spec.license = 'BSD-3-clause'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0")
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.5'
|
23
|
+
spec.add_development_dependency 'rake', '~> 10.3'
|
24
|
+
spec.add_development_dependency 'rspec', '~> 2.14'
|
25
|
+
|
26
|
+
# Generates namespace Module and Class<ActiveRecord::Base> specific ERDs for use in templates
|
27
|
+
spec.add_runtime_dependency 'metasploit-erd', '0.0.1'
|
28
|
+
# RailsERD::Domain is used directly to generate the _index.html ERD.
|
29
|
+
spec.add_runtime_dependency 'rails-erd'
|
30
|
+
# documentation
|
31
|
+
# 0.8.7.4 has a bug where setters are not documented when @!attribute is used
|
32
|
+
spec.add_runtime_dependency 'yard', '<= 0.8.7.4'
|
33
|
+
end
|
metadata
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yard-metasploit-erd
|
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-05-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.5'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.14'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.14'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: metasploit-erd
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.0.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.0.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rails-erd
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: yard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - <=
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.8.7.4
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - <=
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.8.7.4
|
97
|
+
description: YARD plugin that uses metasploit-erd to add Entity-Relationship Diagrams
|
98
|
+
to each namespace Module and ActiveRecord::Base subclass's documentation.
|
99
|
+
email:
|
100
|
+
- luke_imhoff@rapid7.com
|
101
|
+
executables: []
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- .coveralls.yml
|
106
|
+
- .gitignore
|
107
|
+
- .rspec
|
108
|
+
- .simplecov
|
109
|
+
- .travis.yml
|
110
|
+
- .yardopts
|
111
|
+
- Gemfile
|
112
|
+
- LICENSE
|
113
|
+
- README.md
|
114
|
+
- Rakefile
|
115
|
+
- doc/example/images/mdm/module.erd.png
|
116
|
+
- doc/example/images/mdm/module/author.erd.png
|
117
|
+
- lib/tasks/yard.rake
|
118
|
+
- lib/yard-metasploit-erd.rb
|
119
|
+
- lib/yard/metasploit/erd.rb
|
120
|
+
- lib/yard/metasploit/erd/version.rb
|
121
|
+
- spec/spec_helper.rb
|
122
|
+
- spec/yard/metasploit/erd/version_spec.rb
|
123
|
+
- spec/yard/metasploit/erd_spec.rb
|
124
|
+
- templates/default/class/html/entity_relationship_diagram.erb
|
125
|
+
- templates/default/class/html/setup.rb
|
126
|
+
- templates/default/layout/html/entity_relationship_diagram.erb
|
127
|
+
- templates/default/layout/html/setup.rb
|
128
|
+
- templates/default/module/html/entity_relationship_diagram.erb
|
129
|
+
- templates/default/module/html/setup.rb
|
130
|
+
- yard-metasploit-erd.gemspec
|
131
|
+
homepage: https://github.com/rapid7/yard-metasploit-erd
|
132
|
+
licenses:
|
133
|
+
- BSD-3-clause
|
134
|
+
metadata: {}
|
135
|
+
post_install_message:
|
136
|
+
rdoc_options: []
|
137
|
+
require_paths:
|
138
|
+
- lib
|
139
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
|
+
requirements:
|
146
|
+
- - ! '>='
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: '0'
|
149
|
+
requirements: []
|
150
|
+
rubyforge_project:
|
151
|
+
rubygems_version: 2.2.2
|
152
|
+
signing_key:
|
153
|
+
specification_version: 4
|
154
|
+
summary: YARD plugin that add Metasploit::ERDs to namespaces and classes
|
155
|
+
test_files:
|
156
|
+
- spec/spec_helper.rb
|
157
|
+
- spec/yard/metasploit/erd/version_spec.rb
|
158
|
+
- spec/yard/metasploit/erd_spec.rb
|
159
|
+
has_rdoc:
|