devtools 0.1.0
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 +7 -0
- data/.gitignore +37 -0
- data/.rspec +5 -0
- data/.rubocop.yml +5 -0
- data/.ruby-gemset +1 -0
- data/.travis.yml +15 -0
- data/Gemfile +5 -0
- data/LICENSE +20 -0
- data/README.md +47 -0
- data/Rakefile +5 -0
- data/TODO +0 -0
- data/bin/devtools +18 -0
- data/circle.yml +7 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/mutant.yml +2 -0
- data/config/reek.yml +107 -0
- data/config/rubocop.yml +117 -0
- data/config/yardstick.yml +2 -0
- data/default/config/devtools.yml +2 -0
- data/default/config/flay.yml +3 -0
- data/default/config/flog.yml +2 -0
- data/default/config/mutant.yml +3 -0
- data/default/config/reek.yml +103 -0
- data/default/config/rubocop.yml +91 -0
- data/default/config/yardstick.yml +2 -0
- data/devtools.gemspec +33 -0
- data/lib/devtools.rb +143 -0
- data/lib/devtools/config.rb +158 -0
- data/lib/devtools/platform.rb +118 -0
- data/lib/devtools/project.rb +157 -0
- data/lib/devtools/project/initializer.rb +21 -0
- data/lib/devtools/project/initializer/rake.rb +19 -0
- data/lib/devtools/project/initializer/rspec.rb +105 -0
- data/lib/devtools/site.rb +41 -0
- data/lib/devtools/site/initializer.rb +57 -0
- data/lib/devtools/spec_helper.rb +5 -0
- data/shared/spec/shared/abstract_type_behavior.rb +18 -0
- data/shared/spec/shared/command_method_behavior.rb +7 -0
- data/shared/spec/shared/each_method_behaviour.rb +15 -0
- data/shared/spec/shared/hash_method_behavior.rb +9 -0
- data/shared/spec/shared/idempotent_method_behavior.rb +12 -0
- data/shared/spec/support/ice_nine_config.rb +14 -0
- data/spec/spec_helper.rb +31 -0
- data/tasks/metrics/ci.rake +18 -0
- data/tasks/metrics/coverage.rake +13 -0
- data/tasks/metrics/flay.rake +48 -0
- data/tasks/metrics/flog.rake +40 -0
- data/tasks/metrics/mutant.rake +50 -0
- data/tasks/metrics/reek.rake +7 -0
- data/tasks/metrics/rubocop.rake +15 -0
- data/tasks/metrics/yardstick.rake +26 -0
- data/tasks/spec.rake +36 -0
- data/tasks/yard.rake +11 -0
- metadata +284 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Devtools
|
4
|
+
|
5
|
+
# Provides methods to determine the ruby platform
|
6
|
+
module Platform
|
7
|
+
|
8
|
+
DEFAULT_RVM_NAME = 'mri'.freeze
|
9
|
+
|
10
|
+
# Return Ruby engine string
|
11
|
+
#
|
12
|
+
# @return [String]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
def ruby_engine
|
16
|
+
@ruby_engine ||= (defined?(RUBY_ENGINE) && RUBY_ENGINE || 'ruby').freeze
|
17
|
+
end
|
18
|
+
|
19
|
+
# Return RVM name
|
20
|
+
#
|
21
|
+
# @return [String]
|
22
|
+
#
|
23
|
+
# @api private
|
24
|
+
def rvm_name
|
25
|
+
@rvm_name ||= begin
|
26
|
+
engine = ruby_engine
|
27
|
+
engine == 'ruby' ? DEFAULT_RVM_NAME : engine
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Return RVM string
|
32
|
+
#
|
33
|
+
# @return [String]
|
34
|
+
#
|
35
|
+
# @api private
|
36
|
+
def rvm
|
37
|
+
@rvm ||= "#{rvm_name}-#{RUBY_VERSION}".freeze
|
38
|
+
end
|
39
|
+
|
40
|
+
# Test for being executed under JRuby
|
41
|
+
#
|
42
|
+
# @return [true]
|
43
|
+
# if running under JRuby
|
44
|
+
#
|
45
|
+
# @return [false]
|
46
|
+
# otherwise
|
47
|
+
#
|
48
|
+
# @api private
|
49
|
+
def jruby?
|
50
|
+
ruby_engine == 'jruby'
|
51
|
+
end
|
52
|
+
|
53
|
+
# Test for being executed under rbx
|
54
|
+
#
|
55
|
+
# @return [true]
|
56
|
+
# if running under rbx
|
57
|
+
#
|
58
|
+
# @return [false]
|
59
|
+
# otherwise
|
60
|
+
#
|
61
|
+
# @api private
|
62
|
+
def rbx?
|
63
|
+
ruby_engine == 'rbx'
|
64
|
+
end
|
65
|
+
|
66
|
+
# Test for being executed under rubies with a JIT
|
67
|
+
#
|
68
|
+
# @return [true]
|
69
|
+
# if running under JRuby or rbx
|
70
|
+
#
|
71
|
+
# @return [false]
|
72
|
+
# otherwise
|
73
|
+
#
|
74
|
+
# @api private
|
75
|
+
def jit?
|
76
|
+
jruby? || rbx?
|
77
|
+
end
|
78
|
+
|
79
|
+
# Test for 1.8 mode
|
80
|
+
#
|
81
|
+
# @return [true]
|
82
|
+
# if running under 1.8.x
|
83
|
+
#
|
84
|
+
# @return [false]
|
85
|
+
# otherwise
|
86
|
+
#
|
87
|
+
# @api private
|
88
|
+
def ruby18?
|
89
|
+
RUBY_VERSION.start_with?('1.8.')
|
90
|
+
end
|
91
|
+
|
92
|
+
# Test for 1.9 mode
|
93
|
+
#
|
94
|
+
# @return [true]
|
95
|
+
# if running under 1.9.x
|
96
|
+
#
|
97
|
+
# @return [false]
|
98
|
+
# otherwise
|
99
|
+
#
|
100
|
+
# @api private
|
101
|
+
def ruby19?
|
102
|
+
RUBY_VERSION.start_with?('1.9.')
|
103
|
+
end
|
104
|
+
|
105
|
+
# Test for 2.0 mode
|
106
|
+
#
|
107
|
+
# @return [true]
|
108
|
+
# if running under 2.0.x
|
109
|
+
#
|
110
|
+
# @return [false]
|
111
|
+
# otherwise
|
112
|
+
#
|
113
|
+
# @api private
|
114
|
+
def ruby20?
|
115
|
+
RUBY_VERSION.start_with?('2.0.')
|
116
|
+
end
|
117
|
+
end # module Platform
|
118
|
+
end # module Devtools
|
@@ -0,0 +1,157 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Devtools
|
4
|
+
|
5
|
+
# The project devtools supports
|
6
|
+
class Project
|
7
|
+
|
8
|
+
# The reek configuration
|
9
|
+
#
|
10
|
+
# @return [Config::Reek]
|
11
|
+
#
|
12
|
+
# @api private
|
13
|
+
attr_reader :reek
|
14
|
+
|
15
|
+
# The rubocop configuration
|
16
|
+
#
|
17
|
+
# @return [Config::Rubocop]
|
18
|
+
#
|
19
|
+
# @api private
|
20
|
+
attr_reader :rubocop
|
21
|
+
|
22
|
+
# The flog configuration
|
23
|
+
#
|
24
|
+
# @return [Config::Flog]
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
attr_reader :flog
|
28
|
+
|
29
|
+
# The yardstick configuration
|
30
|
+
#
|
31
|
+
# @return [Config::Yardstick]
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
attr_reader :yardstick
|
35
|
+
|
36
|
+
# The flay configuration
|
37
|
+
#
|
38
|
+
# @return [Config::Flay]
|
39
|
+
#
|
40
|
+
# @api private
|
41
|
+
attr_reader :flay
|
42
|
+
|
43
|
+
# The mutant configuration
|
44
|
+
#
|
45
|
+
# @return [Config::Mutant]
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
attr_reader :mutant
|
49
|
+
|
50
|
+
# The devtools configuration
|
51
|
+
#
|
52
|
+
# @return [Config::Devtools]
|
53
|
+
#
|
54
|
+
# @api private
|
55
|
+
attr_reader :devtools
|
56
|
+
|
57
|
+
# Return project root
|
58
|
+
#
|
59
|
+
# @return [Pathname]
|
60
|
+
#
|
61
|
+
# @api private
|
62
|
+
#
|
63
|
+
attr_reader :root
|
64
|
+
|
65
|
+
# The default config path
|
66
|
+
#
|
67
|
+
# @return [Pathname]
|
68
|
+
#
|
69
|
+
# @api private
|
70
|
+
attr_reader :default_config_path
|
71
|
+
|
72
|
+
# The lib directory
|
73
|
+
#
|
74
|
+
# @return [Pathname]
|
75
|
+
#
|
76
|
+
# @api private
|
77
|
+
attr_reader :lib_dir
|
78
|
+
|
79
|
+
# The Ruby file pattern
|
80
|
+
#
|
81
|
+
# @return [Pathname]
|
82
|
+
#
|
83
|
+
# @api private
|
84
|
+
attr_reader :file_pattern
|
85
|
+
|
86
|
+
# The spec root
|
87
|
+
#
|
88
|
+
# @return [Pathname]
|
89
|
+
#
|
90
|
+
# @api private
|
91
|
+
attr_reader :spec_root
|
92
|
+
|
93
|
+
# Return config directory
|
94
|
+
#
|
95
|
+
# @return [Pathname]
|
96
|
+
#
|
97
|
+
# @api private
|
98
|
+
attr_reader :config_dir
|
99
|
+
|
100
|
+
# The unit test timeout
|
101
|
+
#
|
102
|
+
# @return [Numeric]
|
103
|
+
#
|
104
|
+
# @api private
|
105
|
+
attr_reader :unit_test_timeout
|
106
|
+
|
107
|
+
# Initialize object
|
108
|
+
#
|
109
|
+
# @param [Pathname] root
|
110
|
+
#
|
111
|
+
# @return [undefined]
|
112
|
+
#
|
113
|
+
# @api private
|
114
|
+
#
|
115
|
+
def initialize(root)
|
116
|
+
@root = root
|
117
|
+
|
118
|
+
initialize_environment
|
119
|
+
initialize_configs
|
120
|
+
|
121
|
+
@unit_test_timeout = @devtools.unit_test_timeout
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
# Initialize environment
|
127
|
+
#
|
128
|
+
# @return [undefined]
|
129
|
+
#
|
130
|
+
# @api private
|
131
|
+
#
|
132
|
+
def initialize_environment
|
133
|
+
@default_config_path = @root.join(DEFAULT_CONFIG_DIR_NAME).freeze
|
134
|
+
@lib_dir = @root.join(LIB_DIRECTORY_NAME).freeze
|
135
|
+
@spec_root = @root.join(SPEC_DIRECTORY_NAME).freeze
|
136
|
+
@file_pattern = @lib_dir.join(RB_FILE_PATTERN).freeze
|
137
|
+
@config_dir = @default_config_path
|
138
|
+
end
|
139
|
+
|
140
|
+
# Initialize configs
|
141
|
+
#
|
142
|
+
# @return [undefined]
|
143
|
+
#
|
144
|
+
# @api private
|
145
|
+
#
|
146
|
+
def initialize_configs
|
147
|
+
@reek = Config::Reek.new(self)
|
148
|
+
@rubocop = Config::Rubocop.new(self)
|
149
|
+
@flog = Config::Flog.new(self)
|
150
|
+
@yardstick = Config::Yardstick.new(self)
|
151
|
+
@flay = Config::Flay.new(self)
|
152
|
+
@mutant = Config::Mutant.new(self)
|
153
|
+
@devtools = Config::Devtools.new(self)
|
154
|
+
end
|
155
|
+
|
156
|
+
end # class Project
|
157
|
+
end # module Devtools
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Devtools
|
4
|
+
class Project
|
5
|
+
|
6
|
+
# Base class for project initializers
|
7
|
+
class Initializer
|
8
|
+
|
9
|
+
attr_reader :project
|
10
|
+
protected :project
|
11
|
+
|
12
|
+
def initialize(project)
|
13
|
+
@project = project
|
14
|
+
end
|
15
|
+
|
16
|
+
def call
|
17
|
+
fail NotImplementedError, "#{self.class}##{__method__} must be implemented"
|
18
|
+
end
|
19
|
+
end # class Initializer
|
20
|
+
end # class Project
|
21
|
+
end # module Devtools
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Devtools
|
4
|
+
class Project
|
5
|
+
class Initializer
|
6
|
+
|
7
|
+
# Imports all devtools rake tasks into a project
|
8
|
+
class Rake
|
9
|
+
|
10
|
+
extend ::Rake::DSL
|
11
|
+
|
12
|
+
def self.call
|
13
|
+
FileList[RAKE_FILES_GLOB].each(&method(:import))
|
14
|
+
end
|
15
|
+
|
16
|
+
end # class Rake
|
17
|
+
end # class Initializer
|
18
|
+
end # class Project
|
19
|
+
end # module Devtools
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Devtools
|
4
|
+
class Project
|
5
|
+
class Initializer
|
6
|
+
|
7
|
+
# Requires all shared specs in a project's spec_helper
|
8
|
+
# Also installs a configurable unit test timeout
|
9
|
+
class Rspec < self
|
10
|
+
|
11
|
+
def self.require_files(directory)
|
12
|
+
Devtools.require_files(directory, SHARED_SPEC_PATTERN)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Initialize RSpec for +project+
|
16
|
+
#
|
17
|
+
# @param [Project] project
|
18
|
+
# the project to initialize
|
19
|
+
#
|
20
|
+
# @return [Rspec]
|
21
|
+
#
|
22
|
+
# @api private
|
23
|
+
def self.call(project)
|
24
|
+
new(project).call
|
25
|
+
end
|
26
|
+
|
27
|
+
# The spec root
|
28
|
+
#
|
29
|
+
# @return [Pathname]
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
attr_reader :spec_root
|
33
|
+
private :spec_root
|
34
|
+
|
35
|
+
# The unit test timeout
|
36
|
+
#
|
37
|
+
# @return [Numeric]
|
38
|
+
#
|
39
|
+
# @api private
|
40
|
+
attr_reader :unit_test_timeout
|
41
|
+
private :unit_test_timeout
|
42
|
+
|
43
|
+
# Initialize a new instance
|
44
|
+
#
|
45
|
+
# @param [Project] project
|
46
|
+
# the project to initialize
|
47
|
+
#
|
48
|
+
# @param [Numeric] unit_test_timeout
|
49
|
+
# the maximum time a single unit test can take
|
50
|
+
#
|
51
|
+
# @return [undefined]
|
52
|
+
#
|
53
|
+
# @api private
|
54
|
+
def initialize(project)
|
55
|
+
super
|
56
|
+
@spec_root = project.spec_root
|
57
|
+
@unit_test_timeout = project.unit_test_timeout
|
58
|
+
end
|
59
|
+
|
60
|
+
# Setup RSpec for {#project}
|
61
|
+
#
|
62
|
+
# @return [self]
|
63
|
+
#
|
64
|
+
# @api private
|
65
|
+
def call
|
66
|
+
require 'rspec'
|
67
|
+
require 'rspec/its'
|
68
|
+
require_shared_spec_files
|
69
|
+
enable_unit_test_timeout unless Devtools.jit?
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
# Timeout unit tests that take longer than 1/10th of a second
|
76
|
+
#
|
77
|
+
# @param [Numeric] timeout
|
78
|
+
#
|
79
|
+
# @return [undefined]
|
80
|
+
#
|
81
|
+
# @raise [Timeout::Error]
|
82
|
+
# raised when the times are outside the timeout
|
83
|
+
#
|
84
|
+
# @api private
|
85
|
+
#
|
86
|
+
def enable_unit_test_timeout
|
87
|
+
timeout = unit_test_timeout # support the closure
|
88
|
+
RSpec.configuration.around file_path: UNIT_TEST_PATH_REGEXP do |example|
|
89
|
+
Timeout.timeout(timeout, &example)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def require_shared_spec_files
|
94
|
+
require_files(SHARED_SPEC_PATH)
|
95
|
+
require_files(spec_root)
|
96
|
+
end
|
97
|
+
|
98
|
+
def require_files(directory)
|
99
|
+
self.class.require_files(directory)
|
100
|
+
end
|
101
|
+
|
102
|
+
end # class Rspec
|
103
|
+
end # class Initializer
|
104
|
+
end # class Project
|
105
|
+
end # module Devtools
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Devtools
|
4
|
+
|
5
|
+
# Encapsulates a specific {Project} devtools is used for
|
6
|
+
class Site
|
7
|
+
|
8
|
+
attr_reader :root
|
9
|
+
|
10
|
+
attr_reader :project
|
11
|
+
|
12
|
+
def initialize(project)
|
13
|
+
@project = project
|
14
|
+
@root = project.root
|
15
|
+
end
|
16
|
+
|
17
|
+
# Initialize project and load shared specs
|
18
|
+
#
|
19
|
+
# Expects to be called from $application_root/spec/spec_helper.rb
|
20
|
+
#
|
21
|
+
# @return [self]
|
22
|
+
#
|
23
|
+
# @api private
|
24
|
+
def init_spec_helper
|
25
|
+
Project::Initializer::Rspec.call(project)
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
# Initialize devtools using default config
|
30
|
+
#
|
31
|
+
# @return [undefined]
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
def init
|
35
|
+
Initializer.call(self)
|
36
|
+
puts 'Run bundle install to complete the devtools installation'
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
end # class Site
|
41
|
+
end # module Devtools
|