im 0.1.4 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 99d5cc6d355489148cd6f39fee0e50ce1a25d0e770e4f06c4918fdd41b05935b
4
- data.tar.gz: ec2372445636beac68c84c0249b68e7e454dda3b0c49293bea4e8f14bfa52053
3
+ metadata.gz: 3ef66ecbb4745e878d911ec789567b204abe1bb174f57cee6b04ca6caddb76d9
4
+ data.tar.gz: a8cb56445189f2eb3d4fc4b7ff3b49c028b5b43cc7d8e20961481b125171d777
5
5
  SHA512:
6
- metadata.gz: f9099a8d43b9772952916c21bd84da42da3eeac2541c0b4fe675fd7c373988d00a9522fc7dc2ce662ea7d0f3231ec4aec11941ab8f079350529d6476e535a19f
7
- data.tar.gz: 764b1d2454d0158deba3cd4244453aab0d194036b0fe4104c0cb40bced64d5a0bdb6099db3f5c0b9d98cf75c1417707949f353524b8061c5db18ef96ea0aad2d
6
+ metadata.gz: f4fed0705aca8dfd1eb036ea78c5e5a71f64837134669937a31c04daf97224744d6c881363a688adaf61fa01322c0b462c1d6fa57ac5bf53b2eee72deb633634
7
+ data.tar.gz: a3e0d1b7e940c0afd22d4415d855964b73a043390fd6538f075affe1eb29964c5b7c3b4cf675a738a6b999ab73cba72ce2ec86af790797866ff97ee685979fb5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.6] - 2022-10-03
4
+ - Remove `Object.const_missing` patch (Ruby patch now handles dynamic toplevel
5
+ references)
6
+
7
+ ## [0.1.5] - 2022-09-22
8
+ - Rename Im::Dependency -> Im::Require
9
+ - Handle dynamic requires (require called from method body after file has been imported)
10
+ - Refactor: move require/autoload patch logic to Im handler methods
11
+
3
12
  ## [0.1.4] - 2022-09-19
4
13
  - Correctly assign constants imported via recursive requires
5
14
 
data/Gemfile CHANGED
@@ -6,4 +6,3 @@ source "https://rubygems.org"
6
6
  gemspec
7
7
 
8
8
  gem "rspec", "~> 3.0"
