constant_resolver 0.1.5 → 0.2.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 +4 -4
- data/README.md +15 -0
- data/constant_resolver.gemspec +5 -3
- data/lib/constant_resolver/version.rb +1 -1
- data/lib/constant_resolver.rb +39 -10
- data/service.yml +1 -5
- data/shipit.yml +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dbe8153c22d706203ca7a89f53e39748657e75c9c508ebb7614cf9d933970dfa
|
4
|
+
data.tar.gz: 77fb1450efa1027547b6e8a24c316d4624454a0b10bd3b636646e1e6eb6d8612
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90c79e21790f1a952966df8113073ba863dd4f6fc41bf8800bf0232ee5e7ed8e0ba2034a476616147fc5947b1ff3f44987470f611772ce25c1b0b0c5c7221bae
|
7
|
+
data.tar.gz: 2be1c0dc66498943a093fcf3dc6cf6d2ee378486a704ee5f4d62db7454bf8aeb78c620852cd0b9489b72d79c81965e3e62502d689fbf5c03337097fcaed36dea
|
data/README.md
CHANGED
@@ -36,6 +36,21 @@ resolver = ConstantResolver.new(
|
|
36
36
|
)
|
37
37
|
```
|
38
38
|
|
39
|
+
### Default namespaces
|
40
|
+
|
41
|
+
If any load paths have a default namespace other than `Object`, these can be specified in a hash:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
resolver = ConstantResolver.new(
|
45
|
+
root_path: "/app",
|
46
|
+
load_paths: {
|
47
|
+
"/app/models" => "::Object",
|
48
|
+
"/app/services" => "::Object",
|
49
|
+
"/app/internal" => "::Business",
|
50
|
+
}
|
51
|
+
)
|
52
|
+
```
|
53
|
+
|
39
54
|
### Resolve a constant
|
40
55
|
|
41
56
|
Resolve a constant from the contents of your load paths:
|
data/constant_resolver.gemspec
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require "constant_resolver/version"
|
3
|
+
require_relative "lib/constant_resolver/version"
|
6
4
|
|
7
5
|
Gem::Specification.new do |spec|
|
8
6
|
spec.name = "constant_resolver"
|
@@ -22,6 +20,10 @@ Gem::Specification.new do |spec|
|
|
22
20
|
spec.metadata["homepage_uri"] = spec.homepage
|
23
21
|
spec.metadata["source_code_uri"] = "https://github.com/Shopify/constant_resolver"
|
24
22
|
spec.metadata["changelog_uri"] = "https://github.com/Shopify/constant_resolver/releases"
|
23
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
24
|
+
else
|
25
|
+
raise "RubyGems 2.0 or newer is required to protect against " \
|
26
|
+
"public gem pushes."
|
25
27
|
end
|
26
28
|
|
27
29
|
# Specify which files should be added to the gem when it is released.
|
data/lib/constant_resolver.rb
CHANGED
@@ -41,10 +41,9 @@ class ConstantResolver
|
|
41
41
|
# )
|
42
42
|
def initialize(root_path:, load_paths:, inflector: DefaultInflector.new)
|
43
43
|
root_path += "/" unless root_path.end_with?("/")
|
44
|
-
load_paths = load_paths.map { |p| p.end_with?("/") ? p : p + "/" }.uniq
|
45
44
|
|
46
45
|
@root_path = root_path
|
47
|
-
@load_paths = load_paths
|
46
|
+
@load_paths = coerce_load_paths(load_paths)
|
48
47
|
@file_map = nil
|
49
48
|
@inflector = inflector
|
50
49
|
end
|
@@ -76,10 +75,11 @@ class ConstantResolver
|
|
76
75
|
@file_map = {}
|
77
76
|
duplicate_files = {}
|
78
77
|
|
79
|
-
@load_paths.
|
80
|
-
Dir[
|
78
|
+
@load_paths.each_pair do |load_path, default_ns|
|
79
|
+
Dir[glob_path(load_path)].each do |file_path|
|
81
80
|
root_relative_path = file_path.delete_prefix!(@root_path)
|
82
81
|
const_name = @inflector.camelize(root_relative_path.delete_prefix(load_path).delete_suffix!(".rb"))
|
82
|
+
const_name = "#{default_ns}::#{const_name}" unless default_ns == "Object"
|
83
83
|
existing_entry = @file_map[const_name]
|
84
84
|
|
85
85
|
if existing_entry
|
@@ -90,13 +90,22 @@ class ConstantResolver
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
93
|
+
if duplicate_files.any?
|
94
|
+
raise(Error, <<~MSG)
|
95
|
+
Ambiguous constant definition:
|
96
|
+
|
97
|
+
#{duplicate_files.map { |const_name, paths| ambiguous_constant_message(const_name, paths) }.join("\n")}
|
98
|
+
MSG
|
99
|
+
end
|
100
|
+
|
101
|
+
if @file_map.empty?
|
102
|
+
raise(Error, <<~MSG)
|
103
|
+
Could not find any ruby files. Searched in:
|
104
|
+
|
105
|
+
- #{@load_paths.keys.map { |load_path| glob_path(load_path) }.join("\n- ")}
|
106
|
+
MSG
|
98
107
|
end
|
99
|
-
|
108
|
+
|
100
109
|
@file_map
|
101
110
|
end
|
102
111
|
|
@@ -110,6 +119,26 @@ class ConstantResolver
|
|
110
119
|
|
111
120
|
private
|
112
121
|
|
122
|
+
def coerce_load_paths(load_paths)
|
123
|
+
load_paths = Hash[load_paths.map { |p| [p, "Object"] }] unless load_paths.respond_to?(:transform_keys)
|
124
|
+
|
125
|
+
load_paths.transform_keys! { |p| p.end_with?("/") ? p : p + "/" }
|
126
|
+
load_paths.transform_values! { |ns| ns.to_s.delete_prefix("::") }
|
127
|
+
|
128
|
+
load_paths
|
129
|
+
end
|
130
|
+
|
131
|
+
def ambiguous_constant_message(const_name, paths)
|
132
|
+
<<~MSG.chomp
|
133
|
+
"#{const_name}" could refer to any of
|
134
|
+
#{paths.join("\n ")}
|
135
|
+
MSG
|
136
|
+
end
|
137
|
+
|
138
|
+
def glob_path(path)
|
139
|
+
@root_path + path + "**/*.rb"
|
140
|
+
end
|
141
|
+
|
113
142
|
def resolve_constant(const_name, current_namespace_path, original_name: const_name)
|
114
143
|
namespace, location = resolve_traversing_namespace_path(const_name, current_namespace_path)
|
115
144
|
if location
|
data/service.yml
CHANGED
data/shipit.yml
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
# defaults
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: constant_resolver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Philip Müller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -71,6 +71,7 @@ metadata:
|
|
71
71
|
homepage_uri: https://github.com/Shopify/constant_resolver
|
72
72
|
source_code_uri: https://github.com/Shopify/constant_resolver
|
73
73
|
changelog_uri: https://github.com/Shopify/constant_resolver/releases
|
74
|
+
allowed_push_host: https://rubygems.org
|
74
75
|
post_install_message:
|
75
76
|
rdoc_options: []
|
76
77
|
require_paths:
|
@@ -86,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
87
|
- !ruby/object:Gem::Version
|
87
88
|
version: '0'
|
88
89
|
requirements: []
|
89
|
-
rubygems_version: 3.
|
90
|
+
rubygems_version: 3.2.20
|
90
91
|
signing_key:
|
91
92
|
specification_version: 4
|
92
93
|
summary: Statically resolve any ruby constant
|