cardname 0.11.2 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +16 -18
- data/lib/cardname.rb +4 -4
- data/lib/cardname/contextual.rb +17 -9
- data/lib/cardname/manipulate.rb +3 -0
- data/lib/cardname/parts.rb +4 -35
- data/lib/cardname/pieces.rb +26 -0
- data/lib/cardname/predicates.rb +12 -0
- data/lib/cardname/variants.rb +9 -6
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 812ca647556b0ad54259e6725537591d7ce88bf36a1c8d2ffc4a664e6db9be73
|
4
|
+
data.tar.gz: 543e2aaeeb99557a86f9dee55e7324f7a9547266fa3bb66d313bc7e8328b5755
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88794a5f65b569572307c180646cb5ad33642ae6044e52eee42bab238022aedc66bdce53f8a6c70b5781349e60f63aea91f3119cc7a987a7b980ae569fcd2d6a
|
7
|
+
data.tar.gz: 54b7da9b970b17f8dcf72f6f7d4b995ee7e969755fca980a5bc5851c98392a9cb75bcb2767ac42afec1de459e9626dbeb4f2b25ba8f9d5a8598f81cfa65debe4
|
data/Rakefile
CHANGED
@@ -1,39 +1,37 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
|
2
|
-
|
3
|
+
require "rubygems"
|
4
|
+
require "bundler"
|
3
5
|
|
4
|
-
|
5
|
-
require 'bundler'
|
6
|
-
|
7
|
-
VERSION = File.exist?('VERSION') ? File.read('VERSION') : ""
|
6
|
+
VERSION = File.exist?("VERSION") ? File.read("VERSION") : ""
|
8
7
|
|
9
8
|
begin
|
10
9
|
Bundler.setup(:default, :development)
|
11
10
|
rescue Bundler::BundlerError => e
|
12
|
-
|
13
|
-
|
11
|
+
warn e.message
|
12
|
+
warn "Run `bundle install` to install missing gems"
|
14
13
|
exit e.status_code
|
15
14
|
end
|
16
15
|
|
17
|
-
require
|
16
|
+
require "rake"
|
18
17
|
|
19
|
-
require
|
20
|
-
require
|
18
|
+
require "rspec/core"
|
19
|
+
require "rspec/core/rake_task"
|
21
20
|
RSpec::Core::RakeTask.new(:spec) do |spec|
|
22
|
-
spec.pattern = FileList[
|
21
|
+
spec.pattern = FileList["spec/**/*_spec.rb"]
|
23
22
|
end
|
24
23
|
|
25
24
|
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
26
|
-
spec.pattern =
|
25
|
+
spec.pattern = "spec/**/*_spec.rb"
|
27
26
|
spec.rcov = true
|
28
27
|
end
|
29
28
|
|
30
|
-
task :
|
29
|
+
task default: :spec
|
31
30
|
|
32
|
-
require
|
31
|
+
require "rdoc/task"
|
33
32
|
Rake::RDocTask.new do |rdoc|
|
34
|
-
|
35
|
-
rdoc.rdoc_dir = 'rdoc'
|
33
|
+
rdoc.rdoc_dir = "rdoc"
|
36
34
|
rdoc.title = "cardname #{VERSION}"
|
37
|
-
rdoc.rdoc_files.include(
|
38
|
-
rdoc.rdoc_files.include(
|
35
|
+
rdoc.rdoc_files.include("README*")
|
36
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
39
37
|
end
|
data/lib/cardname.rb
CHANGED
@@ -5,12 +5,14 @@ require "htmlentities"
|
|
5
5
|
|
6
6
|
class Cardname < String
|
7
7
|
require_relative "cardname/parts"
|
8
|
+
require_relative "cardname/pieces"
|
8
9
|
require_relative "cardname/variants"
|
9
10
|
require_relative "cardname/contextual"
|
10
11
|
require_relative "cardname/predicates"
|
11
12
|
require_relative "cardname/manipulate"
|
12
13
|
|
13
14
|
include Parts
|
15
|
+
include Pieces
|
14
16
|
include Variants
|
15
17
|
include Contextual
|
16
18
|
include Predicates
|
@@ -18,12 +20,11 @@ class Cardname < String
|
|
18
20
|
|
19
21
|
OK4KEY_RE = '\p{Word}\*'
|
20
22
|
|
21
|
-
cattr_accessor :joint, :banned_array, :var_re, :uninflect, :params,
|
22
|
-
:session, :stabilize
|
23
|
+
cattr_accessor :joint, :banned_array, :var_re, :uninflect, :params, :session, :stabilize
|
23
24
|
|
24
25
|
self.joint = "+"
|
25
26
|
self.banned_array = []
|
26
|
-
self.var_re = /\{([
|
27
|
+
self.var_re = /\{([^}]*\})\}/
|
27
28
|
self.uninflect = :singularize
|
28
29
|
self.stabilize = false
|
29
30
|
|
@@ -116,7 +117,6 @@ class Cardname < String
|
|
116
117
|
end
|
117
118
|
end
|
118
119
|
|
119
|
-
# dangerous, too
|
120
120
|
def []= index, val
|
121
121
|
p = parts
|
122
122
|
p[index] = val
|
data/lib/cardname/contextual.rb
CHANGED
@@ -4,7 +4,8 @@ class Cardname
|
|
4
4
|
|
5
5
|
# @return true if name is left or right of context
|
6
6
|
def child_of? context
|
7
|
-
return false unless
|
7
|
+
return false unless compound?
|
8
|
+
|
8
9
|
context_key = context.to_name.key
|
9
10
|
absolute_name(context).parent_keys.include? context_key
|
10
11
|
end
|
@@ -26,7 +27,7 @@ class Cardname
|
|
26
27
|
end
|
27
28
|
|
28
29
|
def starts_with_joint?
|
29
|
-
|
30
|
+
compound? && parts.first.empty?
|
30
31
|
end
|
31
32
|
|
32
33
|
def from *from
|
@@ -36,16 +37,19 @@ class Cardname
|
|
36
37
|
# if possible, relativize name into one beginning with a "+". The new name must absolutize back to the correct
|
37
38
|
# original name in the context of "from"
|
38
39
|
def name_from *from
|
39
|
-
return self unless (remaining = remove_context
|
40
|
+
return self unless (remaining = remove_context(*from))
|
41
|
+
|
40
42
|
compressed = remaining.compact.unshift(nil).to_name # exactly one nil at beginning
|
41
43
|
key == compressed.absolute_name(from).key ? compressed : self
|
42
44
|
end
|
43
45
|
|
44
46
|
def remove_context *from
|
45
47
|
return false unless from.compact.present?
|
46
|
-
|
48
|
+
|
49
|
+
remaining = parts_excluding(*from)
|
47
50
|
return false if remaining.compact.empty? || # all name parts in context
|
48
51
|
remaining == parts # no name parts in context
|
52
|
+
|
49
53
|
remaining
|
50
54
|
end
|
51
55
|
|
@@ -60,6 +64,7 @@ class Cardname
|
|
60
64
|
next if part.empty?
|
61
65
|
next if part =~ /^_/ # this removes relative parts. why?
|
62
66
|
next if keys_to_ignore.member? part.to_name.key
|
67
|
+
|
63
68
|
part
|
64
69
|
end
|
65
70
|
end
|
@@ -68,6 +73,7 @@ class Cardname
|
|
68
73
|
context = (context || "").to_name
|
69
74
|
new_parts = absolutize_contextual_parts context
|
70
75
|
return "" if new_parts.empty?
|
76
|
+
|
71
77
|
absolutize_extremes new_parts, context.s
|
72
78
|
new_parts.join self.class.joint
|
73
79
|
end
|
@@ -90,10 +96,10 @@ class Cardname
|
|
90
96
|
when /^_main$/i then self.class.params[:main_name]
|
91
97
|
when /^(_self|_whole|_)$/i then context.s
|
92
98
|
when /^_left$/i then context.trunk
|
93
|
-
#
|
99
|
+
# NOTE: - inconsistent use of left v. trunk
|
94
100
|
when /^_right$/i then context.tag
|
95
|
-
when /^_(\d+)$/i then ordinal_part
|
96
|
-
when /^_(L*)(R?)$/i then partmap_part
|
101
|
+
when /^_(\d+)$/i then ordinal_part $LAST_MATCH_INFO[1].to_i, context
|
102
|
+
when /^_(L*)(R?)$/i then partmap_part $LAST_MATCH_INFO, context
|
97
103
|
else part
|
98
104
|
end.to_s.strip
|
99
105
|
end
|
@@ -109,7 +115,8 @@ class Cardname
|
|
109
115
|
end
|
110
116
|
|
111
117
|
def partmap_part match, context
|
112
|
-
l_s
|
118
|
+
l_s = match[1].size
|
119
|
+
r_s = !match[2].empty?
|
113
120
|
l_part = context.nth_left l_s
|
114
121
|
r_s ? l_part.tag : l_part.s
|
115
122
|
end
|
@@ -122,9 +129,10 @@ class Cardname
|
|
122
129
|
|
123
130
|
def absolutize_extreme? new_parts, context, index
|
124
131
|
return false if new_parts[index].present?
|
132
|
+
|
125
133
|
# following avoids recontextualizing with relative contexts.
|
126
134
|
# Eg, `+A+B+.absolute('+A')` should be +A+B, not +A+A+B.
|
127
|
-
!new_parts.to_name.send "#{[
|
135
|
+
!new_parts.to_name.send "#{%i[start end][index]}s_with_parts?", context
|
128
136
|
end
|
129
137
|
end
|
130
138
|
end
|
data/lib/cardname/manipulate.rb
CHANGED
@@ -8,6 +8,7 @@ class Cardname
|
|
8
8
|
return self if old_name.num_parts > num_parts
|
9
9
|
return swap_part(old_name, new_name) if old_name.simple?
|
10
10
|
return self unless include? old_name
|
11
|
+
|
11
12
|
swap_all_subsequences(old_name, new_name).to_name
|
12
13
|
end
|
13
14
|
|
@@ -29,6 +30,7 @@ class Cardname
|
|
29
30
|
return swap_part oldpiece, newpiece if oldpiece.simple?
|
30
31
|
return self unless starts_with_parts?(oldpiece)
|
31
32
|
return newpiece if oldpiece.num_parts == num_parts
|
33
|
+
|
32
34
|
self.class.new [newpiece, self[oldpiece.num_parts..-1]].flatten
|
33
35
|
end
|
34
36
|
|
@@ -72,6 +74,7 @@ class Cardname
|
|
72
74
|
|
73
75
|
def ensure_simpleness part, msg=nil
|
74
76
|
return if part.to_name.simple?
|
77
|
+
|
75
78
|
raise StandardError, "'#{part}' has to be simple. #{msg}"
|
76
79
|
end
|
77
80
|
end
|
data/lib/cardname/parts.rb
CHANGED
@@ -4,24 +4,12 @@ class Cardname
|
|
4
4
|
# the same methods without _name return strings
|
5
5
|
module Parts
|
6
6
|
attr_reader :parts, :part_keys, :simple
|
7
|
-
|
8
7
|
alias_method :to_a, :parts
|
9
8
|
|
10
9
|
def parts
|
11
10
|
@parts = Cardname.split_parts s
|
12
11
|
end
|
13
12
|
|
14
|
-
def simple
|
15
|
-
@simple = parts.size <= 1
|
16
|
-
end
|
17
|
-
alias simple? simple
|
18
|
-
|
19
|
-
# @return true if name has more than one part
|
20
|
-
def compound?
|
21
|
-
!simple?
|
22
|
-
end
|
23
|
-
alias junction? compound?
|
24
|
-
|
25
13
|
def part_keys
|
26
14
|
@part_keys ||= simple ? [simple_key] : parts.map { |p| p.to_name.simple_key }
|
27
15
|
end
|
@@ -51,15 +39,15 @@ class Cardname
|
|
51
39
|
end
|
52
40
|
|
53
41
|
def parents
|
54
|
-
@parents ||=
|
42
|
+
@parents ||= compound? ? [left, right] : []
|
55
43
|
end
|
56
44
|
|
57
45
|
def parent_names
|
58
|
-
@parent_names ||=
|
46
|
+
@parent_names ||= compound? ? [left_name, right_name] : []
|
59
47
|
end
|
60
48
|
|
61
49
|
def parent_keys
|
62
|
-
@parent_keys ||=
|
50
|
+
@parent_keys ||= compound? ? [left_key, right_key] : []
|
63
51
|
end
|
64
52
|
|
65
53
|
# Note that all names have a trunk and tag,
|
@@ -89,27 +77,8 @@ class Cardname
|
|
89
77
|
@piece_names ||= pieces.map(&:to_name)
|
90
78
|
end
|
91
79
|
|
92
|
-
# self and all ancestors (= parts and recursive lefts)
|
93
|
-
# @example
|
94
|
-
# "A+B+C+D".to_name.pieces
|
95
|
-
# # => ["A", "B", "C", "D", "A+B", "A+B+C", "A+B+C+D"]
|
96
|
-
def pieces
|
97
|
-
@pieces ||=
|
98
|
-
if simple?
|
99
|
-
[self]
|
100
|
-
else
|
101
|
-
junction_pieces = []
|
102
|
-
parts[1..-1].inject parts[0] do |left, right|
|
103
|
-
piece = [left, right] * self.class.joint
|
104
|
-
junction_pieces << piece
|
105
|
-
piece
|
106
|
-
end
|
107
|
-
parts + junction_pieces
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
80
|
def ancestors
|
112
|
-
@ancestors ||= pieces.reject { |p| p == self}
|
81
|
+
@ancestors ||= pieces.reject { |p| p == self }
|
113
82
|
end
|
114
83
|
|
115
84
|
# def + other
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Cardname
|
2
|
+
# Cards never have more than two "parts" (left and right), but they can have many
|
3
|
+
# "pieces". A card's pieces are all the other cards whose existence its existence
|
4
|
+
# implies. For example if A+B+C exists, that implies that A, B, C, and A+B do too.
|
5
|
+
module Pieces
|
6
|
+
# self and all ancestors (= parts and recursive lefts)
|
7
|
+
# @example
|
8
|
+
# "A+B+C+D".to_name.pieces
|
9
|
+
# # => ["A", "B", "C", "D", "A+B", "A+B+C", "A+B+C+D"]
|
10
|
+
def pieces
|
11
|
+
@pieces ||= simple? ? [self] : (parts + junction_pieces)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def junction_pieces
|
17
|
+
[].tap do |pieces|
|
18
|
+
parts[1..-1].inject parts[0] do |left, right|
|
19
|
+
piece = [left, right] * self.class.joint
|
20
|
+
pieces << piece
|
21
|
+
piece
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/cardname/predicates.rb
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
class Cardname
|
2
2
|
module Predicates
|
3
|
+
def simple?
|
4
|
+
@simple.nil? ? (@simple = parts.size <= 1) : @simple
|
5
|
+
end
|
6
|
+
alias_method :simple, :simple? # @deprecated
|
7
|
+
|
8
|
+
# @return true if name has more than one part
|
9
|
+
def compound?
|
10
|
+
!simple?
|
11
|
+
end
|
12
|
+
alias_method :junction?, :compound? # @deprecated
|
13
|
+
|
3
14
|
def valid?
|
4
15
|
return true if self.class.nothing_banned?
|
16
|
+
|
5
17
|
!parts.find do |pt|
|
6
18
|
pt.match self.class.banned_re
|
7
19
|
end
|
data/lib/cardname/variants.rb
CHANGED
@@ -1,20 +1,23 @@
|
|
1
|
+
require "htmlentities"
|
2
|
+
|
1
3
|
class Cardname
|
2
4
|
module Variants
|
3
5
|
def simple_key
|
4
6
|
return "" if empty?
|
7
|
+
|
5
8
|
decoded
|
6
9
|
.underscore
|
7
|
-
.gsub(/[^#{OK4KEY_RE}]+/,
|
10
|
+
.gsub(/[^#{OK4KEY_RE}]+/, "_")
|
8
11
|
.split(/_+/)
|
9
12
|
.reject(&:empty?)
|
10
13
|
.map { |key| self.class.stable_key(key) }
|
11
|
-
.join(
|
14
|
+
.join("_")
|
12
15
|
end
|
13
16
|
|
14
17
|
def url_key
|
15
18
|
@url_key ||= part_names.map do |part_name|
|
16
|
-
stripped = part_name.decoded.gsub(/[^#{OK4KEY_RE}]+/,
|
17
|
-
stripped.gsub(/[\
|
19
|
+
stripped = part_name.decoded.gsub(/[^#{OK4KEY_RE}]+/, " ").strip
|
20
|
+
stripped.gsub(/[\s_]+/, "_")
|
18
21
|
end * self.class.joint
|
19
22
|
end
|
20
23
|
|
@@ -22,11 +25,11 @@ class Cardname
|
|
22
25
|
# but the key is no longer unique.
|
23
26
|
# For example "A-XB" and "A+*B" have the same safe_key
|
24
27
|
def safe_key
|
25
|
-
@safe_key ||= key.tr(
|
28
|
+
@safe_key ||= key.tr("*", "X").tr self.class.joint, "-"
|
26
29
|
end
|
27
30
|
|
28
31
|
def decoded
|
29
|
-
@decoded ||= s.index(
|
32
|
+
@decoded ||= s.index("&") ? HTMLEntities.new.decode(s) : s
|
30
33
|
end
|
31
34
|
|
32
35
|
def to_sym
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cardname
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ethan McCutchen
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-07-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '6'
|
21
|
+
version: '6.1'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '6'
|
28
|
+
version: '6.1'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: htmlentities
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- lib/cardname/contextual.rb
|
54
54
|
- lib/cardname/manipulate.rb
|
55
55
|
- lib/cardname/parts.rb
|
56
|
+
- lib/cardname/pieces.rb
|
56
57
|
- lib/cardname/predicates.rb
|
57
58
|
- lib/cardname/variants.rb
|
58
59
|
- lib/core_ext.rb
|
@@ -80,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
81
|
- !ruby/object:Gem::Version
|
81
82
|
version: '0'
|
82
83
|
requirements: []
|
83
|
-
rubygems_version: 3.
|
84
|
+
rubygems_version: 3.2.15
|
84
85
|
signing_key:
|
85
86
|
specification_version: 4
|
86
87
|
summary: Card names without all the cards
|