nanoc 4.0.0b1 → 4.0.0b2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/NEWS.md +26 -2
  4. data/README.md +1 -1
  5. data/lib/nanoc/base.rb +3 -1
  6. data/lib/nanoc/base/checksummer.rb +1 -3
  7. data/lib/nanoc/base/compilation/compiler.rb +3 -3
  8. data/lib/nanoc/base/compilation/compiler_dsl.rb +3 -3
  9. data/lib/nanoc/base/compilation/item_rep_proxy.rb +1 -1
  10. data/lib/nanoc/base/core_ext/array.rb +0 -11
  11. data/lib/nanoc/base/core_ext/hash.rb +0 -11
  12. data/lib/nanoc/base/identifiable_collection.rb +81 -0
  13. data/lib/nanoc/base/source_data/identifier.rb +9 -9
  14. data/lib/nanoc/base/source_data/site.rb +7 -5
  15. data/lib/nanoc/base/views/identifiable_collection.rb +78 -0
  16. data/lib/nanoc/base/views/item_collection.rb +1 -86
  17. data/lib/nanoc/base/views/layout_collection.rb +1 -57
  18. data/lib/nanoc/base/views/mutable_identifiable_collection.rb +17 -0
  19. data/lib/nanoc/base/views/mutable_item_collection.rb +2 -14
  20. data/lib/nanoc/base/views/mutable_layout_collection.rb +2 -14
  21. data/lib/nanoc/cli/commands/create-site.rb +44 -40
  22. data/lib/nanoc/data_sources/filesystem.rb +1 -1
  23. data/lib/nanoc/data_sources/filesystem_unified.rb +3 -3
  24. data/lib/nanoc/data_sources/filesystem_verbose.rb +3 -3
  25. data/lib/nanoc/filters/erb.rb +2 -2
  26. data/lib/nanoc/filters/rdiscount.rb +1 -1
  27. data/lib/nanoc/filters/redcarpet.rb +1 -1
  28. data/lib/nanoc/version.rb +1 -1
  29. data/tasks/test.rake +1 -0
  30. data/test/base/core_ext/array_spec.rb +0 -8
  31. data/test/base/core_ext/hash_spec.rb +0 -26
  32. data/test/base/test_compiler.rb +1 -1
  33. data/test/base/test_compiler_dsl.rb +13 -10
  34. data/test/base/test_item.rb +0 -6
  35. data/test/base/test_item_array.rb +8 -276
  36. data/test/base/test_layout.rb +1 -5
  37. data/test/base/test_outdatedness_checker.rb +9 -2
  38. data/test/base/test_site.rb +5 -5
  39. data/test/cli/commands/test_compile.rb +14 -0
  40. data/test/cli/commands/test_create_site.rb +40 -2
  41. data/test/cli/commands/test_prune.rb +19 -4
  42. data/test/data_sources/test_filesystem.rb +1 -1
  43. data/test/data_sources/test_filesystem_unified.rb +6 -6
  44. data/test/extra/checking/checks/test_stale.rb +2 -2
  45. data/test/helper.rb +8 -1
  46. data/test/helpers/test_blogging.rb +0 -235
  47. data/test/helpers/test_breadcrumbs.rb +31 -23
  48. data/test/helpers/test_xml_sitemap.rb +38 -29
  49. metadata +5 -3
  50. data/lib/nanoc/base/source_data/item_array.rb +0 -86
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 90ed92857b63ba5cdfc7ea40b6f8a47d028a9dd4
4
- data.tar.gz: 634df8e12745fe703ff012cea92e430a90dc5880
3
+ metadata.gz: 399486061f80fd3acaf7058ec221d0b401fb6590
4
+ data.tar.gz: 1f1969bd69c51571a7a66bfd6451b6528f1923ae
5
5
  SHA512:
6
- metadata.gz: 0fcd435c5cfd92929ce88041689e8ad9cfe370194335a40d70ead941acdb22579a4741d53a3331bf75ff1cf248496233289140d207c0a734893859398b34306c
7
- data.tar.gz: 3e19e77f09ae7a5afbc52cfadf2a53f10e267e2c4dba4c436b75b749181ec1972adcf07f4795015074ec799fec2bd7afeaf1b7fbe2afd90b8983c6c0fca0ca8d
6
+ metadata.gz: f0c41f17f9fc07ad11b41b1ce6541c9be206a737d99d663f19eae58f68de91cfdce4f392848ac54d8835055784415bd33916003f3463cd14581fecd6005a8036
7
+ data.tar.gz: 13d7891f10c7014e22b731f2b4efc8982cc8dce52c47eb8ec037183cca0637cfb7661580a24dead39cf05085a668a1448257754f0fbce8f29271fe71eb5b3c1e
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nanoc (4.0.0b1)
4
+ nanoc (4.0.0b2)
5
5
  cri (~> 2.3)
