zeitwerk 2.1.2 → 2.1.3

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: 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