tangle 0.8.2 → 0.11.0
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 +4 -4
- data/.github/workflows/ruby.yml +37 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +15 -4
- data/CHANGELOG.md +45 -0
- data/Gemfile +4 -10
- data/README.md +8 -3
- data/Rakefile +3 -1
- data/bin/console +5 -4
- data/bin/setup +0 -1
- data/lib/tangle.rb +7 -4
- data/lib/tangle/base_graph.rb +154 -0
- data/lib/tangle/{graph_vertices.rb → base_graph_private.rb} +12 -35
- data/lib/tangle/base_graph_protected.rb +50 -0
- data/lib/tangle/currify.rb +58 -0
- data/lib/tangle/directed/acyclic/graph.rb +3 -0
- data/lib/tangle/directed/acyclic/partial_order.rb +3 -0
- data/lib/tangle/directed/edge.rb +4 -2
- data/lib/tangle/directed/graph.rb +28 -6
- data/lib/tangle/edge.rb +5 -14
- data/lib/tangle/errors.rb +2 -0
- data/lib/tangle/mixin.rb +2 -1
- data/lib/tangle/mixin/directory.rb +48 -13
- data/lib/tangle/undirected/edge.rb +30 -0
- data/lib/tangle/undirected/graph.rb +73 -0
- data/lib/tangle/undirected/simple/graph.rb +22 -0
- data/lib/tangle/version.rb +8 -4
- data/ruby-tangle.sublime-project +8 -0
- data/tangle.gemspec +19 -7
- metadata +103 -27
- data/.travis.yml +0 -5
- data/lib/tangle/graph.rb +0 -81
- data/lib/tangle/graph_edges.rb +0 -49
- data/lib/tangle/mixin/connectedness.rb +0 -68
- data/lib/tangle/simple/graph.rb +0 -17
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
require_relative '../edge'
|
5
|
+
|
6
|
+
module Tangle
|
7
|
+
module Undirected
|
8
|
+
#
|
9
|
+
# An edge in an undirected graph, connecting two vertices
|
10
|
+
#
|
11
|
+
class Edge < Tangle::Edge
|
12
|
+
def each_vertex(&block)
|
13
|
+
@vertices.each_key(&block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
vertex1, vertex2 = @vertices.keys
|
18
|
+
"{#{vertex1}<->#{vertex2}}"
|
19
|
+
end
|
20
|
+
alias inspect to_s
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def initialize_vertices(vertex1, vertex2 = vertex1)
|
25
|
+
super
|
26
|
+
@vertices = { vertex1 => vertex2, vertex2 => vertex1 }.freeze
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../base_graph'
|
4
|
+
require_relative 'edge'
|
5
|
+
|
6
|
+
module Tangle
|
7
|
+
module Undirected
|
8
|
+
#
|
9
|
+
# Undirected graph
|
10
|
+
#
|
11
|
+
class Graph < Tangle::BaseGraph
|
12
|
+
# Two vertices are adjacent if there is an edge between them
|
13
|
+
def adjacent?(vertex, other)
|
14
|
+
edges(vertex).any? { |edge| edge[vertex] == other }
|
15
|
+
end
|
16
|
+
|
17
|
+
# Return the set of adjacent vertices
|
18
|
+
def adjacent(vertex)
|
19
|
+
Set.new(edges(vertex).map { |edge| edge.walk(vertex) })
|
20
|
+
end
|
21
|
+
|
22
|
+
# Get the largest connected subgraph for a vertex.
|
23
|
+
# Also aliased as :component and :connected_component
|
24
|
+
#
|
25
|
+
# connected_subgraph(vertex) => Graph
|
26
|
+
#
|
27
|
+
def connected_subgraph(vertex)
|
28
|
+
subgraph { |other| connected?(vertex, other) }
|
29
|
+
end
|
30
|
+
alias component connected_subgraph
|
31
|
+
alias connected_component connected_subgraph
|
32
|
+
|
33
|
+
# Get the largest subgraph that is not connected to a vertex, or what's
|
34
|
+
# left after removing the connected subgraph.
|
35
|
+
#
|
36
|
+
def disconnected_subgraph(vertex)
|
37
|
+
subgraph { |other| !connected?(vertex, other) }
|
38
|
+
end
|
39
|
+
|
40
|
+
# A graph is connected if all vertices are connected to all vertices
|
41
|
+
# An empty graph is disconnected.
|
42
|
+
#
|
43
|
+
def connected?(*tested_vertices)
|
44
|
+
tested_vertices = vertices if tested_vertices.empty?
|
45
|
+
return false if tested_vertices.empty?
|
46
|
+
|
47
|
+
tested_vertices.combination(2).all? do |pair|
|
48
|
+
this, that = pair.to_a
|
49
|
+
reachable(this).any? { |other| other == that }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# A graph is disconnected if any vertex is not connected to all other.
|
54
|
+
# An empty graph is disconnected.
|
55
|
+
#
|
56
|
+
def disconnected?(*tested_vertices)
|
57
|
+
!connected?(*tested_vertices)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Return a breadth-first Enumerator for all reachable vertices,
|
61
|
+
# by transitive adjacency.
|
62
|
+
def reachable(start_vertex)
|
63
|
+
vertex_enumerator(start_vertex, :adjacent)
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def new_edge(*args, **kwargs)
|
69
|
+
Edge.new(*args, **kwargs)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../graph'
|
4
|
+
|
5
|
+
module Tangle
|
6
|
+
module Undirected
|
7
|
+
module Simple
|
8
|
+
#
|
9
|
+
# A simple graph, without loops and multiple edges
|
10
|
+
class Graph < Tangle::Undirected::Graph
|
11
|
+
protected
|
12
|
+
|
13
|
+
def insert_edge(edge)
|
14
|
+
raise LoopError if edge.loop?
|
15
|
+
raise MultiEdgeError if adjacent?(*edge.each_vertex)
|
16
|
+
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/tangle/version.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module Tangle
|
4
|
-
|
5
|
-
|
3
|
+
module Tangle # rubocop:disable Style/Documentation
|
4
|
+
begin
|
5
|
+
require 'git-version-bump'
|
6
|
+
VERSION = GVB.version.freeze
|
7
|
+
rescue LoadError
|
8
|
+
VERSION = '0.0.0.UNDEF'
|
9
|
+
end
|
6
10
|
end
|
data/tangle.gemspec
CHANGED
@@ -1,12 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'tangle/version'
|
5
6
|
|
7
|
+
dev_deps = {
|
8
|
+
'bundler' => '~> 2.2',
|
9
|
+
'codecov' => '~> 0.5.0',
|
10
|
+
'fasterer' => '~> 0.9.0',
|
11
|
+
'pry' => '~> 0.14.0',
|
12
|
+
'rake' => '~> 13.0',
|
13
|
+
'rspec' => '~> 3.10',
|
14
|
+
'rubocop' => '~> 1.15',
|
15
|
+
'rubocop-rake' => '~> 0.5.1',
|
16
|
+
'rubocop-rspec' => '~> 2.3',
|
17
|
+
'simplecov' => '~> 0.21.0'
|
18
|
+
}
|
19
|
+
|
6
20
|
Gem::Specification.new do |spec|
|
7
21
|
spec.name = 'tangle'
|
8
22
|
spec.version = Tangle::VERSION
|
9
|
-
spec.date = Tangle::DATE
|
10
23
|
spec.authors = ['Calle Englund']
|
11
24
|
spec.email = ['calle@discord.bofh.se']
|
12
25
|
|
@@ -21,11 +34,10 @@ Gem::Specification.new do |spec|
|
|
21
34
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
35
|
spec.require_paths = ['lib']
|
23
36
|
|
24
|
-
spec.
|
37
|
+
spec.platform = Gem::Platform::RUBY
|
38
|
+
spec.required_ruby_version = '>= 2.6', '< 4.0'
|
39
|
+
|
40
|
+
spec.add_dependency 'git-version-bump', '~> 0.17.0'
|
25
41
|
|
26
|
-
|
27
|
-
spec.add_development_dependency 'fasterer', '~> 0.4'
|
28
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
29
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
30
|
-
spec.add_development_dependency 'rubocop', '~> 0.52'
|
42
|
+
dev_deps.each { |d| spec.add_development_dependency(*d) }
|
31
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tangle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Calle Englund
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: git-version-bump
|
@@ -16,95 +16,166 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.17.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.17.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.2'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: codecov
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.5.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.5.0
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: fasterer
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
61
|
+
version: 0.9.0
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
68
|
+
version: 0.9.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.14.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.14.0
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rake
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
87
|
- - "~>"
|
60
88
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
89
|
+
version: '13.0'
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
96
|
+
version: '13.0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: rspec
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
101
|
- - "~>"
|
74
102
|
- !ruby/object:Gem::Version
|
75
|
-
version: '3.
|
103
|
+
version: '3.10'
|
76
104
|
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
108
|
- - "~>"
|
81
109
|
- !ruby/object:Gem::Version
|
82
|
-
version: '3.
|
110
|
+
version: '3.10'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: rubocop
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
115
|
- - "~>"
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
117
|
+
version: '1.15'
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
122
|
- - "~>"
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
97
|
-
|
124
|
+
version: '1.15'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.5.1
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.5.1
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop-rspec
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '2.3'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '2.3'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.21.0
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.21.0
|
167
|
+
description:
|
98
168
|
email:
|
99
169
|
- calle@discord.bofh.se
|
100
170
|
executables: []
|
101
171
|
extensions: []
|
102
172
|
extra_rdoc_files: []
|
103
173
|
files:
|
174
|
+
- ".github/workflows/ruby.yml"
|
104
175
|
- ".gitignore"
|
105
176
|
- ".rspec"
|
106
177
|
- ".rubocop.yml"
|
107
|
-
-
|
178
|
+
- CHANGELOG.md
|
108
179
|
- CODE_OF_CONDUCT.md
|
109
180
|
- Gemfile
|
110
181
|
- LICENSE.txt
|
@@ -113,26 +184,29 @@ files:
|
|
113
184
|
- bin/console
|
114
185
|
- bin/setup
|
115
186
|
- lib/tangle.rb
|
187
|
+
- lib/tangle/base_graph.rb
|
188
|
+
- lib/tangle/base_graph_private.rb
|
189
|
+
- lib/tangle/base_graph_protected.rb
|
190
|
+
- lib/tangle/currify.rb
|
116
191
|
- lib/tangle/directed/acyclic/graph.rb
|
117
192
|
- lib/tangle/directed/acyclic/partial_order.rb
|
118
193
|
- lib/tangle/directed/edge.rb
|
119
194
|
- lib/tangle/directed/graph.rb
|
120
195
|
- lib/tangle/edge.rb
|
121
196
|
- lib/tangle/errors.rb
|
122
|
-
- lib/tangle/graph.rb
|
123
|
-
- lib/tangle/graph_edges.rb
|
124
|
-
- lib/tangle/graph_vertices.rb
|
125
197
|
- lib/tangle/mixin.rb
|
126
|
-
- lib/tangle/mixin/connectedness.rb
|
127
198
|
- lib/tangle/mixin/directory.rb
|
128
|
-
- lib/tangle/
|
199
|
+
- lib/tangle/undirected/edge.rb
|
200
|
+
- lib/tangle/undirected/graph.rb
|
201
|
+
- lib/tangle/undirected/simple/graph.rb
|
129
202
|
- lib/tangle/version.rb
|
203
|
+
- ruby-tangle.sublime-project
|
130
204
|
- tangle.gemspec
|
131
205
|
homepage: https://github.com/notcalle/ruby-tangle
|
132
206
|
licenses:
|
133
207
|
- MIT
|
134
208
|
metadata: {}
|
135
|
-
post_install_message:
|
209
|
+
post_install_message:
|
136
210
|
rdoc_options: []
|
137
211
|
require_paths:
|
138
212
|
- lib
|
@@ -140,16 +214,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
140
214
|
requirements:
|
141
215
|
- - ">="
|
142
216
|
- !ruby/object:Gem::Version
|
143
|
-
version: '
|
217
|
+
version: '2.6'
|
218
|
+
- - "<"
|
219
|
+
- !ruby/object:Gem::Version
|
220
|
+
version: '4.0'
|
144
221
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
222
|
requirements:
|
146
223
|
- - ">="
|
147
224
|
- !ruby/object:Gem::Version
|
148
225
|
version: '0'
|
149
226
|
requirements: []
|
150
|
-
|
151
|
-
|
152
|
-
signing_key:
|
227
|
+
rubygems_version: 3.2.15
|
228
|
+
signing_key:
|
153
229
|
specification_version: 4
|
154
230
|
summary: Tangle implements graphs of things
|
155
231
|
test_files: []
|