descendants-loader 0.0.1
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/lib/descendants_loader.rb +38 -0
- data/lib/descendants_loader/class_finder.rb +58 -0
- data/lib/descendants_loader/version.rb +3 -0
- data/spec/spec_helper.rb +20 -0
- metadata +119 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c63374bbd35a4d86f69dc71cc7c02e86bd56d9bd
|
4
|
+
data.tar.gz: 9e21b5d903116697decde08c0e376e9ffda3b121
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e60b7ef9cb1bee42b5d18cb05a36d1680c548ee2c677e98494b287e305174b422410605623733d21c31d2d3bedee82c99221eccfb620dce3e273c1f9b31bd4ac
|
7
|
+
data.tar.gz: df8ee79bc1b2dea59165bcefb0c23bf713577f69c0b8d658477ffd4c0129d92f20e9bf34c5a843f3cbc56877dbec52d28e787027ec0d6aa5fa9b3dd2dc083e45
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'active_support/core_ext/string/inflections'
|
2
|
+
|
3
|
+
path = File.expand_path(File.dirname(__FILE__))
|
4
|
+
Dir["#{path}/descendants_loader/**/*.rb"].each do |file|
|
5
|
+
require file
|
6
|
+
end
|
7
|
+
|
8
|
+
module DescendantsLoader
|
9
|
+
def self.included(base)
|
10
|
+
base.extend(ClassMethods)
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
def descendants
|
15
|
+
if (classes = super).empty?
|
16
|
+
load_self_descendants
|
17
|
+
classes = super
|
18
|
+
end
|
19
|
+
|
20
|
+
classes
|
21
|
+
end
|
22
|
+
|
23
|
+
def subclasses
|
24
|
+
if (classes = super).empty?
|
25
|
+
load_self_descendants
|
26
|
+
classes = super
|
27
|
+
end
|
28
|
+
|
29
|
+
classes
|
30
|
+
end
|
31
|
+
|
32
|
+
def load_self_descendants
|
33
|
+
file = ClassFinder.where_is(self)
|
34
|
+
path = File.expand_path(File.dirname(file))
|
35
|
+
Dir["#{path}/**/*.rb"].each { |f| load f }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module DescendantsLoader
|
2
|
+
class ClassFinder
|
3
|
+
class << self
|
4
|
+
def where_is(klass)
|
5
|
+
find_related_source_files(klass).each do |f|
|
6
|
+
return f if class_and_source_eq?(klass, f)
|
7
|
+
end
|
8
|
+
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def class_name_from_path(path)
|
13
|
+
ary = path.split('/')
|
14
|
+
ary.map! { |s| s.gsub(/\.rb/, '') }
|
15
|
+
|
16
|
+
index = ary.index('models') ||
|
17
|
+
ary.index('workers') ||
|
18
|
+
ary.index('helpers') ||
|
19
|
+
ary.index('controllers') ||
|
20
|
+
ary.index('mailers') ||
|
21
|
+
ary.index('lib')
|
22
|
+
ary.slice!(0, index + 1)
|
23
|
+
|
24
|
+
ary.map(&:camelize).join('::')
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def find_related_source_files(klass)
|
30
|
+
locations = list_methods(klass).map(&:source_location)
|
31
|
+
|
32
|
+
locations.compact.map(&:first)
|
33
|
+
end
|
34
|
+
|
35
|
+
def list_methods(klass)
|
36
|
+
list_class_methods(klass) +
|
37
|
+
list_instance_methods(klass) +
|
38
|
+
list_private_methods(klass)
|
39
|
+
end
|
40
|
+
|
41
|
+
def list_class_methods(klass)
|
42
|
+
klass.methods(false).map { |m| klass.method(m) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def list_instance_methods(klass)
|
46
|
+
klass.instance_methods(false).map { |m| klass.instance_method(m) }
|
47
|
+
end
|
48
|
+
|
49
|
+
def list_private_methods(klass)
|
50
|
+
klass.new.private_methods(false).map { |m| klass.instance_method(m) }
|
51
|
+
end
|
52
|
+
|
53
|
+
def class_and_source_eq?(klass, file)
|
54
|
+
class_name_from_path(file) == klass.to_s
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'simplecov-rcov'
|
2
|
+
require 'simplecov'
|
3
|
+
|
4
|
+
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
|
5
|
+
SimpleCov.start do
|
6
|
+
`git checkout origin/master coverage/.last_run.json`
|
7
|
+
|
8
|
+
minimum_coverage(45)
|
9
|
+
maximum_coverage_drop(2)
|
10
|
+
|
11
|
+
add_filter 'spec/'
|
12
|
+
add_filter 'vendor/'
|
13
|
+
end
|
14
|
+
|
15
|
+
require File.expand_path('../../lib/descendants_loader.rb', __FILE__)
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
# Run specs in random order to surface order dependencies
|
19
|
+
config.order = :random
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: descendants-loader
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Daniel Silvestre
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: simplecov
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov-rcov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activesupport
|
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
|
+
description: The desired classes will autoload its hierarchy
|
84
|
+
email:
|
85
|
+
- djlebersilvestre@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- lib/descendants_loader.rb
|
91
|
+
- lib/descendants_loader/class_finder.rb
|
92
|
+
- lib/descendants_loader/version.rb
|
93
|
+
- spec/spec_helper.rb
|
94
|
+
homepage: http://github.com/djlebersilvestre/descendants-loader
|
95
|
+
licenses:
|
96
|
+
- MIT
|
97
|
+
metadata: {}
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options: []
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: 2.0.0
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubyforge_project:
|
114
|
+
rubygems_version: 2.4.6
|
115
|
+
signing_key:
|
116
|
+
specification_version: 4
|
117
|
+
summary: An Object.descendants and Object.subclasses loader
|
118
|
+
test_files:
|
119
|
+
- spec/spec_helper.rb
|