zeitwerk 2.1.2 → 2.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: afbe6dc64c3c97a4a2f2872d4e500374fc67ddae36a515d8791e3f8122a2447d
4
- data.tar.gz: 470325ed5fe48da426cfb86fd35f20d9377fe9b41515aa4146e310a85843cce5
3
+ metadata.gz: e458722eb922aa69f1c49c077b9cfa0bb8c0fa14d7a12f295b7375e5f31d6d33
4
+ data.tar.gz: 414f3bbe461b6081c39eff4640fda5eae0ea7d2e1649a981f84759ba6db538a7
5
5
  SHA512:
6
- metadata.gz: caca8ed04aa94078f1e1af395c7e4afda10047a436694a5c5b9f4769a7829e7277d1243cd470618c8027f250ea288c82781ae64cd7d5d0771dac27b288a4350b
7
- data.tar.gz: 507bbdb688e9b9412d908f784a902e807b90dd403df9939646c6d2d732367f9b8333b836354aa7b659425c1dc871c9bcf2f0fbe97a6522e444b968d2c5e12521
6
+ metadata.gz: fc0a61c385d372cdba449e80473d793133e71fc502cbda1f504d64759f6ff9e1ea65ebdcead21c472b89c84951915d687de2a3e71bff8307b91e2e4bd29339d5
7
+ data.tar.gz: 5b851f501b91740176047eb1fca04c3b5de04c482b055dc7605a15cbf571b719e4bb9e11bc939521411e1965ef07e539a023dc83b40eb059234b86fe41bf73d5
@@ -4,9 +4,10 @@ module Zeitwerk
4
4
  class Inflector # :nodoc:
5
5
  # Very basic snake case -> camel case conversion.
6
6
  #
7
- # Zeitwerk::Inflector.camelize("post", ...) # => "Post"
8
- # Zeitwerk::Inflector.camelize("users_controller", ...) # => "UsersController"
9
- # Zeitwerk::Inflector.camelize("api", ...) # => "Api"
7
+ # inflector = Zeitwerk::Inflector.new
8
+ # inflector.camelize("post", ...) # => "Post"
9
+ # inflector.camelize("users_controller", ...) # => "UsersController"
10
+ # inflector.camelize("api", ...) # => "Api"
10
11
  #
11
12
  # @param basename [String]
12
13
  # @param _abspath [String]
@@ -74,12 +74,12 @@ module Zeitwerk
74
74
  # executed--- to their corresponding parent class or module and constant
75
75
  # name.
76
76
  #
77
- # "/Users/fxn/blog/app/models/user.rb" => [Object, "User"],
78
- # "/Users/fxn/blog/app/models/hotel/pricing.rb" => [Hotel, "Pricing"]
77
+ # "/Users/fxn/blog/app/models/user.rb" => [Object, :User],
78
+ # "/Users/fxn/blog/app/models/hotel/pricing.rb" => [Hotel, :Pricing]
79
79
  # ...
80
80
  #
81
81
  # @private
82
- # @return [{String => (Module, String)}]
82
+ # @return [{String => (Module, Symbol)}]
83
83
  attr_reader :autoloads
84
84
 
85
85
  # We keep track of autoloaded directories to remove them from the registry
@@ -92,12 +92,20 @@ module Zeitwerk
92
92
  # @return [<String>]
93
93
  attr_reader :autoloaded_dirs
94
94
 
95
- # Constants paths that would be unloaded if you would reload. If reloading
96
- # is enabled, this hash is filled as constants are autoloaded or eager
97
- # loaded. Otherwise, the collection remains empty.
95
+ # Stores metadata needed for unloading. Its entries look like this:
96
+ #
97
+ # "Admin::Role" => [".../admin/role.rb", [Admin, :Role]]
98
+ #
99
+ # The constant path as key helps implementing to_unload? The real file name
100
+ # is stored in order to be able to delete it from $LOADED_FEATURES, and the
101
+ # pair [Module, Symbol] is used to remove_const the constant from the class
102
+ # or module object.
103
+ #
104
+ # If reloading is enabled, this hash is filled as constants are autoloaded
105
+ # or eager loaded. Otherwise, the collection remains empty.
98
106
  #
99
107
  # @private
100
- # @return [{String => (String, (Module, String))}]
108
+ # @return [{String => (String, (Module, Symbol))}]
101
109
  attr_reader :to_unload
102
110
 
103
111
  # Maps constant paths of namespaces to arrays of corresponding directories.
@@ -176,7 +184,11 @@ module Zeitwerk
176
184
  root_dirs.keys.freeze
177
185
  end
178
186
 
179
- # Pushes `paths` to the list of root directories.
187
+ # Pushes `path` to the list of root directories.
188
+ #
189
+ # Raises `Zeitwerk::Error` if `path` does not exist, or if another loader in
190
+ # the same process already manages that directory or one of its ascendants
191
+ # or descendants.
180
192
  #
181
193
  # @param path [<String, Pathname>]
182
194
  # @raise [Zeitwerk::Error]
@@ -413,7 +425,7 @@ module Zeitwerk
413
425
  #