6
6
 
7
7
  GEM
data/NEWS.md CHANGED
@@ -1,6 +1,30 @@
1
1
  # nanoc news
2
2
 
3
- ## 4.0.0b1 (2015-05-??)
3
+ ## 4.0.0b2 (2015-05-23)
4
+
5
+ Changes:
6
+
7
+ * Removed `ItemCollectionView#at` (#582)
8
+ * Removed support for calling `ItemCollectionView#[]` with an integer (#582)
9
+ * Renamed `identifier_style` to `identifier_type`, and made its values be `"full"` or `"legacy"` (#593)
10
+ * Renamed `pattern_syntax` to `string_pattern_type`, and made its values be `"glob"` or `"legacy"` (#593)
11
+ * Made `"full"` the default for `identifier_type` (#592, #594)
12
+ * Made `"glob"` the default for `string_pattern_type` (#592)
13
+ * Enabled auto-pruning by default for new sites (#590)
14
+
15
+ Enhancements:
16
+
17
+ * Added `--force` to `create-site` command (#580) [David Alexander]
18
+ * Made default Rules file more future-proof (#591)
19
+
20
+ Fixes:
21
+
22
+ * Fixed `LayoutCollectionView#[]` documentation (it mentioned items)
23
+ * Fixed `ItemCollectionView#[]` returning an array when passed a regex
24
+ * Fixed an issue with mutable collection views’ `#delete_if` not yielding mutable views
25
+ * Fixed an issue with collection views’ `#find_all` returning entities instead of views
26
+
27
+ ## 4.0.0b1 (2015-05-14)
4
28
 
5
29
  Changes:
6
30
 
@@ -14,7 +38,7 @@ Enhancements:
14
38
  * Added `Nanoc::Identifier#without_ext`
15
39
  * Made `Nanoc::Identifier#=~` work with a glob
16
40
  * Added `Nanoc::LayoutCollectionView#[]`
17
- * Added `--force` to `create-site` command (#549) [David Alexander]
41
+ * Allowed creation of site in current directory (#549) [David Alexander]
18
42
 
19
43
  Fixes:
20
44
 
data/README.md CHANGED
@@ -20,4 +20,4 @@ Contributions are greatly appreciated! Consult the [Development guidelines](http
20
20
 
21
21
  Many thanks to everyone who has contributed to nanoc in one way or another:
22
22
 
23
- Ale Muñoz, Alexander Mankuta, Arnau Siches, Ben Armston, Bil Bas, Brian Candler, Bruno Dufour, Chris Eppstein, Christian Plessl, Colin Barrett, Damien Pollet, Dan Callahan, Daniel Hofstetter, Daniel Mendler, Daniel Wollschlaeger, David Everitt, Dennis Sutch, Devon Luke Buchanan, Dmitry Bilunov, Eric Sunshine, Erik Hollensbe, Fabian Buch, Felix Hanley, Go Maeda, Gregory Pakosz, Grégory Karékinian, Guilherme Garnier, Jack Chu, Jake Benilov, Jasper Van der Jeugt, Jeff Forcier, John Nishinaga, Justin Clift, Justin Hileman, Kevin Lynagh, Louis T., Mathias Bynens, Matt Keveney, Matthew Frazier, Matthias Beyer, Matthias Reitinger, Matthias Vallentin, Michal Cichra, Nelson Chen, Nicky Peeters, Nikhil Marathe, Oliver Byford, Peter Aronoff, Raphael von der Grün, Remko Tronçon, Riley Goodside, Ruben Verborgh, Scott Vokes, Simon South, Spencer Whitt, Stanley Rost, Starr Horne, Stefan Bühler, Stuart Montgomery, Takashi Uchibe, Toon Willems, Tuomas Kareinen, Ursula Kallio, Vincent Driessen, Xavier Shay, Zaiste de Grengolada, Šime Ramov
23
+ Ale Muñoz, Alexander Mankuta, Arnau Siches, Ben Armston, Bil Bas, Brian Candler, Bruno Dufour, Chris Eppstein, Christian Plessl, Colin Barrett, Damien Pollet, Dan Callahan, Daniel Hofstetter, Daniel Mendler, Daniel Wollschlaeger, David Alexander, David Everitt, Dennis Sutch, Devon Luke Buchanan, Dmitry Bilunov, Eric Sunshine, Erik Hollensbe, Fabian Buch, Felix Hanley, Go Maeda, Gregory Pakosz, Grégory Karékinian, Guilherme Garnier, Jack Chu, Jake Benilov, Jasper Van der Jeugt, Jeff Forcier, John Nishinaga, Justin Clift, Justin Hileman, Kevin Lynagh, Louis T., Mathias Bynens, Matt Keveney, Matthew Frazier, Matthias Beyer, Matthias Reitinger, Matthias Vallentin, Michal Cichra, Nelson Chen, Nicky Peeters, Nikhil Marathe, Oliver Byford, Peter Aronoff, Raphael von der Grün, Remko Tronçon, Riley Goodside, Ruben Verborgh, Scott Vokes, Simon South, Spencer Whitt, Stanley Rost, Starr Horne, Stefan Bühler, Stuart Montgomery, Takashi Uchibe, Toon Willems, Tuomas Kareinen, Ursula Kallio, Vincent Driessen, Xavier Shay, Zaiste de Grengolada, Šime Ramov
@@ -9,6 +9,7 @@ module Nanoc
9
9
  autoload 'Identifier', 'nanoc/base/source_data/identifier'
10
10
 
11
11
  autoload 'ConfigView', 'nanoc/base/views/config'
12
+ autoload 'IdentifiableCollectionView', 'nanoc/base/views/identifiable_collection'
12
13
  autoload 'ItemView', 'nanoc/base/views/item'
13
14
  autoload 'ItemRepView', 'nanoc/base/views/item_rep'
14
15
  autoload 'ItemCollectionView', 'nanoc/base/views/item_collection'
@@ -16,6 +17,7 @@ module Nanoc
16
17
  autoload 'LayoutCollectionView', 'nanoc/base/views/layout_collection'
17
18
  autoload 'SiteView', 'nanoc/base/views/site'
18
19
 
20
+ autoload 'MutableIdentifiableCollectionView', 'nanoc/base/views/mutable_identifiable_collection'
19
21
  autoload 'MutableConfigView', 'nanoc/base/views/mutable_config'
20
22
  autoload 'MutableItemView', 'nanoc/base/views/mutable_item'
21
23
  autoload 'MutableItemCollectionView', 'nanoc/base/views/mutable_item_collection'
@@ -39,12 +41,12 @@ module Nanoc::Int
39
41
  autoload 'PluginRegistry', 'nanoc/base/plugin_registry'
40
42
  autoload 'Store', 'nanoc/base/store'
41
43
  autoload 'TempFilenameFactory', 'nanoc/base/temp_filename_factory'
44
+ autoload 'IdentifiableCollection', 'nanoc/base/identifiable_collection'
42
45
 
43
46
  # Load source data classes
44
47
  autoload 'CodeSnippet', 'nanoc/base/source_data/code_snippet'
45
48
  autoload 'Configuration', 'nanoc/base/source_data/configuration'
46
49
  autoload 'Item', 'nanoc/base/source_data/item'
47
- autoload 'ItemArray', 'nanoc/base/source_data/item_array'
48
50
  autoload 'Layout', 'nanoc/base/source_data/layout'
49
51
  autoload 'Site', 'nanoc/base/source_data/site'
50
52
 
@@ -64,9 +64,7 @@ module Nanoc::Int
64
64
  end
65
65
 
66
66
  digest.update('attributes')
67
- attributes = obj.attributes.dup
68
- attributes.delete(:file)
69
- update(attributes, digest, visited + [obj])
67
+ update(obj.attributes, digest, visited + [obj])
70
68
  else
71
69
  data = begin
72
70
  Marshal.dump(obj)
@@ -159,7 +159,7 @@ module Nanoc::Int
159
159
  # @return [void]
160
160
  def store
161
161
  # Calculate rule memory
162
- (reps + layouts).each do |obj|
162
+ (reps + layouts.to_a).each do |obj|
163
163
  rule_memory_store[obj] = rule_memory_calculator[obj]
164
164
  end
165
165
 
@@ -177,7 +177,7 @@ module Nanoc::Int
177
177
  #
178
178
  # @return [Nanoc::Int::DependencyTracker] The dependency tracker for this site
179
179
  def dependency_tracker
180
- dt = Nanoc::Int::DependencyTracker.new(@site.items + @site.layouts)
180
+ dt = Nanoc::Int::DependencyTracker.new(@site.items.to_a + @site.layouts.to_a)
181
181
  dt.compiler = self
182
182
  dt
183
183
  end
@@ -197,7 +197,7 @@ module Nanoc::Int
197
197
  #
198
198
  # @api private
199
199
  def objects
200
- site.items + site.layouts + site.code_snippets +
200
+ site.items.to_a + site.layouts.to_a + site.code_snippets +
201
201
  [site.config, rules_collection]
202
202
  end
203
203
 
@@ -260,14 +260,14 @@ module Nanoc::Int
260
260
 
261
261
  # @api private
262
262
  def create_pattern(arg)
263
- case @config[:pattern_syntax]
263
+ case @config[:string_pattern_type]
264
264
  when 'glob'
265
265
  Nanoc::Int::Pattern.from(arg)
266
- when nil
266
+ when 'legacy'
267
267
  Nanoc::Int::Pattern.from(identifier_to_regex(arg))
268
268
  else
269
269
  raise Nanoc::Int::Errors::GenericTrivial,
270
- "Invalid pattern_syntax: #{@config[:pattern_syntax]}"
270
+ "Invalid string_pattern_type: #{@config[:string_pattern_type]}"
271
271
  end
272
272
  end
273
273
 
@@ -105,7 +105,7 @@ module Nanoc::Int
105
105
  end
106
106
 
107
107
  def use_globs?
108
- @compiler.site.config[:pattern_syntax] == 'glob'
108
+ @compiler.site.config[:string_pattern_type] == 'glob'
109
109
  end
110
110
  end
111
111
  end
@@ -15,17 +15,6 @@ module Nanoc::ArrayExtensions
15
15
  array
16
16
  end
17
17
 
18
- # Returns a new array where all items' keys are recursively converted to
19
- # strings by calling {Nanoc::ArrayExtensions#__nanoc_stringify_keys_recursively} or
20
- # {Nanoc::HashExtensions#__nanoc_stringify_keys_recursively}.
21
- #
22
- # @return [Array] The converted array
23
- def __nanoc_stringify_keys_recursively
24
- reduce([]) do |array, element|
25
- array + [element.respond_to?(:__nanoc_stringify_keys_recursively) ? element.__nanoc_stringify_keys_recursively : element]
26
- end
27
- end
28
-
29
18
  # Freezes the contents of the array, as well as all array elements. The
30
19
  # array elements will be frozen using {#__nanoc_freeze_recursively} if they respond
31
20
  # to that message, or #freeze if they do not.
@@ -17,17 +17,6 @@ module Nanoc::HashExtensions
17
17
  hash
18
18
  end
19
19
 
20
- # Returns a new hash where all keys are recursively converted to strings by
21
- # calling {Nanoc::ArrayExtensions#__nanoc_stringify_keys_recursively} or
22
- # {Nanoc::HashExtensions#__nanoc_stringify_keys_recursively}.
23
- #
24
- # @return [Hash] The converted hash
25
- def __nanoc_stringify_keys_recursively
26
- reduce({}) do |hash, (key, value)|
27
- hash.merge(key.to_s => value.respond_to?(:__nanoc_stringify_keys_recursively) ? value.__nanoc_stringify_keys_recursively : value)
28
- end
29
- end
30
-
31
20
  # Freezes the contents of the hash, as well as all hash values. The hash
32
21
  # values will be frozen using {#__nanoc_freeze_recursively} if they respond to
33
22
  # that message, or #freeze if they do not.
@@ -0,0 +1,81 @@
1
+ # encoding: utf-8
2
+
3
+ module Nanoc::Int
4
+ # @api private
5
+ class IdentifiableCollection
6
+ include Enumerable
7
+
8
+ extend Forwardable
9
+
10
+ def_delegator :@objects, :each
11
+ def_delegator :@objects, :size
12
+ def_delegator :@objects, :<<
13
+ def_delegator :@objects, :concat
14
+
15
+ def initialize(config)
16
+ @config = config
17
+
18
+ @objects = []
19
+ end
20
+
21
+ def freeze
22
+ @objects.freeze
23
+ build_mapping
24
+ super
25
+ end
26
+
27
+ def [](arg)
28
+ case arg
29
+ when String
30
+ object_with_identifier(arg) || object_matching_glob(arg)
31
+ when Regexp
32
+ @objects.find { |i| i.identifier.to_s =~ arg }
33
+ else
34
+ raise ArgumentError, "don’t know how to fetch objects by #{arg.inspect}"
35
+ end
36
+ end
37
+
38
+ def to_a
39
+ @objects
40
+ end
41
+
42
+ def empty?
43
+ @objects.empty?
44
+ end
45
+
46
+ def delete_if(&block)
47
+ @objects.delete_if(&block)
48
+ end
49
+
50
+ protected
51
+
52
+ def object_with_identifier(identifier)
53
+ if self.frozen?
54
+ @mapping[identifier.to_s]
55
+ else
56
+ @objects.find { |i| i.identifier == identifier }
57
+ end
58
+ end
59
+
60
+ def object_matching_glob(glob)
61
+ if use_globs?
62
+ pat = Nanoc::Int::Pattern.from(glob)
63
+ @objects.find { |i| pat.match?(i.identifier) }
64
+ else
65
+ nil
66
+ end
67
+ end
68
+
69
+ def build_mapping
70
+ @mapping = {}
71
+ @objects.each do |object|
72
+ @mapping[object.identifier.to_s] = object
73
+ end
74
+ @mapping.freeze
75
+ end
76
+
77
+ def use_globs?
78
+ @config[:string_pattern_type] == 'glob'
79
+ end
80
+ end
81
+ end
@@ -16,10 +16,10 @@ module Nanoc
16
16
  end
17
17
 
18
18
  def initialize(string, params = {})
19
- @style = params.fetch(:style, :stripped)
19
+ @type = params.fetch(:type, :full)
20
20
 
21
- case @style
22
- when :stripped
21
+ case @type
22
+ when :legacy
23
23
  @string = "/#{string}/".gsub(/^\/+|\/+$/, '/').freeze
24
24
  when :full
25
25
  if string !~ /\A\//
@@ -29,7 +29,7 @@ module Nanoc
29
29
  @string = string.dup.freeze
30
30
  else
31
31
  raise Nanoc::Int::Errors::Generic,
32
- "Invalid :style param for identifier: #{@style.inspect}"
32
+ "Invalid :type param for identifier: #{@type.inspect}"
33
33
  end
34
34
  end
35
35
 
@@ -50,10 +50,10 @@ module Nanoc
50
50
  to_s <=> other.to_s
51
51
  end
52
52
 
53
- # @return [Boolean] True if this is a full-style identifier (i.e. includes
53
+ # @return [Boolean] True if this is a full-type identifier (i.e. includes
54
54
  # the extension), false otherwise
55
55
  def full?
56
- @style == :full
56
+ @type == :full
57
57
  end
58
58
 
59
59
  # @return [String]
@@ -72,12 +72,12 @@ module Nanoc
72
72
  raise Nanoc::Int::Errors::Generic,
73
73
  "Invalid prefix (does not start with a slash): #{@string.inspect}"
74
74
  end
75
- Nanoc::Identifier.new(string.sub(/\/+\z/, '') + @string, style: @style)
75
+ Nanoc::Identifier.new(string.sub(/\/+\z/, '') + @string, type: @type)
76
76
  end
77
77
 
78
78
  # @return [String]
79
79
  def with_ext(ext)
80
- if @style == :stripped
80
+ unless full?
81
81
  raise Nanoc::Int::Errors::Generic,
82
82
  'Cannot use #with_ext on identifier that does not include the file extension'
83
83
  end
@@ -117,7 +117,7 @@ module Nanoc
117
117
  end
118
118
 
119
119
  def inspect
120
- "<Nanoc::Identifier style=#{@style} #{to_s.inspect}>"
120
+ "<Nanoc::Identifier type=#{@type} #{to_s.inspect}>"
121
121
  end
122
122
  end
123
123
  end
@@ -24,7 +24,8 @@ module Nanoc::Int
24
24
  type: 'filesystem_unified',
25
25
  items_root: '/',
26
26
  layouts_root: '/',
27
- config: {}
27
+ config: {},
28
+ identifier_type: 'full',
28
29
  }
29
30
 
30
31
  # The default configuration for a site. A site's configuration overrides
@@ -32,14 +33,15 @@ module Nanoc::Int
32
33
  # that lacks some options, the default value will be taken from
33
34
  # `DEFAULT_CONFIG`.
34
35
  DEFAULT_CONFIG = {
35
- text_extensions: %w( css erb haml htm html js less markdown md php rb sass scss txt xhtml xml coffee hb handlebars mustache ms slim ).sort,
36
+ text_extensions: %w( css erb haml htm html js less markdown md php rb sass scss txt xhtml xml coffee hb handlebars mustache ms slim rdoc ).sort,
36
37
  lib_dirs: %w( lib ),
37
38
  commands_dirs: %w( commands ),
38
39
  output_dir: 'output',
39
40
  data_sources: [{}],
40
41
  index_filenames: ['index.html'],
41
42
  enable_output_diff: false,
42
- prune: { auto_prune: false, exclude: ['.git', '.hg', '.svn', 'CVS'] }
43
+ prune: { auto_prune: false, exclude: ['.git', '.hg', '.svn', 'CVS'] },
44
+ string_pattern_type: 'glob',
43
45
  }
44
46
 
45
47
  # Creates a site object for the site specified by the given
@@ -325,7 +327,7 @@ module Nanoc::Int
325
327
  @items_loaded = true
326
328
 
327
329
  # Get items
328
- @items = Nanoc::Int::ItemArray.new(@config)
330
+ @items = Nanoc::Int::IdentifiableCollection.new(@config)
329
331
  data_sources.each do |ds|
330
332
  items_in_ds = ds.items
331
333
  items_in_ds.each do |i|
@@ -343,7 +345,7 @@ module Nanoc::Int
343
345
  @layouts_loaded = true
344
346
 
345
347
  # Get layouts
346
- @layouts = []
348
+ @layouts = Nanoc::Int::IdentifiableCollection.new(@config)
347
349
  data_sources.each do |ds|
348
350
  layouts_in_ds = ds.layouts
349
351
  layouts_in_ds.each do |l|
@@ -0,0 +1,78 @@
1
+ # encoding: utf-8
2
+
3
+ module Nanoc
4
+ class IdentifiableCollectionView
5
+ include Enumerable
6
+
7
+ # @api private
8
+ def initialize(objects)
9
+ @objects = objects
10
+ end
11
+
12
+ # @api private
13
+ def unwrap
14
+ @objects
15
+ end
16
+
17
+ # @abstract
18
+ #
19
+ # @api private
20
+ def view_class
21
+ raise NotImplementedError
22
+ end
23
+
24
+ # Calls the given block once for each object, passing that object as a parameter.
25
+ #
26
+ # @yieldparam [#identifier] object
27
+ #
28
+ # @yieldreturn [void]
29
+ #
30
+ # @return [self]
31
+ def each
32
+ @objects.each { |i| yield view_class.new(i) }
33
+ self
34
+ end
35
+
36
+ # @return [Integer]
37
+ def size
38
+ @objects.size
39
+ end
40
+
41
+ # Finds all objects whose identifier matches the given argument.
42
+ #
43
+ # @param [String, Regex] arg
44
+ #
45
+ # @return [Enumerable]
46
+ def find_all(arg)
47
+ pat = Nanoc::Int::Pattern.from(arg)
48
+ select { |i| pat.match?(i.identifier) }
49
+ end
50
+
51
+ # @overload [](string)
52
+ #
53
+ # Finds the object whose identifier matches the given string.
54
+ #
55
+ # If the glob syntax is enabled, the string can be a glob, in which case
56
+ # this method finds the first object that matches the given glob.
57
+ #
58
+ # @param [String] string
59
+ #
60
+ # @return [nil] if no object matches the string
61
+ #
62
+ # @return [#identifier] if an object was found
63
+ #
64
+ # @overload [](regex)
65
+ #
66
+ # Finds the object whose identifier matches the given regular expression.
67
+ #
68
+ # @param [Regex] regex
69
+ #
70
+ # @return [nil] if no object matches the regex
71
+ #
72
+ # @return [#identifier] if an object was found
73
+ def [](arg)
74
+ res = @objects[arg]
75
+ res && view_class.new(res)
76
+ end
77
+ end
78
+ end