cardname 0.11.4 → 0.11.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8f8b91a34b888b1e298d4ec50d7a6d2c12207e1449ece845751bf8ad7f325b1
4
- data.tar.gz: 6deab4dff00266b7e180557e3bf0b7577ad393f76bd560ee2adfa766d56a5f23
3
+ metadata.gz: 0e0d301d80ce8422ca4aeb9bf8ce2307dc57d81a9629206bf660f5ebebd63474
4
+ data.tar.gz: a52dd72d962a26173c028a0c52e55988853dfd59a810ab6a8e46cf174ef3cd8d
5
5
  SHA512:
6
- metadata.gz: 204bad77b0157b0e472c92a6a2d861ea336da50744c4fc572e72c82b6fa9a0be6eb04591205c1441d8e51b050ca3f9242f26c18691b38d10a935dad267570ead
7
- data.tar.gz: e1a36c3294f34dd18e56588eec50262177ae94a6d35eb18ba8e8702b553c3dde82608d75147fa493cfa464a7f200291d6e60bc85160a57d124bd0a512385a72a
6
+ metadata.gz: 7b9de9bf4b55d4a40ac188f8150f421f4d3ee8267b5a4eea07742842645853e8fa0360bec8dbd0ca3aa2581ad6512f8dfa596c9bb2c016bcb25b7f158ff4b6a3
7
+ data.tar.gz: 534c1e4c669960e45e445a074a0c380ba9a2212f83807ede593b09c7fc132a1b0ac2e97f5e3c3be692912aeaf1a7f03dc809d235f96dff3548b17a654bf90c3d
data/Rakefile CHANGED
@@ -1,39 +1,37 @@
1
+ # -*- encoding : utf-8 -*-
1
2
 
2
- # encoding: utf-8
3
+ require "rubygems"
4
+ require "bundler"
3
5
 
4
- require 'rubygems'
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
- $stderr.puts e.message
13
- $stderr.puts "Run `bundle install` to install missing gems"
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 'rake'
16
+ require "rake"
18
17
 
19
- require 'rspec/core'
20
- require 'rspec/core/rake_task'
18
+ require "rspec/core"
19
+ require "rspec/core/rake_task"
21
20
  RSpec::Core::RakeTask.new(:spec) do |spec|
22
- spec.pattern = FileList['spec/**/*_spec.rb']
21
+ spec.pattern = FileList["spec/**/*_spec.rb"]
23
22
  end
24
23
 
25
24
  RSpec::Core::RakeTask.new(:rcov) do |spec|
26
- spec.pattern = 'spec/**/*_spec.rb'
25
+ spec.pattern = "spec/**/*_spec.rb"
27
26
  spec.rcov = true
28
27
  end
29
28
 
30
- task :default => :spec
29
+ task default: :spec
31
30
 
32
- require 'rdoc/task'
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('README*')
38
- rdoc.rdoc_files.include('lib/**/*.rb')
35
+ rdoc.rdoc_files.include("README*")
36
+ rdoc.rdoc_files.include("lib/**/*.rb")
39
37
  end
data/lib/cardname.rb CHANGED
@@ -24,7 +24,7 @@ class Cardname < String
24
24
 
25
25
  self.joint = "+"
26
26
  self.banned_array = []
27
- self.var_re = /\{([^\}]*\})\}/
27
+ self.var_re = /\{([^}]*\})\}/
28
28
  self.uninflect = :singularize
29
29
  self.stabilize = false
30
30
 
@@ -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 junction?
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
- junction? && parts.first.empty?
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 *from)
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
- remaining = parts_excluding *from
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
- # note - inconsistent use of left v. trunk
99
+ # NOTE: - inconsistent use of left v. trunk
94
100
  when /^_right$/i then context.tag