414
426
  # @return [Zeitwerk::Loader]
415
427
  def for_gem
416
- called_from = caller[0].split(':')[0]
428
+ called_from = caller_locations.first.path
417
429
  Registry.loader_for_gem(called_from)
418
430
  end
419
431
 
@@ -447,7 +459,7 @@ module Zeitwerk
447
459
  # @return [void]
448
460
  def set_autoloads_in_dir(dir, parent)
449
461
  each_abspath(dir) do |abspath|
450
- cname = inflector.camelize(File.basename(abspath, ".rb"), abspath)
462
+ cname = inflector.camelize(File.basename(abspath, ".rb"), abspath).to_sym
451
463
  if ruby?(abspath)
452
464
  autoload_file(parent, cname, abspath)
453
465
  elsif dir?(abspath)
@@ -463,7 +475,7 @@ module Zeitwerk
463
475
  end
464
476
 
465
477
  # @param parent [Module]
466
- # @param cname [String]
478
+ # @param cname [Symbol]
467
479
  # @param subdir [String]
468
480
  # @return [void]
469
481
  def autoload_subdir(parent, cname, subdir)
@@ -486,7 +498,7 @@ module Zeitwerk
486
498
  end
487
499
 
488
500
  # @param parent [Module]
489
- # @param cname [String]
501
+ # @param cname [Symbol]
490
502
  # @param file [String]
491
503
  # @return [void]
492
504
  def autoload_file(parent, cname, file)
@@ -514,7 +526,7 @@ module Zeitwerk
514
526
  # @param dir [String] directory that would have autovivified a module
515
527
  # @param file [String] the file where the namespace is explictly defined
516
528
  # @param parent [Module]
517
- # @param cname [String]
529
+ # @param cname [Symbol]
518
530
  # @return [void]
519
531
  def promote_namespace_from_implicit_to_explicit(dir:, file:, parent:, cname:)
520
532
  autoloads.delete(dir)
@@ -525,7 +537,7 @@ module Zeitwerk
525
537
  end
526
538
 
527
539
  # @param parent [Module]
528
- # @param cname [String]
540
+ # @param cname [Symbol]
529
541
  # @param abspath [String]
530
542
  # @return [void]
531
543
  def set_autoload(parent, cname, abspath)
@@ -552,7 +564,7 @@ module Zeitwerk
552
564
  end
553
565
 
554
566
  # @param parent [Module]
555
- # @param cname [String]
567
+ # @param cname [Symbol]
556
568
  # @return [String, nil]
557
569
  def autoload_for?(parent, cname)
558
570
  strict_autoload_path(parent, cname) || Registry.inception?(cpath(parent, cname))
@@ -575,17 +587,10 @@ module Zeitwerk
575
587
  # We need a way to strictly check in parent ignoring ancestors.
576
588
  #
577
589
  # @param parent [Module]
578
- # @param cname [String]
590
+ # @param cname [Symbol]
579
591
  # @return [String, nil]
580
592
  def strict_autoload_path(parent, cname)
581
- if autoload_path = parent.autoload?(cname)
582
- # Due to the use cases we have, we are done if parent is a Module.
583
- return autoload_path unless parent.is_a?(Class)
584
- # Since file and constant names match, if both parent and one of its
585
- # ancestors have an autoload for the same cname, their autoload paths
586
- # cannot be equal.
587
- return autoload_path unless parent.superclass.autoload?(cname) == autoload_path
588
- end
593
+ parent.autoload?(cname) if cdef?(parent, cname)
589
594
  end
590
595
 
591
596
  # This method is called this way because I prefer `preload` to be the method
@@ -624,10 +629,10 @@ module Zeitwerk
624
629
  end
625
630
 
626
631
  # @param parent [Module]
627
- # @param cname [String]
632
+ # @param cname [Symbol]
628
633
  # @return [String]
629
634
  def cpath(parent, cname)
630
- parent.equal?(Object) ? cname : "#{parent.name}::#{cname}"
635
+ parent.equal?(Object) ? cname.to_s : "#{parent.name}::#{cname}"
631
636
  end
632
637
 
633
638
  # @param dir [String]
@@ -693,7 +698,7 @@ module Zeitwerk
693
698
  end
694
699
 
695
700
  # @param parent [Module]
696
- # @param cname [String]
701
+ # @param cname [Symbol]
697
702
  # @return [void]
698
703
  def unload_autoload(parent, cname)
699
704
  parent.send(:remove_const, cname)
@@ -701,7 +706,7 @@ module Zeitwerk
701
706
  end
702
707
 
703
708
  # @param parent [Module]
704
- # @param cname [String]
709
+ # @param cname [Symbol]
705
710
  # @return [void]
706
711
  def unload_cref(parent, cname)
707
712
  parent.send(:remove_const, cname)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Zeitwerk
4
- VERSION = "2.1.2"
4
+ VERSION = "2.1.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zeitwerk
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xavier Noria
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-11 00:00:00.000000000 Z
11
+ date: 2019-04-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2
14
14
  Zeitwerk implements constant autoloading with Ruby semantics. Each gem