autoloaded 0.0.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +12 -0
- data/Gemfile +10 -6
- data/Guardfile +4 -1
- data/History.markdown +9 -0
- data/License.md +6 -4
- data/README.md +37 -6
- data/Rakefile +1 -1
- data/autoloaded.gemspec +1 -1
- data/lib/autoloaded/constant.rb +41 -16
- data/lib/autoloaded/version.rb +1 -1
- data/lib/tasks.rb +3 -0
- data/lib/tasks/build_doc.rake +8 -0
- data/lib/tasks/lib_each.rake +13 -0
- data/lib/tasks/spec.rake +70 -0
- data/lib/tasks/spec_each.rake +19 -0
- data/spec/autoloaded/constant_spec.rb +23 -9
- data/spec/{autoloaded/shallow_spec.rb → autoloaded_spec.rb} +7 -2
- data/spec/fixtures/filenames/afile-name.rb +0 -0
- data/spec/fixtures/filenames/afile_name.rb +0 -0
- data/spec/fixtures/namespace_that_is_autoloaded_unconventionally/nest_ed.rb +0 -1
- data/spec/matchers.rb +34 -51
- data/spec/spec_helper.rb +4 -0
- data/spec/support/without_side_effects.rb +31 -0
- metadata +29 -18
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87da530be678da00a0d6d8df5ef7d6ca2c773f04
|
4
|
+
data.tar.gz: a97be0b94d97e9a251cab40509e61c49e65f97e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ae33778e6eb8560c101c5a44f995e321b3963e96721fc22b69c55eaa69b6648d9921080e44842f7c6f9460e151376ee8bc39dda02541630a938eb9c426e2d52
|
7
|
+
data.tar.gz: c745087aa0cd848990c3c222d475559e4d27fe86c9f86eeffd50941df790d75dfd15dd0cb15b2b91a4270d5112bd5cae32de78024a27f9c0af9d9ced11609cbb
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -3,18 +3,22 @@ source 'https://rubygems.org'
|
|
3
3
|
gemspec
|
4
4
|
|
5
5
|
group :debug do
|
6
|
-
gem 'pry-byebug',
|
7
|
-
gem 'pry-debugger',
|
6
|
+
gem 'pry-byebug', '~> 2', platforms: [:mri_20, :mri_21]
|
7
|
+
gem 'pry-debugger', '~> 0', platforms: :mri_19
|
8
8
|
end
|
9
9
|
|
10
10
|
group :doc do
|
11
|
-
gem 'yard',
|
12
|
-
gem 'rdiscount',
|
11
|
+
gem 'yard', '~> 0', require: false
|
12
|
+
gem 'rdiscount', '~> 2', require: false
|
13
|
+
end
|
14
|
+
|
15
|
+
group :test do
|
16
|
+
gem 'codeclimate-test-reporter', '~> 0', require: false
|
13
17
|
end
|
14
18
|
|
15
19
|
group :tooling do
|
16
|
-
gem 'guard-rspec',
|
20
|
+
gem 'guard-rspec', '~> 4', require: false
|
17
21
|
if RUBY_PLATFORM =~ /darwin/i
|
18
|
-
gem 'rb-fsevent',
|
22
|
+
gem 'rb-fsevent', '~> 0', require: false
|
19
23
|
end
|
20
24
|
end
|
data/Guardfile
CHANGED
@@ -22,7 +22,10 @@ guard :rspec, all_after_pass: true,
|
|
22
22
|
# Run all specs when a matcher changes.
|
23
23
|
watch( 'spec/matchers.rb' ) { 'spec' }
|
24
24
|
|
25
|
-
# Run all when a
|
25
|
+
# Run all specs when a support file changes.
|
26
|
+
watch( %r{^spec/support} ) { 'spec' }
|
27
|
+
|
28
|
+
# Run all specs when a fixture changes.
|
26
29
|
watch( %r{^spec/fixtures} ) { 'spec' }
|
27
30
|
|
28
31
|
# Run all specs when the RSpec configuration changes.
|
data/History.markdown
ADDED
data/License.md
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
# The MIT License
|
1
|
+
# The MIT License
|
2
2
|
|
3
|
-
Source code for _Autoloaded_ is Copyright © 2014
|
4
|
-
[
|
5
|
-
[contributors](https://github.com/njonsson/autoloaded/contributors "Autoloaded contributors at GitHub").
|
3
|
+
Source code for _Autoloaded_ is Copyright © 2014 [Nils Jonsson][mail] and
|
4
|
+
[contributors][contributors].
|
6
5
|
|
7
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
8
7
|
this software and associated documentation files (the “Software”), to deal in the
|
@@ -20,3 +19,6 @@ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
20
19
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
21
20
|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
21
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
[mail]: mailto:autoloaded@nilsjonsson.com "send email to Nils Jonsson"
|
24
|
+
[contributors]: https://github.com/njonsson/autoloaded/contributors "Autoloaded contributors at GitHub"
|
data/README.md
CHANGED
@@ -1,12 +1,19 @@
|
|
1
|
+
[![Autoloaded graphic]][spider-gear-image]
|
2
|
+
|
1
3
|
# Autoloaded
|
2
4
|
|
5
|
+
[![Travis CI build status] ][Travis-CI-build-status]
|
6
|
+
[![Code Climate quality report] ][Code-Climate-report]
|
7
|
+
[![Code Climate coverage report]][Code-Climate-report]
|
8
|
+
[![Gemnasium build status] ][Gemnasium-build-status]
|
9
|
+
[![Inch CI build status] ][Inch-CI-build-status]
|
10
|
+
[![RubyGems release] ][RubyGems-release]
|
11
|
+
|
3
12
|
_Autoloaded_ dynamically and flexibly loads source files in a directory when a
|
4
13
|
corresponding constant is dereferenced. It offers several advantages over other
|
5
14
|
autoloading facilities such as those provided by the
|
6
|
-
[Ruby Core library]
|
7
|
-
|
8
|
-
[ActiveSupport](http://api.rubyonrails.org/classes/ActiveSupport/Autoload.html)
|
9
|
-
gem:
|
15
|
+
[Ruby Core library][Ruby-Core-Module-autoload] and the
|
16
|
+
[ActiveSupport][ActiveSupport-Autoload] gem:
|
10
17
|
|
11
18
|
* It does not require a separate `autoload` statement for each constant
|
12
19
|
* It does not enforce `CamelCase` to `snake_case` correspondence between the
|
@@ -106,8 +113,32 @@ end
|
|
106
113
|
|
107
114
|
## Contributing
|
108
115
|
|
109
|
-
1. [Fork the official repository
|
116
|
+
1. [Fork][fork-Autoloaded] the official repository.
|
110
117
|
2. Create your feature branch: `git checkout -b my-new-feature`.
|
111
118
|
3. Commit your changes: `git commit -am 'Add some feature'`.
|
112
119
|
4. Push to the branch: `git push origin my-new-feature`.
|
113
|
-
5. Create a
|
120
|
+
5. [Create][compare-Autoloaded-branches] a new pull request.
|
121
|
+
|
122
|
+
## License
|
123
|
+
|
124
|
+
Released under the [MIT License][MIT-License].
|
125
|
+
|
126
|
+
[Autoloaded graphic]: https://farm5.staticflickr.com/4134/4941065976_54737fe145.jpg
|
127
|
+
[Travis CI build status]: https://secure.travis-ci.org/njonsson/autoloaded.svg?branch=master
|
128
|
+
[Code Climate quality report]: https://codeclimate.com/github/njonsson/autoloaded/badges/gpa.svg
|
129
|
+
[Code Climate coverage report]: https://codeclimate.com/github/njonsson/autoloaded/badges/coverage.svg
|
130
|
+
[Gemnasium build status]: https://gemnasium.com/njonsson/autoloaded.svg
|
131
|
+
[Inch CI build status]: http://inch-ci.org/github/njonsson/autoloaded.svg?branch=master
|
132
|
+
[RubyGems release]: https://badge.fury.io/rb/autoloaded.svg
|
133
|
+
|
134
|
+
[spider-gear-image]: https://www.flickr.com/photos/dongkwan/4941065976 "spider gear image by Ernesto Andrade"
|
135
|
+
[Travis-CI-build-status]: http://travis-ci.org/njonsson/autoloaded "Travis CI build status for Autoloaded"
|
136
|
+
[Code-Climate-report]: http://codeclimate.com/github/njonsson/autoloaded "Code Climate report for Autoloaded"
|
137
|
+
[Gemnasium-build-status]: http://gemnasium.com/njonsson/autoloaded "Gemnasium build status for Autoloaded"
|
138
|
+
[Inch-CI-build-status]: http://inch-ci.org/github/njonsson/autoloaded "Inch CI build status for Autoloaded"
|
139
|
+
[RubyGems-release]: http://rubygems.org/gems/autoloaded "RubyGems release of Autoloaded"
|
140
|
+
[Ruby-Core-Module-autoload]: http://ruby-doc.org/core/Module.html#method-i-autoload "‘Module#autoload’ method in the Ruby Core Library"
|
141
|
+
[ActiveSupport-Autoload]: http://api.rubyonrails.org/classes/ActiveSupport/Autoload.html "‘ActiveSupport::Autoload’ module in the Rails API"
|
142
|
+
[fork-Autoloaded]: https://github.com/njonsson/autoloaded/fork "Fork the official repository of Autoloaded"
|
143
|
+
[compare-Autoloaded-branches]: https://github.com/njonsson/autoloaded/compare "Compare branches of Autoloaded repositories"
|
144
|
+
[MIT-License]: http://github.com/njonsson/autoloaded/blob/master/License.md "MIT License claim for Autoloaded"
|
data/Rakefile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
|
-
|
2
|
+
require_relative 'lib/tasks'
|
data/autoloaded.gemspec
CHANGED
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
34
34
|
spec.require_paths = ['lib']
|
35
35
|
|
36
|
-
spec.required_ruby_version = '~> 2
|
36
|
+
spec.required_ruby_version = '~> 2'
|
37
37
|
|
38
38
|
spec.add_development_dependency 'bundler', '~> 1'
|
39
39
|
spec.add_development_dependency 'rake', '~> 10'
|
data/lib/autoloaded/constant.rb
CHANGED
@@ -10,26 +10,16 @@ class Autoloaded::Constant
|
|
10
10
|
attr_reader :name
|
11
11
|
|
12
12
|
def initialize(name)
|
13
|
-
@name = name
|
13
|
+
@name = name.freeze
|
14
14
|
end
|
15
15
|
|
16
|
-
def each_matching_filename_in(directory)
|
16
|
+
def each_matching_filename_in(directory, &block)
|
17
17
|
filenames = ::Set.new
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
name_signature = signature(name)
|
26
|
-
::Dir.glob(['*', extension].join, ::File::FNM_CASEFOLD) do |f|
|
27
|
-
f_signature = signature(::File.basename(f, extension))
|
28
|
-
if (f_signature == name_signature) && filenames.add?(f)
|
29
|
-
yield ::File.join(directory, f)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
19
|
+
yield_qualified_name_source_filename_in(directory,
|
20
|
+
unless_in: filenames,
|
21
|
+
&block)
|
22
|
+
yield_all_qualified_filenames_in(directory, unless_in: filenames, &block)
|
33
23
|
end
|
34
24
|
|
35
25
|
private
|
@@ -38,8 +28,43 @@ private
|
|
38
28
|
'.rb'
|
39
29
|
end
|
40
30
|
|
31
|
+
def name_signature
|
32
|
+
@name_signature ||= signature(name)
|
33
|
+
end
|
34
|
+
|
35
|
+
def name_source_filename
|
36
|
+
@name_source_filename ||= [name.to_s.to_source_filename, extension].join
|
37
|
+
end
|
38
|
+
|
39
|
+
def qualified_glob_in(directory)
|
40
|
+
::File.join(directory, ['*', extension].join)
|
41
|
+
end
|
42
|
+
|
41
43
|
def signature(string)
|
42
44
|
string.to_s.gsub(/[^a-z0-9]/i, '').downcase
|
43
45
|
end
|
44
46
|
|
47
|
+
def yield_all_qualified_filenames_in(directory, unless_in: nil, &block)
|
48
|
+
unless unless_in
|
49
|
+
raise ::ArgumentError, "missing keyword: unless_in"
|
50
|
+
end
|
51
|
+
::Dir.glob(qualified_glob_in(directory), ::File::FNM_CASEFOLD) do |filename|
|
52
|
+
filename_signature = signature(::File.basename(filename, extension))
|
53
|
+
if (filename_signature == name_signature) &&
|
54
|
+
unless_in.add?(::File.basename(filename))
|
55
|
+
block.call filename
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def yield_qualified_name_source_filename_in(directory, unless_in: nil, &block)
|
61
|
+
unless unless_in
|
62
|
+
raise ::ArgumentError, "missing keyword: unless_in"
|
63
|
+
end
|
64
|
+
qualified = ::File.join(directory, name_source_filename)
|
65
|
+
if ::File.file?(qualified) && unless_in.add?(name_source_filename)
|
66
|
+
block.call qualified
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
45
70
|
end
|
data/lib/autoloaded/version.rb
CHANGED
data/lib/tasks.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace :lib do
|
2
|
+
desc "Load each library file individually, looking for missing 'require' statements"
|
3
|
+
task :each do
|
4
|
+
Dir.chdir 'lib' do
|
5
|
+
Dir.glob( '**/*.rb' ) do |f|
|
6
|
+
next if f == 'tasks.rb'
|
7
|
+
|
8
|
+
puts "Loading #{f} ..."
|
9
|
+
fail unless system( "/usr/bin/env bundle exec ruby -e 'require #{f.inspect}'" )
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/tasks/spec.rake
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
rescue LoadError
|
4
|
+
else
|
5
|
+
def define_spec_task(name, options={})
|
6
|
+
desc options[:desc]
|
7
|
+
begin
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
rescue LoadError
|
10
|
+
else
|
11
|
+
RSpec::Core::RakeTask.new name do |t|
|
12
|
+
t.rspec_opts ||= []
|
13
|
+
t.rspec_opts << "--backtrace" if options[:backtrace]
|
14
|
+
|
15
|
+
debugger_gem = %w(pry-byebug pry-debugger).detect do |gem|
|
16
|
+
`bundle show #{gem} 2>&1 >/dev/null`
|
17
|
+
$?.success?
|
18
|
+
end
|
19
|
+
if debugger_gem && options[:debug] != false
|
20
|
+
t.rspec_opts << "--require #{debugger_gem}"
|
21
|
+
end
|
22
|
+
|
23
|
+
t.rspec_opts << "--format #{options[:format]}" if options.key?(:format)
|
24
|
+
t.rspec_opts << '--no-profile' if options[:profile] == false
|
25
|
+
t.rspec_opts << '--warnings' if options[:warnings]
|
26
|
+
t.pattern = options[:pattern] || %w(spec/*_spec.rb spec/**/*_spec.rb)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
define_spec_task :spec, desc: 'Run specs', profile: true
|
32
|
+
|
33
|
+
namespace :spec do
|
34
|
+
uncommitted_files_in_spec = `git ls-files --modified --others spec/* spec/**/*`.split("\n")
|
35
|
+
uncommitted_spec_files = `git ls-files --modified --others spec/*_spec.rb spec/**/*_spec.rb`.split("\n")
|
36
|
+
nonspec_uncommitted_files_in_spec = uncommitted_files_in_spec -
|
37
|
+
uncommitted_spec_files
|
38
|
+
if nonspec_uncommitted_files_in_spec.empty?
|
39
|
+
if uncommitted_spec_files.empty?
|
40
|
+
desc 'Run uncommitted specs (none)'
|
41
|
+
task :uncommitted do
|
42
|
+
puts 'No uncommitted specs to run'
|
43
|
+
end
|
44
|
+
else
|
45
|
+
noun_phrase = "#{uncommitted_spec_files.length} uncommitted spec file#{(uncommitted_spec_files.length == 1) ? nil : 's'}"
|
46
|
+
desc = "Run #{noun_phrase}"
|
47
|
+
define_spec_task :uncommitted, desc: desc, pattern: uncommitted_spec_files
|
48
|
+
end
|
49
|
+
else
|
50
|
+
noun_phrase = "#{uncommitted_files_in_spec.length} uncommitted file#{uncommitted_files_in_spec.length == 1 ? nil : 's'}"
|
51
|
+
desc = "Run all specs because of #{noun_phrase} in 'spec'"
|
52
|
+
define_spec_task :uncommitted, desc: desc, pattern: 'spec'
|
53
|
+
end
|
54
|
+
|
55
|
+
define_spec_task :warnings, desc: 'Run specs with Ruby warnings enabled',
|
56
|
+
format: :progress,
|
57
|
+
profile: false,
|
58
|
+
warnings: true
|
59
|
+
end
|
60
|
+
|
61
|
+
desc 'Run specs'
|
62
|
+
task '' => :spec
|
63
|
+
task :default => :spec
|
64
|
+
|
65
|
+
# Support the 'gem test' command.
|
66
|
+
define_spec_task :test, desc: '', backtrace: true,
|
67
|
+
debug: false,
|
68
|
+
format: :progress,
|
69
|
+
profile: false
|
70
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
rescue LoadError
|
4
|
+
else
|
5
|
+
namespace :spec do
|
6
|
+
desc "Run each spec individually, looking for missing 'require' statements"
|
7
|
+
task :each do
|
8
|
+
add_separator = false
|
9
|
+
Dir.glob( 'spec/**/*_spec.rb' ) do |f|
|
10
|
+
puts '-' * `tput cols`.chomp.to_i if add_separator
|
11
|
+
add_separator = true
|
12
|
+
puts "Running #{f} ..."
|
13
|
+
unless system( "/usr/bin/env bundle exec rspec --format=progress --no-profile #{f.inspect}" )
|
14
|
+
fail
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -6,11 +6,11 @@ RSpec.describe Autoloaded::Constant do
|
|
6
6
|
describe 'for' do
|
7
7
|
let(:directory) { 'spec/fixtures/filenames' }
|
8
8
|
|
9
|
-
{AFilename: %w(a_filename a-file-name a-filename a_file_name AFilename),
|
10
|
-
A_FILENAME: %w(a_filename a-file-name a-filename a_file_name AFilename),
|
11
|
-
AFileName: %w(a_file_name a-file-name a-filename a_filename AFilename),
|
12
|
-
AFILEName: %w(a-file-name
|
13
|
-
|
9
|
+
{AFilename: %w(a_filename a-file-name a-filename a_file_name afile_name afile-name AFilename),
|
10
|
+
A_FILENAME: %w(a_filename a-file-name a-filename a_file_name afile_name afile-name AFilename),
|
11
|
+
AFileName: %w(a_file_name a-file-name a-filename a_filename afile_name afile-name AFilename),
|
12
|
+
AFILEName: %w(afile_name a-file-name a-filename a_file_name a_filename afile-name AFilename)}.each do |constant_name,
|
13
|
+
filenames|
|
14
14
|
describe constant_name.inspect do
|
15
15
|
let(:constant) { constant_class.new constant_name }
|
16
16
|
|
@@ -21,11 +21,25 @@ RSpec.describe Autoloaded::Constant do
|
|
21
21
|
}
|
22
22
|
|
23
23
|
describe '#each_matching_filename_in' do
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
let(:yielded_args) {
|
25
|
+
result = []
|
26
|
+
constant.each_matching_filename_in directory do |filename|
|
27
|
+
result << filename
|
28
|
+
end
|
29
|
+
result
|
28
30
|
}
|
31
|
+
|
32
|
+
describe 'first yielded argument' do
|
33
|
+
subject(:first_yielded_argument) { yielded_args.first }
|
34
|
+
|
35
|
+
it { is_expected.to eq(full_filenames.first) }
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'subsequent yielded arguments' do
|
39
|
+
subject(:subsequent_yielded_arguments) { yielded_args[1..-1] }
|
40
|
+
|
41
|
+
it { is_expected.to match_array(full_filenames[1..-1]) }
|
42
|
+
end
|
29
43
|
end
|
30
44
|
end
|
31
45
|
end
|
@@ -2,15 +2,20 @@ require 'autoloaded'
|
|
2
2
|
require 'matchers'
|
3
3
|
|
4
4
|
RSpec.describe Autoloaded do
|
5
|
-
describe 'not
|
5
|
+
describe 'not extending a namespace' do
|
6
6
|
let(:source_file) { 'spec/fixtures/namespace_that_is_not_autoloaded.rb' }
|
7
7
|
|
8
8
|
specify('does not dynamically define a nested constant') {
|
9
9
|
expect(source_file).not_to autoload_a_constant_named('NamespaceThatIsNotAutoloaded::Nested')
|
10
10
|
}
|
11
|
+
|
12
|
+
specify('does not pollute the namespace') {
|
13
|
+
expect(source_file).to define_only_constants_named().
|
14
|
+
in_a_namespace_named(:NamespaceThatIsNotAutoloaded)
|
15
|
+
}
|
11
16
|
end
|
12
17
|
|
13
|
-
describe '
|
18
|
+
describe 'extending a namespace' do
|
14
19
|
describe 'whose source files have conventional names' do
|
15
20
|
let(:source_file) {
|
16
21
|
'spec/fixtures/namespace_that_is_autoloaded_conventionally.rb'
|
File without changes
|
File without changes
|
@@ -1 +0,0 @@
|
|
1
|
-
raise "The file #{__FILE__} should not have been loaded"
|
data/spec/matchers.rb
CHANGED
@@ -1,41 +1,31 @@
|
|
1
|
-
require '
|
1
|
+
require 'support/without_side_effects'
|
2
2
|
|
3
3
|
RSpec::Matchers.define :autoload_a_constant_named do |constant_name|
|
4
4
|
match do |source_file|
|
5
5
|
# Ensure the file exists.
|
6
|
-
File.
|
6
|
+
File.open source_file, 'r' do
|
7
|
+
end
|
7
8
|
|
8
9
|
constant_tokens = constant_name.split('::')
|
9
10
|
constant_up_till_last = constant_tokens[0...-1].join('::')
|
10
11
|
constant_last = constant_tokens.last
|
11
|
-
assertion = <<-end_assertion.gsub(/^ /, '')
|
12
|
-
begin;
|
13
|
-
#{constant_name};
|
14
|
-
rescue;
|
15
|
-
else;
|
16
|
-
raise('Constant #{constant_name} is already defined');
|
17
|
-
end;
|
18
12
|
|
19
|
-
|
13
|
+
without_side_effects do
|
14
|
+
begin
|
15
|
+
eval constant_name.to_s
|
16
|
+
rescue NameError
|
17
|
+
else
|
18
|
+
raise("#{constant_name} is already defined")
|
19
|
+
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
'true' :
|
28
|
-
'false';
|
29
|
-
end)
|
30
|
-
end_assertion
|
31
|
-
quoted_assertion = assertion.chomp.inspect.gsub('\n', "\n")
|
32
|
-
Open3.popen3 "bundle exec ruby -e #{quoted_assertion}" do |stdin,
|
33
|
-
stdout,
|
34
|
-
stderr|
|
35
|
-
if (stderr_output = stderr.read.chomp).empty?
|
36
|
-
eval stdout.read.chomp
|
21
|
+
load source_file
|
22
|
+
|
23
|
+
begin
|
24
|
+
eval constant_name.to_s
|
25
|
+
rescue NameError
|
26
|
+
false
|
37
27
|
else
|
38
|
-
|
28
|
+
eval(constant_up_till_last).autoload? constant_last.to_sym
|
39
29
|
end
|
40
30
|
end
|
41
31
|
end
|
@@ -45,38 +35,31 @@ RSpec::Matchers.define :define_only_constants_named do |*constant_names|
|
|
45
35
|
attr_reader :expected_constants, :extraneous_defined_constants, :namespace_name
|
46
36
|
|
47
37
|
match do |source_file|
|
38
|
+
@expected_constants, @extraneous_defined_constants = [], []
|
39
|
+
|
48
40
|
# Ensure the file exists.
|
49
|
-
File.
|
41
|
+
File.open source_file, 'r' do
|
42
|
+
end
|
50
43
|
|
51
44
|
unless namespace_name
|
52
|
-
raise "
|
45
|
+
raise "missing .in_a_namespace_named(:Namespace) clause"
|
53
46
|
end
|
54
47
|
|
55
|
-
|
56
|
-
load
|
48
|
+
defined_constants = without_side_effects do
|
49
|
+
load source_file
|
57
50
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
rescue;
|
64
|
-
'[]';
|
65
|
-
end)
|
66
|
-
end_assertion
|
67
|
-
quoted_assertion = assertion.chomp.inspect.gsub('\n', "\n")
|
68
|
-
Open3.popen3 "bundle exec ruby -e #{quoted_assertion}" do |stdin,
|
69
|
-
stdout,
|
70
|
-
stderr|
|
71
|
-
if (stderr_output = stderr.read.chomp).empty?
|
72
|
-
defined_constants = Array(eval(stdout.read.chomp)).sort.collect(&:to_sym)
|
73
|
-
@expected_constants = constant_names.sort.collect(&:to_sym)
|
74
|
-
@extraneous_defined_constants = defined_constants - expected_constants
|
75
|
-
extraneous_defined_constants.empty?
|
76
|
-
else
|
77
|
-
raise stderr_output
|
51
|
+
namespace = eval(namespace_name.to_s)
|
52
|
+
|
53
|
+
# Trigger autoloading.
|
54
|
+
constant_names.each do |constant_name|
|
55
|
+
namespace.const_get constant_name
|
78
56
|
end
|
57
|
+
|
58
|
+
namespace.constants.sort.collect(&:to_sym)
|
79
59
|
end
|
60
|
+
@expected_constants = constant_names.sort.collect(&:to_sym)
|
61
|
+
@extraneous_defined_constants = defined_constants - expected_constants
|
62
|
+
extraneous_defined_constants.empty?
|
80
63
|
end
|
81
64
|
|
82
65
|
chain :in_a_namespace_named do |namespace_name|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
require 'codeclimate-test-reporter'
|
2
|
+
|
3
|
+
CodeClimate::TestReporter.start
|
4
|
+
|
1
5
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
6
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
7
|
# The generated `.rspec` file contains `--require spec_helper` which will cause this
|
@@ -0,0 +1,31 @@
|
|
1
|
+
def without_side_effects
|
2
|
+
return nil unless block_given?
|
3
|
+
|
4
|
+
out_reader, out_writer = IO.pipe.collect { |io| io.tap(&:binmode) }
|
5
|
+
err_reader, err_writer = IO.pipe.collect { |io| io.tap(&:binmode) }
|
6
|
+
|
7
|
+
pid = fork do
|
8
|
+
out_reader.close
|
9
|
+
err_reader.close
|
10
|
+
|
11
|
+
begin
|
12
|
+
out_writer.write Marshal.dump(yield)
|
13
|
+
rescue => e
|
14
|
+
clean_backtrace = e.backtrace.reject do |frame|
|
15
|
+
frame.include? __FILE__
|
16
|
+
end
|
17
|
+
e.set_backtrace clean_backtrace
|
18
|
+
err_writer.write Marshal.dump(e)
|
19
|
+
raise e
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
Process.wait pid
|
24
|
+
|
25
|
+
out_writer.close
|
26
|
+
err_writer.close
|
27
|
+
|
28
|
+
return Marshal.load(out_reader.read) if $?.success?
|
29
|
+
|
30
|
+
raise Marshal.load(err_reader.read)
|
31
|
+
end
|
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autoloaded
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nils Jonsson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3'
|
55
55
|
description: 'Dynamically and flexibly loads source files in a directory when a corresponding
|
@@ -64,13 +64,13 @@ executables: []
|
|
64
64
|
extensions: []
|
65
65
|
extra_rdoc_files: []
|
66
66
|
files:
|
67
|
-
- .gitignore
|
68
|
-
- .rspec
|
69
|
-
- .
|
70
|
-
- .
|
71
|
-
- .yardopts
|
67
|
+
- ".gitignore"
|
68
|
+
- ".rspec"
|
69
|
+
- ".travis.yml"
|
70
|
+
- ".yardopts"
|
72
71
|
- Gemfile
|
73
72
|
- Guardfile
|
73
|
+
- History.markdown
|
74
74
|
- License.md
|
75
75
|
- README.md
|
76
76
|
- Rakefile
|
@@ -81,15 +81,22 @@ files:
|
|
81
81
|
- lib/autoloaded/refine/string.rb
|
82
82
|
- lib/autoloaded/refine/string/to_source_filename.rb
|
83
83
|
- lib/autoloaded/version.rb
|
84
|
+
- lib/tasks.rb
|
85
|
+
- lib/tasks/build_doc.rake
|
86
|
+
- lib/tasks/lib_each.rake
|
87
|
+
- lib/tasks/spec.rake
|
88
|
+
- lib/tasks/spec_each.rake
|
84
89
|
- spec/autoloaded/constant_spec.rb
|
85
90
|
- spec/autoloaded/refine/string/to_source_filename_spec.rb
|
86
|
-
- spec/autoloaded/shallow_spec.rb
|
87
91
|
- spec/autoloaded/version_spec.rb
|
92
|
+
- spec/autoloaded_spec.rb
|
88
93
|
- spec/fixtures/filenames/AFilename.rb
|
89
94
|
- spec/fixtures/filenames/a-file-name.rb
|
90
95
|
- spec/fixtures/filenames/a-filename.rb
|
91
96
|
- spec/fixtures/filenames/a_file_name.rb
|
92
97
|
- spec/fixtures/filenames/a_filename.rb
|
98
|
+
- spec/fixtures/filenames/afile-name.rb
|
99
|
+
- spec/fixtures/filenames/afile_name.rb
|
93
100
|
- spec/fixtures/namespace_that_is_autoloaded_conventionally.rb
|
94
101
|
- spec/fixtures/namespace_that_is_autoloaded_conventionally/N-est-ed.rb
|
95
102
|
- spec/fixtures/namespace_that_is_autoloaded_conventionally/nest_ed.rb
|
@@ -101,6 +108,7 @@ files:
|
|
101
108
|
- spec/fixtures/namespace_that_is_not_autoloaded/nested.rb
|
102
109
|
- spec/matchers.rb
|
103
110
|
- spec/spec_helper.rb
|
111
|
+
- spec/support/without_side_effects.rb
|
104
112
|
homepage: https://github.com/njonsson/autoloaded
|
105
113
|
licenses:
|
106
114
|
- MIT
|
@@ -111,12 +119,12 @@ require_paths:
|
|
111
119
|
- lib
|
112
120
|
required_ruby_version: !ruby/object:Gem::Requirement
|
113
121
|
requirements:
|
114
|
-
- - ~>
|
122
|
+
- - "~>"
|
115
123
|
- !ruby/object:Gem::Version
|
116
|
-
version: '2
|
124
|
+
version: '2'
|
117
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
126
|
requirements:
|
119
|
-
- -
|
127
|
+
- - ">="
|
120
128
|
- !ruby/object:Gem::Version
|
121
129
|
version: '0'
|
122
130
|
requirements: []
|
@@ -129,13 +137,15 @@ summary: Dynamically and flexibly loads source files in a directory when a corre
|
|
129
137
|
test_files:
|
130
138
|
- spec/autoloaded/constant_spec.rb
|
131
139
|
- spec/autoloaded/refine/string/to_source_filename_spec.rb
|
132
|
-
- spec/autoloaded/shallow_spec.rb
|
133
140
|
- spec/autoloaded/version_spec.rb
|
141
|
+
- spec/autoloaded_spec.rb
|
134
142
|
- spec/fixtures/filenames/AFilename.rb
|
135
143
|
- spec/fixtures/filenames/a-file-name.rb
|
136
144
|
- spec/fixtures/filenames/a-filename.rb
|
137
145
|
- spec/fixtures/filenames/a_file_name.rb
|
138
146
|
- spec/fixtures/filenames/a_filename.rb
|
147
|
+
- spec/fixtures/filenames/afile-name.rb
|
148
|
+
- spec/fixtures/filenames/afile_name.rb
|
139
149
|
- spec/fixtures/namespace_that_is_autoloaded_conventionally.rb
|
140
150
|
- spec/fixtures/namespace_that_is_autoloaded_conventionally/N-est-ed.rb
|
141
151
|
- spec/fixtures/namespace_that_is_autoloaded_conventionally/nest_ed.rb
|
@@ -147,4 +157,5 @@ test_files:
|
|
147
157
|
- spec/fixtures/namespace_that_is_not_autoloaded/nested.rb
|
148
158
|
- spec/matchers.rb
|
149
159
|
- spec/spec_helper.rb
|
160
|
+
- spec/support/without_side_effects.rb
|
150
161
|
has_rdoc:
|
data/.ruby-gemset
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
autoloaded
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.1.2
|