95
- when /^_(\d+)$/i then ordinal_part $~[1].to_i, context
96
- when /^_(L*)(R?)$/i then partmap_part $~, context
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, r_s = match[1].size, !match[2].empty?
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 "#{[ :start, :end ][index]}s_with_parts?", context
135
+ !new_parts.to_name.send "#{%i[start end][index]}s_with_parts?", context
128
136
  end
129
137
  end
130
138
  end
@@ -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
@@ -39,15 +39,15 @@ class Cardname
39
39
  end
40
40
 
41
41
  def parents
42
- @parents ||= junction? ? [left, right] : []
42
+ @parents ||= compound? ? [left, right] : []
43
43
  end
44
44
 
45
45
  def parent_names
46
- @parent_names ||= junction? ? [left_name, right_name] : []
46
+ @parent_names ||= compound? ? [left_name, right_name] : []
47
47
  end
48
48
 
49
49
  def parent_keys
50
- @parent_keys ||= junction? ? [left_key, right_key] : []
50
+ @parent_keys ||= compound? ? [left_key, right_key] : []
51
51
  end
52
52
 
53
53
  # Note that all names have a trunk and tag,
@@ -78,7 +78,7 @@ class Cardname
78
78
  end
79
79
 
80
80
  def ancestors
81
- @ancestors ||= pieces.reject { |p| p == self}
81
+ @ancestors ||= pieces.reject { |p| p == self }
82
82
  end
83
83
 
84
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
@@ -1,18 +1,19 @@
1
1
  class Cardname
2
2
  module Predicates
3
- def simple
3
+ def simple?
4
4
  @simple.nil? ? (@simple = parts.size <= 1) : @simple
5
5
  end
6
- alias_method :simple?, :simple
6
+ alias_method :simple, :simple? # @deprecated
7
7
 
8
8
  # @return true if name has more than one part
9
9
  def compound?
10
10
  !simple?
11
11
  end
12
- alias_method :junction?, :compound?
12
+ alias_method :junction?, :compound? # @deprecated
13
13
 
14
14
  def valid?
15
15
  return true if self.class.nothing_banned?
16
+
16
17
  !parts.find do |pt|
17
18
  pt.match self.class.banned_re
18
19
  end
@@ -2,19 +2,20 @@ class Cardname
2
2
  module Variants
3
3
  def simple_key
4
4
  return "" if empty?
5
+
5
6
  decoded
6
7
  .underscore
7
- .gsub(/[^#{OK4KEY_RE}]+/, '_')
8
+ .gsub(/[^#{OK4KEY_RE}]+/, "_")
8
9
  .split(/_+/)
9
10
  .reject(&:empty?)
10
11
  .map { |key| self.class.stable_key(key) }
11
- .join('_')
12
+ .join("_")
12
13
  end
13
14
 
14
15
  def url_key
15
16
  @url_key ||= part_names.map do |part_name|
16
- stripped = part_name.decoded.gsub(/[^#{OK4KEY_RE}]+/, ' ').strip
17
- stripped.gsub(/[\s\_]+/, '_')
17
+ stripped = part_name.decoded.gsub(/[^#{OK4KEY_RE}]+/, " ").strip
18
+ stripped.gsub(/[\s_]+/, "_")
18
19
  end * self.class.joint
19
20
  end
20
21
 
@@ -22,11 +23,11 @@ class Cardname
22
23
  # but the key is no longer unique.
23
24
  # For example "A-XB" and "A+*B" have the same safe_key
24
25
  def safe_key
25
- @safe_key ||= key.tr('*', 'X').tr self.class.joint, '-'
26
+ @safe_key ||= key.tr("*", "X").tr self.class.joint, "-"
26
27
  end
27
28
 
28
29
  def decoded
29
- @decoded ||= s.index('&') ? HTMLEntities.new.decode(s) : s
30
+ @decoded ||= s.index("&") ? HTMLEntities.new.decode(s) : s
30
31
  end
31
32
 
32
33
  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.11.4
4
+ version: 0.11.5
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-05-05 00:00:00.000000000 Z
13
+ date: 2021-05-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -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