nanoc 4.11.0 → 4.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +6 -0
  3. data/lib/nanoc.rb +4 -7
  4. data/lib/nanoc/base.rb +3 -3
  5. data/lib/nanoc/base/assertions.rb +1 -1
  6. data/lib/nanoc/base/entities.rb +2 -20
  7. data/lib/nanoc/base/entities/action_sequence.rb +60 -64
  8. data/lib/nanoc/base/entities/checksum_collection.rb +23 -21
  9. data/lib/nanoc/base/entities/dependency.rb +24 -22
  10. data/lib/nanoc/base/entities/outdatedness_reasons.rb +74 -72
  11. data/lib/nanoc/base/entities/outdatedness_status.rb +19 -17
  12. data/lib/nanoc/base/entities/props.rb +119 -117
  13. data/lib/nanoc/base/entities/site.rb +46 -50
  14. data/lib/nanoc/base/errors.rb +183 -198
  15. data/lib/nanoc/base/repos.rb +4 -2
  16. data/lib/nanoc/base/repos/action_sequence_store.rb +44 -42
  17. data/lib/nanoc/base/repos/aggregate_data_source.rb +24 -22
  18. data/lib/nanoc/base/repos/checksum_store.rb +51 -49
  19. data/lib/nanoc/base/repos/compiled_content_cache.rb +47 -45
  20. data/lib/nanoc/base/repos/compiled_content_store.rb +76 -0
  21. data/lib/nanoc/base/repos/config_loader.rb +74 -72
  22. data/lib/nanoc/base/repos/dependency_store.rb +174 -172
  23. data/lib/nanoc/base/repos/in_mem_data_source.rb +17 -15
  24. data/lib/nanoc/base/repos/item_rep_repo.rb +26 -24
  25. data/lib/nanoc/base/repos/outdatedness_store.rb +50 -48
  26. data/lib/nanoc/base/repos/prefixed_data_source.rb +21 -19
  27. data/lib/nanoc/base/repos/site_loader.rb +75 -73
  28. data/lib/nanoc/base/repos/store.rb +93 -91
  29. data/lib/nanoc/base/services.rb +7 -3
  30. data/lib/nanoc/base/services/action_provider.rb +23 -21
  31. data/lib/nanoc/base/services/action_sequence_builder.rb +42 -34
  32. data/lib/nanoc/base/services/compilation_context.rb +49 -47
  33. data/lib/nanoc/base/services/compiler.rb +177 -170
  34. data/lib/nanoc/base/services/compiler/phases.rb +8 -1
  35. data/lib/nanoc/base/services/compiler/phases/abstract.rb +44 -38
  36. data/lib/nanoc/base/services/compiler/phases/cache.rb +34 -28
  37. data/lib/nanoc/base/services/compiler/phases/mark_done.rb +17 -11
  38. data/lib/nanoc/base/services/compiler/phases/notify.rb +21 -0
  39. data/lib/nanoc/base/services/compiler/phases/recalculate.rb +37 -31
  40. data/lib/nanoc/base/services/compiler/phases/resume.rb +47 -48
  41. data/lib/nanoc/base/services/compiler/phases/write.rb +65 -59
  42. data/lib/nanoc/base/services/compiler/stage.rb +27 -8
  43. data/lib/nanoc/base/services/compiler/stages.rb +7 -1
  44. data/lib/nanoc/base/services/compiler/stages/build_reps.rb +25 -19
  45. data/lib/nanoc/base/services/compiler/stages/calculate_checksums.rb +34 -28
  46. data/lib/nanoc/base/services/compiler/stages/cleanup.rb +33 -27
  47. data/lib/nanoc/base/services/compiler/stages/compile_reps.rb +79 -69
  48. data/lib/nanoc/base/services/compiler/stages/determine_outdatedness.rb +46 -40
  49. data/lib/nanoc/base/services/compiler/stages/forget_outdated_dependencies.rb +15 -9
  50. data/lib/nanoc/base/services/compiler/stages/load_stores.rb +28 -22
  51. data/lib/nanoc/base/services/compiler/stages/postprocess.rb +16 -10
  52. data/lib/nanoc/base/services/compiler/stages/preprocess.rb +25 -19
  53. data/lib/nanoc/base/services/compiler/stages/prune.rb +23 -17
  54. data/lib/nanoc/base/services/compiler/stages/store_post_compilation_state.rb +15 -9
  55. data/lib/nanoc/base/services/compiler/stages/store_pre_compilation_state.rb +26 -20
  56. data/lib/nanoc/base/services/compiler_loader.rb +26 -24
  57. data/lib/nanoc/base/services/dependency_tracker.rb +47 -45
  58. data/lib/nanoc/base/services/executor.rb +16 -15
  59. data/lib/nanoc/base/services/filter.rb +37 -5
  60. data/lib/nanoc/base/services/instrumentor.rb +12 -10
  61. data/lib/nanoc/base/services/item_rep_builder.rb +21 -19
  62. data/lib/nanoc/base/services/item_rep_router.rb +72 -70
  63. data/lib/nanoc/base/services/item_rep_selector.rb +48 -46
  64. data/lib/nanoc/base/services/item_rep_writer.rb +58 -53
  65. data/lib/nanoc/base/services/outdatedness_checker.rb +181 -179
  66. data/lib/nanoc/base/services/outdatedness_rule.rb +23 -21
  67. data/lib/nanoc/base/services/outdatedness_rules.rb +5 -3
  68. data/lib/nanoc/base/services/outdatedness_rules/attributes_modified.rb +28 -24
  69. data/lib/nanoc/base/services/outdatedness_rules/code_snippets_modified.rb +20 -16
  70. data/lib/nanoc/base/services/outdatedness_rules/content_modified.rb +13 -9
  71. data/lib/nanoc/base/services/outdatedness_rules/item_collection_extended.rb +12 -8
  72. data/lib/nanoc/base/services/outdatedness_rules/layout_collection_extended.rb +12 -8
  73. data/lib/nanoc/base/services/outdatedness_rules/not_written.rb +10 -6
  74. data/lib/nanoc/base/services/outdatedness_rules/rules_modified.rb +39 -35
  75. data/lib/nanoc/base/services/outdatedness_rules/uses_always_outdated_filter.rb +19 -15
  76. data/lib/nanoc/base/services/pruner.rb +2 -2
  77. data/lib/nanoc/base/views.rb +7 -0
  78. data/lib/nanoc/base/views/basic_item_view.rb +1 -1
  79. data/lib/nanoc/base/views/compilation_item_rep_view.rb +2 -2
  80. data/lib/nanoc/base/views/identifiable_collection_view.rb +2 -2
  81. data/lib/nanoc/base/views/mixins/document_view_mixin.rb +1 -1
  82. data/lib/nanoc/base/views/mixins/mutable_document_view_mixin.rb +5 -5
  83. data/lib/nanoc/base/views/mutable_item_collection_view.rb +3 -3
  84. data/lib/nanoc/base/views/mutable_layout_collection_view.rb +2 -2
  85. data/lib/nanoc/base/views/view_context_for_compilation.rb +6 -6
  86. data/lib/nanoc/base/views/view_context_for_pre_compilation.rb +2 -2
  87. data/lib/nanoc/base/views/view_context_for_shell.rb +2 -2
  88. data/lib/nanoc/checking/check.rb +1 -1
  89. data/lib/nanoc/cli/commands/compile_listeners/abstract.rb +24 -7
  90. data/lib/nanoc/cli/commands/compile_listeners/debug_printer.rb +79 -15
  91. data/lib/nanoc/cli/commands/compile_listeners/diff_generator.rb +4 -7
  92. data/lib/nanoc/cli/commands/compile_listeners/file_action_printer.rb +15 -24
  93. data/lib/nanoc/cli/commands/compile_listeners/timing_recorder.rb +22 -18
  94. data/lib/nanoc/cli/commands/create-site.rb +2 -7
  95. data/lib/nanoc/cli/commands/shell.rb +1 -1
  96. data/lib/nanoc/cli/commands/show-data.rb +9 -9
  97. data/lib/nanoc/cli/logger.rb +1 -1
  98. data/lib/nanoc/data_sources/filesystem.rb +8 -8
  99. data/lib/nanoc/filters/erb.rb +1 -1
  100. data/lib/nanoc/filters/erubi.rb +1 -1
  101. data/lib/nanoc/filters/erubis.rb +1 -1
  102. data/lib/nanoc/filters/haml.rb +1 -1
  103. data/lib/nanoc/filters/sass.rb +1 -1
  104. data/lib/nanoc/filters/slim.rb +1 -1
  105. data/lib/nanoc/helpers/breadcrumbs.rb +2 -2
  106. data/lib/nanoc/helpers/capturing.rb +9 -8
  107. data/lib/nanoc/helpers/filtering.rb +2 -2
  108. data/lib/nanoc/helpers/rendering.rb +1 -1
  109. data/lib/nanoc/rule_dsl.rb +10 -0
  110. data/lib/nanoc/rule_dsl/action_provider.rb +3 -3
  111. data/lib/nanoc/rule_dsl/action_recorder.rb +3 -3
  112. data/lib/nanoc/rule_dsl/action_sequence_calculator.rb +7 -7
  113. data/lib/nanoc/rule_dsl/compilation_rule.rb +2 -2
  114. data/lib/nanoc/rule_dsl/compilation_rule_context.rb +9 -9
  115. data/lib/nanoc/rule_dsl/compiler_dsl.rb +4 -4
  116. data/lib/nanoc/rule_dsl/routing_rule.rb +3 -3
  117. data/lib/nanoc/rule_dsl/rule.rb +5 -5
  118. data/lib/nanoc/rule_dsl/rule_context.rb +3 -3
  119. data/lib/nanoc/rule_dsl/rules_collection.rb +4 -4
  120. data/lib/nanoc/spec.rb +15 -15
  121. data/lib/nanoc/version.rb +1 -1
  122. metadata +10 -111
  123. data/lib/nanoc/base/contracts_support.rb +0 -130
  124. data/lib/nanoc/base/core_ext.rb +0 -5
  125. data/lib/nanoc/base/core_ext/array.rb +0 -50
  126. data/lib/nanoc/base/core_ext/hash.rb +0 -54
  127. data/lib/nanoc/base/core_ext/string.rb +0 -16
  128. data/lib/nanoc/base/entities/code_snippet.rb +0 -53
  129. data/lib/nanoc/base/entities/configuration-schema.json +0 -122
  130. data/lib/nanoc/base/entities/configuration.rb +0 -206
  131. data/lib/nanoc/base/entities/content.rb +0 -112
  132. data/lib/nanoc/base/entities/context.rb +0 -70
  133. data/lib/nanoc/base/entities/directed_graph.rb +0 -195
  134. data/lib/nanoc/base/entities/document.rb +0 -125
  135. data/lib/nanoc/base/entities/identifiable_collection.rb +0 -141
  136. data/lib/nanoc/base/entities/identifier.rb +0 -222
  137. data/lib/nanoc/base/entities/item.rb +0 -10
  138. data/lib/nanoc/base/entities/item_collection.rb +0 -14
  139. data/lib/nanoc/base/entities/item_rep.rb +0 -91
  140. data/lib/nanoc/base/entities/layout.rb +0 -10
  141. data/lib/nanoc/base/entities/layout_collection.rb +0 -14
  142. data/lib/nanoc/base/entities/lazy_value.rb +0 -43
  143. data/lib/nanoc/base/entities/pattern.rb +0 -85
  144. data/lib/nanoc/base/entities/processing_action.rb +0 -21
  145. data/lib/nanoc/base/entities/processing_actions.rb +0 -5
  146. data/lib/nanoc/base/entities/processing_actions/filter.rb +0 -36
  147. data/lib/nanoc/base/entities/processing_actions/layout.rb +0 -36
  148. data/lib/nanoc/base/entities/processing_actions/snapshot.rb +0 -46
  149. data/lib/nanoc/base/entities/snapshot_def.rb +0 -22
  150. data/lib/nanoc/base/repos/data_source.rb +0 -168
  151. data/lib/nanoc/base/repos/snapshot_repo.rb +0 -67
  152. data/lib/nanoc/base/services/checksummer.rb +0 -274
  153. data/lib/nanoc/base/services/notification_center.rb +0 -87
  154. data/lib/nanoc/base/services/temp_filename_factory.rb +0 -52
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nanoc::Int
4
- # @api private
5
- class SnapshotRepo
6
- include Nanoc::Int::ContractsSupport
7
-
8
- def initialize
9
- @contents = {}
10
- end
11
-
12
- contract Nanoc::Int::ItemRep, Symbol => C::Maybe[Nanoc::Int::Content]
13
- def get(rep, snapshot_name)
14
- @contents[rep] ||= {}
15
- @contents[rep][snapshot_name]
16
- end
17
-
18
- contract Nanoc::Int::ItemRep, Symbol, Nanoc::Int::Content => C::Any
19
- def set(rep, snapshot_name, contents)
20
- @contents[rep] ||= {}
21
- @contents[rep][snapshot_name] = contents
22
- end
23
-
24
- contract Nanoc::Int::ItemRep => C::HashOf[Symbol => Nanoc::Int::Content]
25
- def get_all(rep)
26
- @contents[rep] || {}
27
- end
28
-
29
- contract Nanoc::Int::ItemRep, C::HashOf[Symbol => Nanoc::Int::Content] => C::Any
30
- def set_all(rep, contents_per_snapshot)
31
- @contents[rep] = contents_per_snapshot
32
- end
33
-
34
- contract C::KeywordArgs[rep: Nanoc::Int::ItemRep, snapshot: C::Optional[C::Maybe[Symbol]]] => Nanoc::Int::Content
35
- def raw_compiled_content(rep:, snapshot: nil)
36
- # Get name of last pre-layout snapshot
37
- snapshot_name = snapshot || (get(rep, :pre) ? :pre : :last)
38
-
39
- # Check existance of snapshot
40
- snapshot_def = rep.snapshot_defs.reverse.find { |sd| sd.name == snapshot_name }
41
- unless snapshot_def
42
- raise Nanoc::Int::Errors::NoSuchSnapshot.new(rep, snapshot_name)
43
- end
44
-
45
- # Verify snapshot is usable
46
- stopped_moving = snapshot_name != :last || rep.compiled?
47
- is_usable_snapshot = get(rep, snapshot_name) && stopped_moving
48
- unless is_usable_snapshot
49
- Fiber.yield(Nanoc::Int::Errors::UnmetDependency.new(rep))
50
- return raw_compiled_content(rep: rep, snapshot: snapshot)
51
- end
52
-
53
- get(rep, snapshot_name)
54
- end
55
-
56
- contract C::KeywordArgs[rep: Nanoc::Int::ItemRep, snapshot: C::Optional[C::Maybe[Symbol]]] => String
57
- def compiled_content(rep:, snapshot: nil)
58
- snapshot_content = raw_compiled_content(rep: rep, snapshot: snapshot)
59
-
60
- if snapshot_content.binary?
61
- raise Nanoc::Int::Errors::CannotGetCompiledContentOfBinaryItem.new(rep)
62
- end
63
-
64
- snapshot_content.string
65
- end
66
- end
67
- end
@@ -1,274 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nanoc::Int
4
- # Creates checksums for given objects.
5
- #
6
- # A checksum is a string, such as “mL+TaqNsEeiPkWloPgCtAofT1yg=”, that is used
7
- # to determine whether a piece of data has changed.
8
- #
9
- # @api private
10
- class Checksummer
11
- class VerboseDigest
12
- def initialize
13
- @str = +''
14
- end
15
-
16
- def update(str)
17
- @str << str
18
- end
19
-
20
- def to_s
21
- @str
22
- end
23
- end
24
-
25
- class CompactDigest
26
- def initialize
27
- @digest = Digest::SHA1.new
28
- end
29
-
30
- def update(str)
31
- @digest.update(str)
32
- end
33
-
34
- def to_s
35
- @digest.base64digest
36
- end
37
- end
38
-
39
- class << self
40
- # @param obj The object to create a checksum for
41
- #
42
- # @return [String] The digest
43
- def calc(obj, digest_class = CompactDigest)
44
- digest = digest_class.new
45
- update(obj, digest)
46
- digest.to_s
47
- end
48
-
49
- def calc_for_content_of(obj)
50
- obj.content_checksum_data || obj.checksum_data || Nanoc::Int::Checksummer.calc(obj.content)
51
- end
52
-
53
- def calc_for_each_attribute_of(obj, digest_class = CompactDigest)
54
- obj.attributes.each_with_object({}) do |(key, value), memo|
55
- memo[key] = Nanoc::Int::Checksummer.calc(value, digest_class)
56
- end
57
- end
58
-
59
- private
60
-
61
- def update(obj, digest, visited = Hamster::Set.new)
62
- digest.update(obj.class.to_s)
63
-
64
- if visited.include?(obj)
65
- digest.update('<recur>')
66
- else
67
- digest.update('<')
68
- behavior_for(obj).update(obj, digest) { |o| update(o, digest, visited.add(obj)) }
69
- digest.update('>')
70
- end
71
- end
72
-
73
- def behavior_for(obj)
74
- case obj
75
- when String, Symbol, Numeric
76
- RawUpdateBehavior
77
- when Pathname
78
- PathnameUpdateBehavior
79
- when Nanoc::Int::BinaryContent
80
- BinaryContentUpdateBehavior
81
- when Array, Nanoc::Int::IdentifiableCollection
82
- ArrayUpdateBehavior
83
- when Hash, Nanoc::Int::Configuration
84
- HashUpdateBehavior
85
- when Nanoc::Int::Item, Nanoc::Int::Layout
86
- DocumentUpdateBehavior
87
- when Nanoc::Int::ItemRep
88
- ItemRepUpdateBehavior
89
- when NilClass, TrueClass, FalseClass
90
- NoUpdateBehavior
91
- when Time
92
- ToIToSUpdateBehavior
93
- when Nanoc::Identifier
94
- ToSUpdateBehavior
95
- when Nanoc::RuleDSL::RulesCollection, Nanoc::Int::CodeSnippet
96
- DataUpdateBehavior
97
- when Nanoc::Int::TextualContent
98
- StringUpdateBehavior
99
- when Nanoc::View
100
- UnwrapUpdateBehavior
101
- when Nanoc::RuleDSL::CompilationRuleContext
102
- RuleContextUpdateBehavior
103
- when Nanoc::Int::Context
104
- ContextUpdateBehavior
105
- else
106
- RescueUpdateBehavior
107
- end
108
- end
109
- end
110
-
111
- class UpdateBehavior
112
- def self.update(_obj, _digest)
113
- raise NotImpementedError
114
- end
115
- end
116
-
117
- class RuleContextUpdateBehavior < UpdateBehavior
118
- def self.update(obj, digest)
119
- digest.update('item=')
120
- yield(obj.item)
121
- digest.update(',rep=')
122
- yield(obj.rep)
123
- digest.update(',items=')
124
- yield(obj.items)
125
- digest.update(',layouts=')
126
- yield(obj.layouts)
127
- digest.update(',config=')
128
- yield(obj.config)
129
- end
130
- end
131
-
132
- class ContextUpdateBehavior < UpdateBehavior
133
- def self.update(obj, digest)
134
- obj.instance_variables.each do |var|
135
- digest.update(var.to_s)
136
- digest.update('=')
137
- yield(obj.instance_variable_get(var))
138
- digest.update(',')
139
- end
140
- end
141
- end
142
-
143
- class RawUpdateBehavior < UpdateBehavior
144
- def self.update(obj, digest)
145
- digest.update(obj.to_s)
146
- end
147
- end
148
-
149
- class ToSUpdateBehavior < UpdateBehavior
150
- def self.update(obj, _digest)
151
- yield(obj.to_s)
152
- end
153
- end
154
-
155
- class ToIToSUpdateBehavior < UpdateBehavior
156
- def self.update(obj, digest)
157
- digest.update(obj.to_i.to_s)
158
- end
159
- end
160
-
161
- class StringUpdateBehavior < UpdateBehavior
162
- def self.update(obj, _digest)
163
- yield(obj.string)
164
- end
165
- end
166
-
167
- class DataUpdateBehavior < UpdateBehavior
168
- def self.update(obj, _digest)
169
- yield(obj.data)
170
- end
171
- end
172
-
173
- class NoUpdateBehavior < UpdateBehavior
174
- def self.update(_obj, _digest); end
175
- end
176
-
177
- class UnwrapUpdateBehavior < UpdateBehavior
178
- def self.update(obj, _digest)
179
- yield(obj._unwrap)
180
- end
181
- end
182
-
183
- class ArrayUpdateBehavior < UpdateBehavior
184
- def self.update(obj, digest)
185
- obj.each do |el|
186
- yield(el)
187
- digest.update(',')
188
- end
189
- end
190
- end
191
-
192
- class HashUpdateBehavior < UpdateBehavior
193
- def self.update(obj, digest)
194
- obj.each do |key, value|
195
- yield(key)
196
- digest.update('=')
197
- yield(value)
198
- digest.update(',')
199
- end
200
- end
201
- end
202
-
203
- class DocumentUpdateBehavior < UpdateBehavior
204
- def self.update(obj, digest)
205
- if obj.checksum_data
206
- digest.update('checksum_data=' + obj.checksum_data)
207
- else
208
- if obj.content_checksum_data
209
- digest.update('content_checksum_data=' + obj.content_checksum_data)
210
- else
211
- digest.update('content=')
212
- yield(obj.content)
213
- end
214
-
215
- if obj.attributes_checksum_data
216
- digest.update(',attributes_checksum_data=' + obj.attributes_checksum_data)
217
- else
218
- digest.update(',attributes=')
219
- yield(obj.attributes)
220
- end
221
-
222
- digest.update(',identifier=')
223
- yield(obj.identifier)
224
- end
225
- end
226
- end
227
-
228
- class ItemRepUpdateBehavior < UpdateBehavior
229
- def self.update(obj, digest)
230
- digest.update('item=')
231
- yield(obj.item)
232
- digest.update(',name=')
233
- yield(obj.name)
234
- end
235
- end
236
-
237
- class PathnameUpdateBehavior < UpdateBehavior
238
- def self.update(obj, digest)
239
- filename = obj.to_s
240
- if File.exist?(filename)
241
- stat = File.stat(filename)
242
- digest.update(stat.size.to_s + '-' + stat.mtime.to_i.to_s)
243
- else
244
- digest.update('???')
245
- end
246
- end
247
- end
248
-
249
- class BinaryContentUpdateBehavior < UpdateBehavior
250
- def self.update(obj, _digest)
251
- yield(Pathname.new(obj.filename))
252
- end
253
- end
254
-
255
- class RescueUpdateBehavior < UpdateBehavior
256
- def self.update(obj, digest)
257
- if obj.class.to_s == 'Sass::Importers::Filesystem'
258
- digest.update('root=')
259
- digest.update(obj.root)
260
- return
261
- end
262
-
263
- data =
264
- begin
265
- Marshal.dump(obj)
266
- rescue
267
- obj.inspect
268
- end
269
-
270
- digest.update(data)
271
- end
272
- end
273
- end
274
- end
@@ -1,87 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nanoc::Int
4
- # Provides a way to send notifications between objects. It allows blocks
5
- # associated with a certain notification name to be registered; these blocks
6
- # will be called when the notification with the given name is posted.
7
- #
8
- # It is a slightly different implementation of the Observer pattern; the
9
- # table of subscribers is not stored in the observable object itself, but in
10
- # the notification center.
11
- #
12
- # @api private
13
- class NotificationCenter
14
- class << self
15
- # Adds the given block to the list of blocks that should be called when
16
- # the notification with the given name is received.
17
- #
18
- # @param [String, Symbol] name The name of the notification that will
19
- # cause the given block to be called.
20
- #
21
- # @param [String, Symbol, nil] id An identifier for the block. This is
22
- # only used to be able to remove the block (using the remove method)
23
- # later. Can be nil, but this is not recommended because it prevents
24
- # the given notification block from being unregistered.
25
- #
26
- # @yield [*args] Will be executed with the arguments passed to {.post}
27
- #
28
- # @return [void]
29
- def on(name, id = nil, &block)
30
- initialize_if_necessary(name)
31
-
32
- # Add observer
33
- @notifications[name] << { id: id, block: block }
34
- end
35
-
36
- # Posts a notification with the given name and the given arguments.
37
- #
38
- # @param [String, Symbol] name The name of the notification that should
39
- # be posted.
40
- #
41
- # @param args Arguments that wil be passed to the blocks handling the
42
- # notification.
43
- #
44
- # @return [void]
45
- def post(name, *args)
46
- initialize_if_necessary(name)
47
-
48
- # Notify all observers
49
- @notifications[name].each do |observer|
50
- observer[:block].call(*args)
51
- end
52
- end
53
-
54
- # Removes the block with the given identifier from the list of blocks
55
- # that should be called when the notification with the given name is
56
- # posted.
57
- #
58
- # @param [String, Symbol] name The name of the notification that should
59
- # no longer be registered.
60
- #
61
- # @param [String, Symbol] id The identifier of the block that should be
62
- # removed.
63
- #
64
- # @return [void]
65
- def remove(name, id)
66
- initialize_if_necessary(name)
67
-
68
- # Remove relevant observers
69
- @notifications[name].reject! { |i| i[:id] == id }
70
- end
71
-
72
- # @api private
73
- #
74
- # @return [void]
75
- def reset
76
- @notifications = nil
77
- end
78
-
79
- private
80
-
81
- def initialize_if_necessary(name)
82
- @notifications ||= {} # name => observers dictionary
83
- @notifications[name] ||= [] # list of observers
84
- end
85
- end
86
- end
87
- end
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nanoc::Int
4
- # @api private
5
- class TempFilenameFactory
6
- # @return [String] The root directory for all temporary filenames
7
- attr_reader :root_dir
8
-
9
- # @return [Nanoc::Int::TempFilenameFactory] A common instance
10
- def self.instance
11
- @instance ||= new
12
- end
13
-
14
- def initialize
15
- @counts = {}
16
- @root_dir = Dir.mktmpdir('nanoc')
17
- end
18
-
19
- # @param [String] prefix A string prefix to include in the temporary
20
- # filename, often the type of filename being provided.
21
- #
22
- # @return [String] A new unused filename
23
- def create(prefix)
24
- count = @counts.fetch(prefix, 0)
25
- @counts[prefix] = count + 1
26
-
27
- dirname = File.join(@root_dir, prefix)
28
- filename = File.join(@root_dir, prefix, count.to_s)
29
-
30
- FileUtils.mkdir_p(dirname)
31
-
32
- filename
33
- end
34
-
35
- # @param [String] prefix A string prefix that indicates which temporary
36
- # filenames should be deleted.
37
- #
38
- # @return [void]
39
- def cleanup(prefix)
40
- path = File.join(@root_dir, prefix)
41
- if File.exist?(path)
42
- FileUtils.rm_rf(path)
43
- end
44
-
45
- @counts.delete(prefix)
46
-
47
- if @counts.empty? && File.directory?(@root_dir)
48
- FileUtils.rm_rf(@root_dir)
49
- end
50
- end
51
- end
52
- end