nanoc 4.7.10 → 4.7.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/CONTRIBUTING.md +17 -0
- data/.github/ISSUE_TEMPLATE.md +23 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +18 -0
- data/.gitignore +8 -0
- data/.rspec +3 -0
- data/.rubocop.yml +174 -0
- data/.travis.yml +27 -0
- data/Gemfile +4 -3
- data/NEWS.md +11 -0
- data/Rakefile +5 -2
- data/lib/nanoc/base/entities/dependency.rb +5 -3
- data/lib/nanoc/base/entities/layout.rb +1 -1
- data/lib/nanoc/base/repos/dependency_store.rb +64 -28
- data/lib/nanoc/base/services/dependency_tracker.rb +1 -1
- data/lib/nanoc/base/views/config_view.rb +4 -0
- data/lib/nanoc/checking/checks/external_links.rb +3 -6
- data/lib/nanoc/cli.rb +0 -2
- data/lib/nanoc/cli/commands/shell.rb +2 -3
- data/lib/nanoc/filters/colorize_syntax/colorizers.rb +4 -1
- data/lib/nanoc/telemetry/table.rb +1 -1
- data/lib/nanoc/version.rb +1 -1
- data/nanoc.gemspec +1 -5
- data/scripts/release +95 -0
- data/{test → spec/nanoc}/base/core_ext/array_spec.rb +5 -14
- data/{test → spec/nanoc}/base/core_ext/hash_spec.rb +6 -15
- data/{test → spec/nanoc}/base/core_ext/pathname_spec.rb +0 -0
- data/spec/nanoc/base/core_ext/string_spec.rb +23 -0
- data/spec/nanoc/base/directed_graph_spec.rb +291 -0
- data/spec/nanoc/base/entities/identifiable_collection_spec.rb +56 -0
- data/spec/nanoc/base/entities/item_spec.rb +8 -0
- data/spec/nanoc/base/entities/layout_spec.rb +8 -0
- data/spec/nanoc/base/repos/dependency_store_spec.rb +166 -21
- data/spec/nanoc/base/views/config_view_spec.rb +29 -1
- data/spec/nanoc/cli/commands/shell_spec.rb +23 -8
- data/spec/nanoc/filters/less_spec.rb +1 -1
- data/spec/nanoc/regressions/gh_1185_spec.rb +22 -0
- data/spec/nanoc/telemetry/table_spec.rb +22 -0
- data/spec/spec_helper.rb +5 -6
- data/test/base/test_item_array.rb +0 -35
- data/test/checking/checks/test_external_links.rb +0 -14
- data/test/filters/test_coffeescript.rb +0 -2
- data/test/filters/test_handlebars.rb +0 -4
- data/test/filters/test_uglify_js.rb +0 -4
- data/test/helper.rb +0 -6
- data/test/helpers/test_blogging.rb +66 -26
- data/test/helpers/test_xml_sitemap.rb +23 -7
- metadata +16 -9
- data/Gemfile.lock +0 -433
- data/test/base/core_ext/string_spec.rb +0 -25
- data/test/base/test_item.rb +0 -40
- data/test/base/test_layout.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99eef92742ae4e7c6eec52f7efc9c456a44b72ca
|
4
|
+
data.tar.gz: 2d4f5da906f23c186cf965541a582175a91fe38f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95a74693fa0cc09e0789bbaca9cc2c8f846f5936ae3e57f49ce8bba64721b970809438f200057aa3d7c8d3c520795015a19a7c220a462dfae6d0f7bbb048b8b8
|
7
|
+
data.tar.gz: d1bd24af79448f4e22250c95ce4ebc1a3fab8e9e827d24b130bc5c486154c8db099dace97e669903d9d7c8f8559d43134afcb1478875d177938fbecde08c46a6
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Contributing
|
2
|
+
============
|
3
|
+
|
4
|
+
Reporting bugs
|
5
|
+
--------------
|
6
|
+
|
7
|
+
If you find a bug in Nanoc, you should report it! Some information that you should include in your bug report is the Nanoc version (`nanoc --version`) and, if relevant, the crash log (`crash.log`). For details, check the [*bug reporting* section of the development guide](http://nanoc.ws/development/#reporting-bugs).
|
8
|
+
|
9
|
+
Contributing code
|
10
|
+
-----------------
|
11
|
+
|
12
|
+
Pull requests are appreciated! When submitting a PR, make sure that your changes have covering tests, that the documentation remains up-to-date and that you retain backwards compatibility. For details, check the [*contributing code* section of the development guide](http://nanoc.ws/development/#contributing-code).
|
13
|
+
|
14
|
+
Contributor code of conduct
|
15
|
+
---------------------------
|
16
|
+
|
17
|
+
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone. For details, see the contributor code of conduct at http://nanoc.ws/contributing/#contributor-code-of-conduct.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
(Summarise the bug in a single line.)
|
2
|
+
|
3
|
+
### Steps to reproduce
|
4
|
+
|
5
|
+
1. [First step]
|
6
|
+
2. [Second step]
|
7
|
+
3. …
|
8
|
+
|
9
|
+
### Expected behavior
|
10
|
+
|
11
|
+
(Describe what you expected to happen.)
|
12
|
+
|
13
|
+
### Actual behavior
|
14
|
+
|
15
|
+
(Describe what actually happened instead.)
|
16
|
+
|
17
|
+
### Details
|
18
|
+
|
19
|
+
(Describe other details, if any, that you believe might be relevant.)
|
20
|
+
|
21
|
+
### Crash log
|
22
|
+
|
23
|
+
(When reporting a crash, create a [Gist](https://gist.github.com/) with the contents of the `crash.log` file, and link the Gist here.)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
(Summarise the change in a single line.)
|
2
|
+
|
3
|
+
### Detailed description
|
4
|
+
|
5
|
+
(Describe the change in detail.)
|
6
|
+
|
7
|
+
### To do
|
8
|
+
|
9
|
+
(Include the to-do list for this PR to be finished here.)
|
10
|
+
|
11
|
+
* [ ] Tests
|
12
|
+
* [ ] Documentation
|
13
|
+
* [ ] Feature flags
|
14
|
+
* [ ] …
|
15
|
+
|
16
|
+
### Related issues
|
17
|
+
|
18
|
+
(Add issue IDs for related issues here.)
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
# ----- CONFIGURED -----
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
TargetRubyVersion: 2.3
|
5
|
+
DisplayCopNames: true
|
6
|
+
|
7
|
+
# We use filenames such as “create-site.rb” that translate to method names.
|
8
|
+
FileName:
|
9
|
+
Exclude:
|
10
|
+
- 'lib/nanoc/cli/commands/*.rb'
|
11
|
+
- 'Appraisals'
|
12
|
+
|
13
|
+
# A common pattern in tests is to define anonymous classes in which methods are defined, which trips
|
14
|
+
# up Rubocop’s nested method definition cop.
|
15
|
+
Lint/NestedMethodDefinition:
|
16
|
+
Exclude:
|
17
|
+
- 'test/**/*.rb'
|
18
|
+
- 'spec/**/*.rb'
|
19
|
+
|
20
|
+
# This is used in tests, to verify the effect of state-changing functions.
|
21
|
+
Style/GlobalVars:
|
22
|
+
Exclude:
|
23
|
+
- 'test/**/*.rb'
|
24
|
+
|
25
|
+
Style/TrailingCommaInArguments:
|
26
|
+
EnforcedStyleForMultiline: comma
|
27
|
+
|
28
|
+
Style/TrailingCommaInLiteral:
|
29
|
+
EnforcedStyleForMultiline: comma
|
30
|
+
|
31
|
+
# `rescue nil` is useful in specs where the exception is not important, but
|
32
|
+
# the size effects are.
|
33
|
+
Style/RescueModifier:
|
34
|
+
Exclude:
|
35
|
+
- 'spec/**/*.rb'
|
36
|
+
|
37
|
+
Layout/IndentArray:
|
38
|
+
EnforcedStyle: consistent
|
39
|
+
|
40
|
+
Lint/DuplicateMethods:
|
41
|
+
Exclude:
|
42
|
+
- 'test/data_sources/test_filesystem.rb'
|
43
|
+
- 'spec/spec_helper.rb'
|
44
|
+
|
45
|
+
# This needs to be fixed in Ruby 2.4.
|
46
|
+
Lint/UnifiedInteger:
|
47
|
+
Enabled: false
|
48
|
+
|
49
|
+
Layout/IndentHeredoc:
|
50
|
+
EnforcedStyle: squiggly
|
51
|
+
|
52
|
+
# This breaks RSpec on occasion, e.g. `expect { subject }.not_to change { foo }`,
|
53
|
+
# and generally does not provide useful warnings
|
54
|
+
Lint/AmbiguousBlockAssociation:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
# ----- TO ENABLE LATER -----
|
58
|
+
|
59
|
+
# Valid cops, but fixing the offenses they report is non-trivial.
|
60
|
+
|
61
|
+
RegexpLiteral:
|
62
|
+
Enabled: false
|
63
|
+
|
64
|
+
ClassAndModuleChildren:
|
65
|
+
Enabled: false
|
66
|
+
|
67
|
+
Style/EmptyElse:
|
68
|
+
Enabled: false
|
69
|
+
|
70
|
+
Style/Next:
|
71
|
+
Enabled: false
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
# ----- DISABLED (hard) -----
|
76
|
+
|
77
|
+
# Rubocop trips up on this.
|
78
|
+
Layout/LeadingCommentSpace:
|
79
|
+
Enabled: false
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
# ----- DISABLED (security) -----
|
84
|
+
|
85
|
+
# Nanoc runs offline in a trusted environment, and these security checks are false positives.
|
86
|
+
|
87
|
+
Security/YAMLLoad:
|
88
|
+
Enabled: false
|
89
|
+
|
90
|
+
Security/MarshalLoad:
|
91
|
+
Enabled: false
|
92
|
+
|
93
|
+
Security/Eval:
|
94
|
+
Exclude:
|
95
|
+
- 'test/**/*.rb'
|
96
|
+
- 'spec/**/*.rb'
|
97
|
+
- 'lib/nanoc/base/entities/code_snippet.rb'
|
98
|
+
- 'lib/nanoc/filters/erubi.rb'
|
99
|
+
|
100
|
+
|
101
|
+
# ----- DISABLED (metrics) -----
|
102
|
+
|
103
|
+
# Cops for metrics are disabled because they should not cause tests to fail.
|
104
|
+
|
105
|
+
Metrics/AbcSize:
|
106
|
+
Enabled: false
|
107
|
+
|
108
|
+
Metrics/BlockLength:
|
109
|
+
Enabled: false
|
110
|
+
|
111
|
+
Metrics/BlockNesting:
|
112
|
+
Enabled: false
|
113
|
+
|
114
|
+
Metrics/ClassLength:
|
115
|
+
Enabled: false
|
116
|
+
|
117
|
+
Metrics/CyclomaticComplexity:
|
118
|
+
Enabled: false
|
119
|
+
|
120
|
+
Metrics/LineLength:
|
121
|
+
Enabled: false
|
122
|
+
|
123
|
+
Metrics/MethodLength:
|
124
|
+
Enabled: false
|
125
|
+
|
126
|
+
Metrics/ModuleLength:
|
127
|
+
Enabled: false
|
128
|
+
|
129
|
+
Metrics/ParameterLists:
|
130
|
+
Enabled: false
|
131
|
+
|
132
|
+
Metrics/PerceivedComplexity:
|
133
|
+
Enabled: false
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
# ----- DISABLED (opinionated) -----
|
138
|
+
|
139
|
+
# We should embrace UTF-8, not avoid it. Since the Encoding cop is enabled,
|
140
|
+
# there’s no point in enforcing ASCII comments.
|
141
|
+
AsciiComments:
|
142
|
+
Enabled: false
|
143
|
+
|
144
|
+
# It does not make sense to enforce everything to have documentation.
|
145
|
+
Documentation:
|
146
|
+
Enabled: false
|
147
|
+
|
148
|
+
# Nanoc suppresses exceptions for valid reasons in a few cases.
|
149
|
+
HandleExceptions:
|
150
|
+
Enabled: false
|
151
|
+
|
152
|
+
# if/unless at the end of the line makes it too easy to oversee.
|
153
|
+
IfUnlessModifier:
|
154
|
+
Enabled: false
|
155
|
+
|
156
|
+
# Personal preference is to have decent constructors for exceptions rather than
|
157
|
+
# just a class and a message.
|
158
|
+
RaiseArgs:
|
159
|
+
Enabled: false
|
160
|
+
|
161
|
+
# Personal preference is to use `raise` to signal exceptions (normal control
|
162
|
+
# flow should not use exceptions anyway).
|
163
|
+
SignalException:
|
164
|
+
Enabled: false
|
165
|
+
|
166
|
+
# Some methods that appear to be accessors (return a single value or set a
|
167
|
+
# single value) should still not be considered to be accessors. This is a purely
|
168
|
+
# semantic difference.
|
169
|
+
TrivialAccessors:
|
170
|
+
Enabled: false
|
171
|
+
|
172
|
+
# This does not always semantically make sense.
|
173
|
+
GuardClause:
|
174
|
+
Enabled: false
|
data/.travis.yml
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- "2.3"
|
4
|
+
- "2.4"
|
5
|
+
branches:
|
6
|
+
only:
|
7
|
+
- "master"
|
8
|
+
env:
|
9
|
+
global:
|
10
|
+
-
|
11
|
+
LC_ALL=en_US.UTF_8
|
12
|
+
LANG=en_US.UTF_8
|
13
|
+
matrix:
|
14
|
+
fast_finish: true
|
15
|
+
include:
|
16
|
+
- rvm: jruby-9.1.9.0
|
17
|
+
env: DISABLE_NOKOGIRI=1
|
18
|
+
allow_failures:
|
19
|
+
- rvm: jruby-9.1.9.0
|
20
|
+
env: DISABLE_NOKOGIRI=1
|
21
|
+
script:
|
22
|
+
- bundle exec rake test_ci
|
23
|
+
- bundle exec appraisal install && FOCUS=rouge bundle exec appraisal rake spec
|
24
|
+
cache: bundler
|
25
|
+
sudo: false
|
26
|
+
git:
|
27
|
+
depth: 10
|
data/Gemfile
CHANGED
@@ -21,7 +21,7 @@ group :devel do
|
|
21
21
|
gem 'rspec'
|
22
22
|
gem 'rspec-its', '~> 1.2'
|
23
23
|
gem 'rspec-mocks'
|
24
|
-
gem 'rubocop',
|
24
|
+
gem 'rubocop', '~> 0.49'
|
25
25
|
gem 'simplecov', require: false
|
26
26
|
gem 'timecop'
|
27
27
|
gem 'vcr'
|
@@ -44,13 +44,14 @@ group :plugins do
|
|
44
44
|
gem 'handlebars', platforms: :ruby
|
45
45
|
gem 'kramdown'
|
46
46
|
gem 'less', '~> 2.0', platforms: :ruby
|
47
|
+
gem 'libv8', platforms: :ruby
|
47
48
|
gem 'listen'
|
48
49
|
gem 'markaby'
|
49
50
|
gem 'maruku'
|
50
51
|
gem 'mime-types'
|
51
52
|
gem 'mustache', '~> 1.0'
|
52
53
|
gem 'nokogiri', '~> 1.6'
|
53
|
-
gem 'nokogumbo', '~> 1.4'
|
54
|
+
gem 'nokogumbo', '~> 1.4', platforms: :ruby
|
54
55
|
gem 'pandoc-ruby'
|
55
56
|
gem 'pygments.rb', '~> 1.1', '>= 1.1.1', platforms: %i[ruby mswin]
|
56
57
|
gem 'rack'
|
@@ -62,7 +63,7 @@ group :plugins do
|
|
62
63
|
gem 'rubypants'
|
63
64
|
gem 'sass'
|
64
65
|
gem 'slim', '~> 3.0'
|
65
|
-
gem 'therubyracer', '~> 0.12'
|
66
|
+
gem 'therubyracer', '~> 0.12', platforms: :ruby
|
66
67
|
gem 'typogruby'
|
67
68
|
gem 'uglifier'
|
68
69
|
gem 'w3c_validators'
|
data/NEWS.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Nanoc news
|
2
2
|
|
3
|
+
## 4.7.11 (2017-06-17)
|
4
|
+
|
5
|
+
Fixes:
|
6
|
+
|
7
|
+
* Made the `external_links` check always use GET, not HEAD (#1178, #1179)
|
8
|
+
* Fixed an issue where changing identifiers during preprocessing could cause a crash (#1184, #1185)
|
9
|
+
|
10
|
+
Enhancements:
|
11
|
+
|
12
|
+
* Added `--preprocess` to `shell` command, to load preprocessed site data (#1180)
|
13
|
+
|
3
14
|
## 4.7.10 (2017-05-14)
|
4
15
|
|
5
16
|
Fixes:
|
data/Rakefile
CHANGED
@@ -10,11 +10,14 @@ RuboCop::RakeTask.new(:rubocop)
|
|
10
10
|
Coveralls::RakeTask.new
|
11
11
|
|
12
12
|
Rake::TestTask.new(:test_all) do |t|
|
13
|
-
t.test_files = Dir['test
|
13
|
+
t.test_files = Dir['test/**/test_*.rb']
|
14
14
|
t.libs << 'test'
|
15
|
+
t.verbose = false
|
15
16
|
end
|
16
17
|
|
17
|
-
RSpec::Core::RakeTask.new(:spec)
|
18
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
19
|
+
t.verbose = false
|
20
|
+
end
|
18
21
|
|
19
22
|
task test: %i[spec test_all rubocop]
|
20
23
|
task test_ci: %i[test coveralls:push]
|
@@ -6,16 +6,18 @@ module Nanoc::Int
|
|
6
6
|
class Dependency
|
7
7
|
include Nanoc::Int::ContractsSupport
|
8
8
|
|
9
|
-
|
9
|
+
C_OBJ = C::Or[Nanoc::Int::Item, Nanoc::Int::Layout, Nanoc::Int::Configuration]
|
10
|
+
|
11
|
+
contract C::None => C::Maybe[C_OBJ]
|
10
12
|
attr_reader :from
|
11
13
|
|
12
|
-
contract C::None => C::Maybe[
|
14
|
+
contract C::None => C::Maybe[C_OBJ]
|
13
15
|
attr_reader :to
|
14
16
|
|
15
17
|
contract C::None => Nanoc::Int::Props
|
16
18
|
attr_reader :props
|
17
19
|
|
18
|
-
contract C::Maybe[
|
20
|
+
contract C::Maybe[C_OBJ], C::Maybe[C_OBJ], Nanoc::Int::Props => C::Any
|
19
21
|
def initialize(from, to, props)
|
20
22
|
@from = from
|
21
23
|
@to = to
|
@@ -14,11 +14,17 @@ module Nanoc::Int
|
|
14
14
|
@items = items
|
15
15
|
@layouts = layouts
|
16
16
|
|
17
|
+
@refs2objs = {}
|
18
|
+
items.each { |o| add_vertex_for(o) }
|
19
|
+
layouts.each { |o| add_vertex_for(o) }
|
20
|
+
|
17
21
|
@new_objects = []
|
18
|
-
@graph = Nanoc::Int::DirectedGraph.new([nil] + @items
|
22
|
+
@graph = Nanoc::Int::DirectedGraph.new([nil] + objs2refs(@items) + objs2refs(@layouts))
|
19
23
|
end
|
20
24
|
|
21
|
-
|
25
|
+
# FIXME: ItemRep?
|
26
|
+
C_OBJ = C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout, Nanoc::Int::Configuration]
|
27
|
+
contract C_OBJ => C::ArrayOf[Nanoc::Int::Dependency]
|
22
28
|
def dependencies_causing_outdatedness_of(object)
|
23
29
|
objects_causing_outdatedness_of(object).map do |other_object|
|
24
30
|
props = props_for(other_object, object)
|
@@ -36,6 +42,16 @@ module Nanoc::Int
|
|
36
42
|
end
|
37
43
|
end
|
38
44
|
|
45
|
+
def items=(items)
|
46
|
+
@items = items
|
47
|
+
items.each { |o| @refs2objs[obj2ref(o)] = o }
|
48
|
+
end
|
49
|
+
|
50
|
+
def layouts=(layouts)
|
51
|
+
@layouts = layouts
|
52
|
+
layouts.each { |o| @refs2objs[obj2ref(o)] = o }
|
53
|
+
end
|
54
|
+
|
39
55
|
# Returns the direct dependencies for the given object.
|
40
56
|
#
|
41
57
|
# The direct dependencies of the given object include the items and
|
@@ -57,13 +73,12 @@ module Nanoc::Int
|
|
57
73
|
if @new_objects.any?
|
58
74
|
[@new_objects.first]
|
59
75
|
else
|
60
|
-
@graph.direct_predecessors_of(object)
|
76
|
+
refs2objs(@graph.direct_predecessors_of(obj2ref(object)))
|
61
77
|
end
|
62
78
|
end
|
63
79
|
|
64
|
-
C_DOC = C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]
|
65
80
|
C_ATTR = C::Or[C::IterOf[Symbol], C::Bool]
|
66
|
-
contract C::Maybe[
|
81
|
+
contract C::Maybe[C_OBJ], C::Maybe[C_OBJ], C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C_ATTR], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
|
67
82
|
# Records a dependency from `src` to `dst` in the dependency graph. When
|
68
83
|
# `dst` is oudated, `src` will also become outdated.
|
69
84
|
#
|
@@ -76,11 +91,23 @@ module Nanoc::Int
|
|
76
91
|
#
|
77
92
|
# @return [void]
|
78
93
|
def record_dependency(src, dst, raw_content: false, attributes: false, compiled_content: false, path: false)
|
79
|
-
|
94
|
+
# TODO: do src == dst check first (faster)
|
95
|
+
|
96
|
+
add_vertex_for(src)
|
97
|
+
add_vertex_for(dst)
|
98
|
+
|
99
|
+
src_ref = obj2ref(src)
|
100
|
+
dst_ref = obj2ref(dst)
|
101
|
+
|
102
|
+
existing_props = Nanoc::Int::Props.new(@graph.props_for(dst_ref, src_ref) || {})
|
80
103
|
new_props = Nanoc::Int::Props.new(raw_content: raw_content, attributes: attributes, compiled_content: compiled_content, path: path)
|
81
104
|
props = existing_props.merge(new_props)
|
82
105
|
|
83
|
-
@graph.add_edge(
|
106
|
+
@graph.add_edge(dst_ref, src_ref, props: props.to_h) unless src == dst
|
107
|
+
end
|
108
|
+
|
109
|
+
def add_vertex_for(o)
|
110
|
+
@refs2objs[obj2ref(o)] = o
|
84
111
|
end
|
85
112
|
|
86
113
|
# Empties the list of dependencies for the given object. This is necessary
|
@@ -93,13 +120,33 @@ module Nanoc::Int
|
|
93
120
|
#
|
94
121
|
# @return [void]
|
95
122
|
def forget_dependencies_for(object)
|
96
|
-
@graph.delete_edges_to(object)
|
123
|
+
@graph.delete_edges_to(obj2ref(object))
|
97
124
|
end
|
98
125
|
|
99
126
|
protected
|
100
127
|
|
128
|
+
def obj2ref(obj)
|
129
|
+
obj && obj.reference
|
130
|
+
end
|
131
|
+
|
132
|
+
def ref2obj(reference)
|
133
|
+
if reference
|
134
|
+
@refs2objs[reference]
|
135
|
+
else
|
136
|
+
nil
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def objs2refs(objs)
|
141
|
+
objs.map { |o| obj2ref(o) }
|
142
|
+
end
|
143
|
+
|
144
|
+
def refs2objs(refs)
|
145
|
+
refs.map { |r| ref2obj(r) }
|
146
|
+
end
|
147
|
+
|
101
148
|
def props_for(a, b)
|
102
|
-
props = @graph.props_for(a, b) || {}
|
149
|
+
props = @graph.props_for(obj2ref(a), obj2ref(b)) || {}
|
103
150
|
|
104
151
|
if props.values.any? { |v| v }
|
105
152
|
props
|
@@ -111,37 +158,26 @@ module Nanoc::Int
|
|
111
158
|
def data
|
112
159
|
{
|
113
160
|
edges: @graph.edges,
|
114
|
-
vertices: @graph.vertices
|
161
|
+
vertices: @graph.vertices,
|
115
162
|
}
|
116
163
|
end
|
117
164
|
|
118
165
|
def data=(new_data)
|
119
|
-
objects = @items.to_a + @layouts.to_a
|
166
|
+
objects = Set.new(@items.to_a + @layouts.to_a)
|
167
|
+
refs = objs2refs(objects)
|
120
168
|
|
121
169
|
# Create new graph
|
122
|
-
@graph = Nanoc::Int::DirectedGraph.new([nil] +
|
170
|
+
@graph = Nanoc::Int::DirectedGraph.new([nil] + refs)
|
123
171
|
|
124
172
|
# Load vertices
|
125
|
-
|
126
|
-
|
127
|
-
case reference[0]
|
128
|
-
when :item
|
129
|
-
@items.object_with_identifier(reference[1])
|
130
|
-
when :layout
|
131
|
-
@layouts.object_with_identifier(reference[1])
|
132
|
-
else
|
133
|
-
raise Nanoc::Int::Errors::InternalInconsistency, "unrecognised reference #{reference[0].inspect}"
|
134
|
-
end
|
135
|
-
else
|
136
|
-
nil
|
137
|
-
end
|
138
|
-
end
|
173
|
+
previous_refs = new_data[:vertices]
|
174
|
+
previous_objects = Set.new(refs2objs(previous_refs))
|
139
175
|
|
140
176
|
# Load edges
|
141
177
|
new_data[:edges].each do |edge|
|
142
178
|
from_index, to_index, props = *edge
|
143
|
-
from = from_index &&
|
144
|
-
to = to_index &&
|
179
|
+
from = from_index && previous_refs[from_index]
|
180
|
+
to = to_index && previous_refs[to_index]
|
145
181
|
@graph.add_edge(from, to, props: props)
|
146
182
|
end
|
147
183
|
|