9
- gem "rails"
data/Gemfile.lock CHANGED
@@ -1,144 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- im (0.1.3)
4
+ im (0.1.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- actioncable (7.0.4)
10
- actionpack (= 7.0.4)
11
- activesupport (= 7.0.4)
12
- nio4r (~> 2.0)
13
- websocket-driver (>= 0.6.1)
14
- actionmailbox (7.0.4)
15
- actionpack (= 7.0.4)
16
- activejob (= 7.0.4)
17
- activerecord (= 7.0.4)
18
- activestorage (= 7.0.4)
19
- activesupport (= 7.0.4)
20
- mail (>= 2.7.1)
21
- net-imap
22
- net-pop
23
- net-smtp
24
- actionmailer (7.0.4)
25
- actionpack (= 7.0.4)
26
- actionview (= 7.0.4)
27
- activejob (= 7.0.4)
28
- activesupport (= 7.0.4)
29
- mail (~> 2.5, >= 2.5.4)
30
- net-imap
31
- net-pop
32
- net-smtp
33
- rails-dom-testing (~> 2.0)
34
- actionpack (7.0.4)
35
- actionview (= 7.0.4)
36
- activesupport (= 7.0.4)
37
- rack (~> 2.0, >= 2.2.0)
38
- rack-test (>= 0.6.3)
39
- rails-dom-testing (~> 2.0)
40
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
41
- actiontext (7.0.4)
42
- actionpack (= 7.0.4)
43
- activerecord (= 7.0.4)
44
- activestorage (= 7.0.4)
45
- activesupport (= 7.0.4)
46
- globalid (>= 0.6.0)
47
- nokogiri (>= 1.8.5)
48
- actionview (7.0.4)
49
- activesupport (= 7.0.4)
50
- builder (~> 3.1)
51
- erubi (~> 1.4)
52
- rails-dom-testing (~> 2.0)
53
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
54
- activejob (7.0.4)
55
- activesupport (= 7.0.4)
56
- globalid (>= 0.3.6)
57
- activemodel (7.0.4)
58
- activesupport (= 7.0.4)
59
- activerecord (7.0.4)
60
- activemodel (= 7.0.4)
61
- activesupport (= 7.0.4)
62
- activestorage (7.0.4)
63
- actionpack (= 7.0.4)
64
- activejob (= 7.0.4)
65
- activerecord (= 7.0.4)
66
- activesupport (= 7.0.4)
67
- marcel (~> 1.0)
68
- mini_mime (>= 1.1.0)
69
- activesupport (7.0.4)
70
- concurrent-ruby (~> 1.0, >= 1.0.2)
71
- i18n (>= 1.6, < 2)
72
- minitest (>= 5.1)
73
- tzinfo (~> 2.0)
74
- builder (3.2.4)
75
- concurrent-ruby (1.1.10)
76
- crass (1.0.6)
77
9
  diff-lcs (1.5.0)
78
- digest (3.1.0)
79
- erubi (1.11.0)
80
- globalid (1.0.0)
81
- activesupport (>= 5.0)
82
- i18n (1.12.0)
83
- concurrent-ruby (~> 1.0)
84
- loofah (2.19.0)
85
- crass (~> 1.0.2)
86
- nokogiri (>= 1.5.9)
87
- mail (2.7.1)
88
- mini_mime (>= 0.1.1)
89
- marcel (1.0.2)
90
- method_source (1.0.0)
91
- mini_mime (1.1.2)
92
- mini_portile2 (2.8.0)
93
- minitest (5.16.3)
94
- net-imap (0.2.3)
95
- digest
96
- net-protocol
97
- strscan
98
- net-pop (0.1.1)
99
- digest
100
- net-protocol
101
- timeout
102
- net-protocol (0.1.3)
103
- timeout
104
- net-smtp (0.3.1)
105
- digest
106
- net-protocol
107
- timeout
108
- nio4r (2.5.8)
109
- nokogiri (1.13.8)
110
- mini_portile2 (~> 2.8.0)
111
- racc (~> 1.4)
112
- racc (1.6.0)
113
- rack (2.2.4)
114
- rack-test (2.0.2)
115
- rack (>= 1.3)
116
- rails (7.0.4)
117
- actioncable (= 7.0.4)
118
- actionmailbox (= 7.0.4)
119
- actionmailer (= 7.0.4)
120
- actionpack (= 7.0.4)
121
- actiontext (= 7.0.4)
122
- actionview (= 7.0.4)
123
- activejob (= 7.0.4)
124
- activemodel (= 7.0.4)
125
- activerecord (= 7.0.4)
126
- activestorage (= 7.0.4)
127
- activesupport (= 7.0.4)
128
- bundler (>= 1.15.0)
129
- railties (= 7.0.4)
130
- rails-dom-testing (2.0.3)
131
- activesupport (>= 4.2.0)
132
- nokogiri (>= 1.6)
133
- rails-html-sanitizer (1.4.3)
134
- loofah (~> 2.3)
135
- railties (7.0.4)
136
- actionpack (= 7.0.4)
137
- activesupport (= 7.0.4)
138
- method_source
139
- rake (>= 12.2)
140
- thor (~> 1.0)
141
- zeitwerk (~> 2.5)
142
10
  rake (13.0.6)
143
11
  rake-compiler (1.2.0)
144
12
  rake
@@ -155,25 +23,15 @@ GEM
155
23
  diff-lcs (>= 1.2.0, < 2.0)
156
24
  rspec-support (~> 3.11.0)
157
25
  rspec-support (3.11.0)
158
- strscan (3.0.4)
159
- thor (1.2.1)
160
- timeout (0.3.0)
161
- tzinfo (2.0.5)
162
- concurrent-ruby (~> 1.0)
163
- websocket-driver (0.7.5)
164
- websocket-extensions (>= 0.1.0)
165
- websocket-extensions (0.1.5)
166
- zeitwerk (2.6.0)
167
26
 
168
27
  PLATFORMS
169
28
  x86_64-linux
170
29
 
171
30
  DEPENDENCIES
172
31
  im!
173
- rails
174
32
  rake (~> 13.0)
175
33
  rake-compiler
176
34
  rspec (~> 3.0)
177
35
 
178
36
  BUNDLED WITH
179
- 2.4.0.dev
37
+ 2.3.18
data/README.md CHANGED
@@ -24,8 +24,8 @@ require "im"
24
24
 
25
25
  extend Im
26
26
 
27
- mod = import "activemodel"
28
- #=> #<Im::Import:0x00007f2d34dfd0c8 root: active_model>
27
+ mod = import "active_model"
28
+ #=> <#Im::Import root: active_model>
29
29
  ```
30
30
 
31
31
  Constants in the imported files are under the returned module, not the root namespace:
data/lib/im/kernel.rb CHANGED
@@ -4,42 +4,16 @@ module Kernel
4
4
  alias_method :im_original_require, :require
5
5
 
6
6
  def require(path)
7
- if Im.autoloads.key?(path)
8
- return Im.with_import(Im.autoloads.delete(path)) do |_context|
9
- !!Im.import(path)
10
- end
7
+ Im.handle_require(path, caller_locations(1, 1).first.path) do
8
+ im_original_require(path)
11
9
  end
10
+ end
12
11
 
13
- if Im.importing? && (resolved = $LOAD_PATH.resolve_feature_path(path))
14
- resolved_path = resolved[1]
15
- Im.registry[resolved_path] ||= Im::Dependency.new(resolved_path, Im.current_import)
16
- end
17
-
18
- loaded = im_original_require(path)
19
- return loaded unless Im.importing?
20
-
21
- if resolved
22
- dependency = Im.registry[resolved_path]
23
-
24
- if loaded && Im.registry.key?(location = caller_locations(1, 1).first.path)
25
- Im.registry[location].dependencies << dependency
26
- end
27
-
28
- dependency.dependencies.each { |d| require d.path }
29
-
30
- dependency.modules.each do |m|
31
- name = m.name
32
-
33
- # Do not assign constants that are aliased to root namespace
34
- root = name.split("::", 2)[0]
35
- next if Object.const_defined?(root) &&
36
- Im.current_import.const_defined?(root, false) &&
37
- Object.const_get(root) == Im.current_import.const_get(root)
12
+ alias_method :im_original_autoload, :autoload
38
13
 
39
- Im.current_import.const_set(name, m) unless Im.current_import.const_defined?(name, false)
40
- end
14
+ def autoload(name, path)
15
+ Im.handle_autoload(path) do
16
+ im_original_autoload(name, path)
41
17
  end
42
-
43
- return loaded
44
18
  end
45
19
  end
data/lib/im/module.rb CHANGED
@@ -2,7 +2,8 @@ class Module
2
2
  alias_method :im_original_autoload, :autoload
3
3
 
4
4
  def autoload(name, path)
5
- Im.autoloads[path] = Im.current_import if Im.importing?
6
- im_original_autoload(name, path)
5
+ Im.handle_autoload(path) do
6
+ im_original_autoload(name, path)
7
+ end
7
8
  end
8
9
  end
data/lib/im/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Im
4
- VERSION = "0.1.4"
4
+ VERSION = "0.1.6"
5
5
  end
data/lib/im.rb CHANGED
@@ -1,38 +1,103 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Im
4
- load $LOAD_PATH.resolve_feature_path("im/ruby_version_check")[1], true
4
+ load $:.resolve_feature_path("im/ruby_version_check")[1], true
5
+
6
+ @toplevel_constants = Object.constants.reject { |c| Object.autoload?(c) }
7
+ @autoloads = {}
8
+ @registry = {}
9
+ @current_imports = []
10
+
5
11
  require "im/version"
6
12
  require "im/kernel"
7
13
 
8
14
  class << self
9
- attr_reader :current_import
15
+ attr_reader :current_imports, :registry, :autoloads, :toplevel_constants
10
16
 
11
17
  def with_import(import)
12
- original_import = current_import
13
- @current_import = import
18
+ @current_imports.push(import || current_import)
14
19
 
15
20
  unless tracer_originally_enabled = @tracer.enabled?
16
21
  @tracer.enable
17
22
  end
18
23
 
19
- yield(import)
20
-
24
+ yield
21
25
  ensure
22
- @current_import = original_import
26
+ @current_imports.pop
23
27
  @tracer.disable unless tracer_originally_enabled
24
28
  end
25
29
 
26
- def registry
27
- @registry ||= {}
30
+ def current_import
31
+ current_imports.last
28
32
  end
29
33
 
30
- def autoloads
31
- @autoloads ||= {}
34
+ def importing?
35
+ !!current_import
32
36
  end
33
37
 
34
- def importing?
35
- !!Im.current_import
38
+ def handle_require(path, caller_path)
39
+ resolved_path = resolve_path(path)
40
+
41
+ return yield unless resolved_path
42
+
43
+ if autoloaded = autoloads.delete(resolved_path)
44
+ return with_import(autoloaded) do
45
+ !!import(path)
46
+ end
47
+ end
48
+
49
+ if importing?
50
+ registry[resolved_path] ||= Require.new(resolved_path, current_import)
51
+ elsif registry.key?(caller_path)
52
+ return with_import(registry[caller_path].import) do
53
+ !!import(resolved_path)
54
+ end
55
+ end
56
+
57
+ loaded = yield # super
58
+
59
+ if required = registry[resolved_path]
60
+ if loaded && registry.key?(caller_path)
61
+ registry[caller_path].requires << required
62
+ end
63
+
64
+ imports = importing? ? current_imports : [Object]
65
+ import_constants(required, imports)
66
+ end
67
+
68
+ loaded
69
+ end
70
+
71
+ def handle_autoload(path)
72
+ if importing? && (resolved_path = resolve_path(path))
73
+ autoloads[resolved_path] = current_import
74
+ end
75
+ yield
76
+ end
77
+
78
+ def resolve_path(path)
79
+ (resolved = $:.resolve_feature_path(path)) && resolved[1]
80
+ end
81
+
82
+ def import_constants(required, imports)
83
+ return if imports.empty? || required.nil?
84
+
85
+ required.requires.each { |r| require r.path }
86
+
87
+ imports.each do |import|
88
+ required.defined_constants.each do |name, mod|
89
+ # Do not assign constants that are aliased to root namespace
90
+ root = name.to_s.split("::", 2)[0]
91
+ next if Object.const_defined?(root) &&
92
+ import.const_defined?(root, false) &&
93
+ Object.const_get(root) == import.const_get(root)
94
+
95
+ begin
96
+ import.const_set(name, mod) unless import.const_defined?(name, false)
97
+ rescue NameError
98
+ end
99
+ end
100
+ end
36
101
  end
37
102
  end
38
103
 
@@ -40,85 +105,89 @@ module Im
40
105
  def initialize(root)
41
106
  @root = root
42
107
  super()
43
- Im::CONSTANTS.each do |const|
44
- self.const_set(const, Object.const_get(const))
108
+ Im.with_import(self) do
109
+ Im.toplevel_constants.each do |const|
110
+ self.const_set(const, Object.const_get(const))
111
+ end
45
112
  end
46
113
  end
47
114
 
48
115
  def inspect
49
116
  @inspect ||= "<#Im::Import root: #{@root}>"
50
117
  end
118
+
119
+ def const_added(name)
120
+ path = const_source_location(name)[0]
121
+ value = const_get(name, false)
122
+ Im.registry[path] ||= Require.new(path, self)
123
+ Im.registry[path].defined_constants[name] ||= value
124
+ super
125
+ end
51
126
  end
52
127
 
53
- Dependency = Struct.new(:path, :import, :modules, :dependencies) do
54
- def initialize(path, import, modules = [], dependencies = [])
55
- super(path, import, modules, dependencies)
128
+ Require = Struct.new(:path, :import, :defined_constants, :requires) do
129
+ def initialize(path, import, defined_constants = {}, requires = [])
130
+ super
56
131
  end
57
132
  end
58
133
 
59
134
  def import(path)
60
- if resolved = $LOAD_PATH.resolve_feature_path(path)
135
+ if resolved = $:.resolve_feature_path(path)
61
136
  resolved_path = resolved[1]
62
137
  raise LoadError, "import can only import ruby files" unless resolved[0] == :rb
63
138
  else
64
139
  raise LoadError, "cannot load such file -- #{path}"
65
140
  end
66
141
 
67
- Im.registry.fetch(resolved_path) do
142
+ required = Im.registry.fetch(resolved_path) do
68
143
  # handle autoload within import
69
144
  return nil if $LOADED_FEATURES.include?(resolved_path)
70
145
 
71
146
  $LOADED_FEATURES << resolved_path
72
147
 
73
148
  import = Im.current_import || Import.new(path)
74
- (Im.registry[resolved_path] ||= Dependency.new(resolved_path, import)).tap do
149
+ (Im.registry[resolved_path] ||= Require.new(resolved_path, import)).tap do
75
150
  Im.with_import(import) do
76
151
  load resolved_path, import
77
152
  end
78
153
  end
79
- end&.import
80
- end
81
-
82
- # This is a hack to catch references to top-level constants (`::Foo`) and, if
83
- # the calling line is a key in the Im registry, replace the toplevel constant
84
- # reference with its corresponding constant under the import namespace.
85
- #
86
- # By doing this, a reference to `::Foo` in an imported file will resolve to
87
- # `mod::Foo`, where `mod` is the import module. Ideally this should
88
- # ultimately happen at the Ruby implementation level.
89
- module RootNamespaceRedirect
90
- def const_missing(name)
91
-
92
- # Take top five locations to allow for other `const_missing` overrides
93
- # in the backtrace. If there are more than five, then this will no longer
94
- # work. This is currently very inefficient.
95
- if location = caller_locations(1, 5).find { |l| Im.registry.key?(l.path) }
96
- Im.registry[location.path].import.const_get(name)
97
- else
98
- super
99
- end
100
154
  end
155
+
156
+ Im.import_constants(required, Im.current_imports)
157
+
158
+ required&.import
101
159
  end
102
160
 
103
161
  @tracer = TracePoint.new(:class) do |event|
104
- next unless (name = event.self.name)
105
- next if Im::CONSTANTS.include?(name.to_sym)
106
-
107
- if resolved = $LOAD_PATH.resolve_feature_path(event.path)
162
+ next unless (name = event.self.name&.to_sym)
163
+ next if Im.toplevel_constants.include?(name)
164
+
165
+ # We don't want to track classes defined under singleton classes, like
166
+ # this:
167
+ #
168
+ # class Foo
169
+ # class << self
170
+ # class Bar
171
+ # end
172
+ # end
173
+ # end
174
+ #
175
+ # Here, `class Bar` will trigger a TracePoint event, and because of the
176
+ # Ruby patch `name` will return "Bar", but this is not actually a class we
177
+ # need to alias in imports, so we can safely skip it. The only way I've
178
+ # found to do that though is to evaluate `Module.nesting` from the event's
179
+ # binding. This is weird, but it works!
180
+ #
181
+ next if event.binding.eval("Module.nesting").any?(&:singleton_class?)
182
+
183
+ if resolved = $:.resolve_feature_path(event.path)
108
184
  resolved_path = resolved[1]
109
- if Im.registry.key?(resolved_path)
110
- (Im.registry[resolved_path].modules << event.self).uniq!
111
- else
112
- Im.registry[resolved_path] = Dependency.new(resolved_path, Im.current_import, [event.self])
113
- end
185
+ Im.registry[resolved_path] ||= Require.new(resolved_path, Im.current_import)
186
+ Im.registry[resolved_path].defined_constants[name] = event.self
114
187
  end
115
188
  end
116
189
 
117
190
  require "im/module"
118
- require "im/autoload"
119
- require "im/constants"
120
191
 
121
192
  extend self
122
193
  end
123
-
124
- Object.extend Im::RootNamespaceRedirect
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: im
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Salzberg
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-09-19 00:00:00.000000000 Z
11
+ date: 2022-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -66,8 +66,6 @@ files:
66
66
  - README.md
67
67
  - Rakefile
68
68
  - lib/im.rb
69
- - lib/im/autoload.rb
70
- - lib/im/constants.rb
71
69
  - lib/im/kernel.rb
72
70
  - lib/im/module.rb
73
71
  - lib/im/ruby_version_check.rb
@@ -96,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
94
  - !ruby/object:Gem::Version
97
95
  version: '0'
98
96
  requirements: []
99
- rubygems_version: 3.4.0.dev
97
+ rubygems_version: 3.3.7
100
98
  signing_key:
101
99
  specification_version: 4
102
100
  summary: Module import system.
data/lib/im/autoload.rb DELETED
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Im
4
- module Autoload
5
- def autoload(name, path)
6
- Im.autoloads[path] = Im.current_import if Im.importing?
7
- super(name, path)
8
- end
9
- end
10
- end
data/lib/im/constants.rb DELETED
@@ -1,104 +0,0 @@
1
- module Im
2
- # It's faster to just hard-code constants than to introspect them at runtime
3
- CONSTANTS = [
4
- :ArgumentError,
5
- :Array,
6
- :BasicObject,
7
- :Binding,
8
- :Class,
9
- :ClosedQueueError,
10
- :Comparable,
11
- :Complex,
12
- :ConditionVariable,
13
- :DidYouMean,
14
- :Dir,
15
- :Encoding,
16
- :EncodingError,
17
- :Enumerable,
18
- :Enumerator,
19
- :EOFError,
20
- :Errno,
21
- :ErrorHighlight,
22
- :Exception,
23
- :FalseClass,
24
- :Fiber,
25
- :FiberError,
26
- :File,
27
- :FileTest,
28
- :Float,
29
- :FloatDomainError,
30
- :FrozenError,
31
- :GC,
32
- :Gem,
33
- :Hash,
34
- :IndexError,
35
- :Integer,
36
- :Interrupt,
37
- :IO,
38
- :IOError,
39
- :Kernel,
40
- :KeyError,
41
- :LoadError,
42
- :LocalJumpError,
43
- :Marshal,
44
- :MatchData,
45
- :Math,
46
- :Method,
47
- :Module,
48
- :Monitor,
49
- :MonitorMixin,
50
- :Mutex,
51
- :NameError,
52
- :NilClass,
53
- :NoMatchingPatternError,
54
- :NoMatchingPatternKeyError,
55
- :NoMemoryError,
56
- :NoMethodError,
57
- :NotImplementedError,
58
- :Numeric,
59
- :Object,
60
- :ObjectSpace,
61
- :Proc,
62
- :Process,
63
- :Queue,
64
- :Ractor,
65
- :Random,
66
- :Range,
67
- :RangeError,
68
- :Rational,
69
- :RbConfig,
70
- :Refinement,
71
- :Regexp,
72
- :RegexpError,
73
- :RubyVM,
74
- :RuntimeError,
75
- :ScriptError,
76
- :SecurityError,
77
- :Set,
78
- :Signal,
79
- :SignalException,
80
- :SizedQueue,
81
- :StandardError,
82
- :StopIteration,
83
- :String,
84
- :Struct,
85
- :Symbol,
86
- :SyntaxError,
87
- :SystemCallError,
88
- :SystemExit,
89
- :SystemStackError,
90
- :Thread,
91
- :ThreadError,
92
- :ThreadGroup,
93
- :Time,
94
- :TracePoint,
95
- :TrueClass,
96
- :TypeError,
97
- :UnboundMethod,
98
- :UncaughtThrowError,
99
- :UnicodeNormalize,
100
- :URI,
101
- :Warning,
102
- :ZeroDivisionError,
103
- ]
104
- end