pattern-match 1.0.0 → 1.1.0

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
- SHA1:
3
- metadata.gz: ef7bf869eb224fa684f0d76e818765b7c29bac7a
4
- data.tar.gz: 8f0250bc045bc40226c470eeecc0d4cb19c9948e
2
+ SHA256:
3
+ metadata.gz: 2cd3ccf69d626d2302494e2393796dfb571b06aace34f29def21dde39021e852
4
+ data.tar.gz: 8cfb00569ac023f7e76d1ae165a4f0ca2c43fa3afb82eb1e17dce30012d8ca4a
5
5
  SHA512:
6
- metadata.gz: da3c2aee6e261dc82bac97d578629b2d92a4449e6eb10ccd8f321fbd99330f2b505cde23df1e10080e7f9d2549ce40a9ba2c20c6e680d0fc6abe2c701cea3596
7
- data.tar.gz: 5c7108710be125a049fe4fde57a1292e6e820a87cb414ef6fe7db18ad6d339da2549659381ea018b17de6469adcf51cb90240fa532c8ea92b44d027f3065f847
6
+ metadata.gz: 575702a7996ba07a2a0b8bf3cbc5fd83035298f9ecec13fffb51652b8b6f92742df823d59bcfdd53cba8ebcb8e7861876215ea413573416c2aa167987b4257f2
7
+ data.tar.gz: 40218d0fbd2c075b6b2a0660febd458d04d5e379b0fdc06ca6c7588207091297fb2952eb7a2683ba686e154777a9fd6baf005feda34b8d2e303544764699f92f
@@ -0,0 +1,35 @@
1
+ on: [ push, pull_request ]
2
+
3
+ jobs:
4
+ ruby-versions:
5
+ uses: ruby/actions/.github/workflows/ruby_versions.yml@master
6
+ with:
7
+ engine: cruby
8
+ min_version: 2.4
9
+ test:
10
+ needs: ruby-versions
11
+ name: >-
12
+ Test (${{ matrix.ruby-version }} / ${{ matrix.os }} / DISABLE_REFINEMENTS: ${{ matrix.DISABLE_REFINEMENTS }})
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ ruby-version: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
17
+ os: [ ubuntu-latest, macos-latest ]
18
+ exclude:
19
+ - { os: macos-latest, ruby-version: 2.4 }
20
+ - { os: macos-latest, ruby-version: 2.5 }
21
+ DISABLE_REFINEMENTS: [ 1, 0 ]
22
+ runs-on: ${{ matrix.os }}
23
+ env:
24
+ DISABLE_REFINEMENTS: ${{ matrix.DISABLE_REFINEMENTS }}
25
+ continue-on-error: ${{ matrix.ruby-version == 'head' }}
26
+ steps:
27
+ - uses: actions/checkout@v2
28
+ - name: Set up Ruby
29
+ uses: ruby/setup-ruby@v1
30
+ with:
31
+ ruby-version: ${{ matrix.ruby-version }}
32
+ bundler-cache: true
33
+ - name: Run the test suite
34
+ run: |
35
+ bundle exec rake
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  .bundle
2
+ Gemfile.local
2
3
  Gemfile.lock
3
4
  coverage
4
5
  pkg/*
data/BSDL CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (C) 2012-2015 Kazuki Tsujimoto, All rights reserved.
1
+ Copyright (C) 2012 Kazuki Tsujimoto
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without
4
4
  modification, are permitted provided that the following conditions
data/COPYING CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (C) 2012-2015 Kazuki Tsujimoto, All rights reserved.
1
+ Copyright (C) 2012 Kazuki Tsujimoto
2
2
 
3
3
  You can redistribute it and/or modify it under either the terms of the
4
4
  2-clause BSDL (see the file BSDL), or the conditions below:
data/Gemfile CHANGED
@@ -1,3 +1,9 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gemspec
4
+
5
+ # https://github.com/redmine/redmine/blob/3.0.4/Gemfile#L101
6
+ local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
7
+ if File.exist?(local_gemfile)
8
+ eval_gemfile local_gemfile
9
+ end
data/LEGAL ADDED
@@ -0,0 +1,4 @@
1
+ LEGAL NOTICE INFORMATION
2
+ ------------------------
3
+
4
+ All the files in this distribution are written by the author.
data/README.rdoc CHANGED
@@ -48,14 +48,14 @@ An ordinary object is a value pattern.
48
48
  The pattern matches an object such that <code>pattern === object</code>.
49
49
 
50
50
  match(0) do
51
- with(Fixnum) { :match } #=> :match
51
+ with(Integer) { :match } #=> :match
52
52
  end
53
53
 
54
54
  If you want to use an another method of matching,
55
55
  you have to use <code>_</code> as follows.
56
56
 
57
57
  match(0) do
58
- with(_(Fixnum, :==)) { :match }
58
+ with(_(Integer, :==)) { :match }
59
59
  end #=> NoMatchingPatternError
60
60
 
61
61
  === Deconstructor
@@ -112,7 +112,7 @@ all objects bound to variable must be equal.
112
112
  <code>And</code>, <code>Or</code>, <code>Not</code> return and/or/not pattern.
113
113
 
114
114
  match([0, [1]]) do
115
- with(_[a & Fixnum, ! (_[2] | _[3])]) { a } #=> 0
115
+ with(_[a & Integer, ! (_[2] | _[3])]) { a } #=> 0
116
116
  end
117
117
 
118
118
  match(0) do
@@ -129,7 +129,7 @@ They are equivalent to <code>*</code>, <code>*?</code>,
129
129
  You can write as <code>*pattern</code> instead of <code>pattern, \___</code>.
130
130
 
131
131
  match([:a, 0, :b, :c]) do
132
- with(_[a & Symbol, ___, b & Fixnum, c & Symbol, ___]) do
132
+ with(_[a & Symbol, ___, b & Integer, c & Symbol, ___]) do
133
133
  a #=> [:a]
134
134
  b #=> 0
135
135
  c #=> [:b, :c]
@@ -142,7 +142,7 @@ You can write as <code>*pattern</code> instead of <code>pattern, \___</code>.
142
142
  It is equivalent to <code>()</code> in regular expression.
143
143
 
144
144
  match([:a, 0, :b, 1]) do
145
- with(_[Seq(a & Symbol, b & Fixnum), ___]) do
145
+ with(_[Seq(a & Symbol, b & Integer), ___]) do
146
146
  a #=> [:a, :b]
147
147
  b #=> [0, 1]
148
148
  end
@@ -154,6 +154,7 @@ It is equivalent to <code>()</code> in regular expression.
154
154
  * KeyMatcher
155
155
  * Hash.()
156
156
  * AttributeMatcher
157
+ * fallthrough (requires binding_of_caller gem)
157
158
 
158
159
  To use experimental features, you must also require 'pattern-match/experimental'.
159
160
  See source code for more details.
@@ -251,8 +252,19 @@ Pattern guard can be specified as a second argument to <code>with</code>.
251
252
  end
252
253
  end
253
254
 
254
- * {RubyTextProcessing}[https://code.google.com/p/tokland/wiki/RubyTextProcessing]
255
+ match([]) do
256
+ with(_[]) do
257
+ opts = {}
258
+ fallthrough
259
+ end
260
+ with(_[opts & Hash]) do
261
+ opts #=> {}
262
+ end
263
+ end
264
+
265
+ * {tokland/RubyTextProcessing}[https://github.com/tokland/tokland/wiki/RubyTextProcessing]
255
266
  * {yhara/tapl-ruby}[https://github.com/yhara/tapl-ruby]
267
+ * {k-tsj/power_assert}[https://github.com/k-tsj/power_assert/blob/8e9e0399a032936e3e3f3c1f06e0d038565f8044/lib/power_assert.rb]
256
268
 
257
269
  == Reference
258
270
  * {Pattern Matching in Ruby (at Sapporo RubyKaigi 2012) // Speaker Deck}[https://speakerdeck.com/k_tsj/patternmatchinginruby]
@@ -264,5 +276,3 @@ Pattern guard can be specified as a second argument to <code>with</code>.
264
276
  $ bundle install --path vendor/bundle
265
277
  $ bundle exec rake test (or "bundle exec rake")
266
278
  $ bundle exec rake build
267
-
268
- == Travis Build Status {<img src="https://secure.travis-ci.org/k-tsj/pattern-match.png"/>}[http://travis-ci.org/k-tsj/pattern-match]
@@ -1,5 +1,7 @@
1
1
  require 'pattern-match/deconstructor'
2
2
 
3
+ using PatternMatch if respond_to?(:using, true)
4
+
3
5
  module PatternMatch
4
6
  module HasOrderedSubPatterns
5
7
  private
@@ -16,6 +18,9 @@ module PatternMatch
16
18
  class Pattern
17
19
  attr_accessor :parent, :next, :prev
18
20
 
21
+ attr_reader :subpatterns
22
+ private :subpatterns
23
+
19
24
  def initialize(*subpatterns)
20
25
  @parent = nil
21
26
  @next = nil
@@ -25,7 +30,7 @@ module PatternMatch
25
30
  end
26
31
 
27
32
  def vars
28
- subpatterns.map(&:vars).flatten
33
+ subpatterns.flat_map(&:vars)
29
34
  end
30
35
 
31
36
  def ancestors
@@ -117,8 +122,6 @@ module PatternMatch
117
122
 
118
123
  private
119
124
 
120
- attr_reader :subpatterns
121
-
122
125
  def repeating_match(vals, is_greedy)
123
126
  quantifier = @next
124
127
  candidates = generate_candidates(vals)
@@ -200,8 +203,6 @@ module PatternMatch
200
203
  class PatternObjectDeconstructor < PatternDeconstructor
201
204
  include HasOrderedSubPatterns
202
205
 
203
- using PatternMatch if respond_to?(:using, true)
204
-
205
206
  def initialize(deconstructor, *subpatterns)
206
207
  super(*subpatterns)
207
208
  @deconstructor = deconstructor
@@ -472,10 +473,17 @@ module PatternMatch
472
473
  end
473
474
  end
474
475
 
476
+ FALLTHROUGH_TAG = Object.new
477
+
475
478
  class Env < BasicObject
476
479
  def initialize(ctx, val)
477
480
  @ctx = ctx
478
481
  @val = val
482
+ @fallthrough_quasibinding = nil
483
+ end
484
+
485
+ def fallthrough_called?
486
+ !! @fallthrough_quasibinding
479
487
  end
480
488
 
481
489
  private
@@ -483,14 +491,27 @@ module PatternMatch
483
491
  def with(pat_or_val, guard_proc = nil, &block)
484
492
  ctx = @ctx
485
493
  pat = pat_or_val.kind_of?(Pattern) ? pat_or_val : PatternValue.new(pat_or_val)
486
- pat.append(PatternCondition.new { check_for_duplicate_vars(pat.vars) })
494
+ pat.append(PatternCondition.new { validate_uniqueness_of_dup_vars(pat.vars) })
487
495
  if guard_proc
488
496
  pat.append(PatternCondition.new { with_quasibinding(ctx, pat.quasibinding, &guard_proc) })
489
497
  end
490
498
  pat.validate
499
+ if fallthrough_called?
500
+ ret = with_quasibinding(ctx, pat.quasibinding.merge(@fallthrough_quasibinding), &block)
501
+ ::Kernel.throw(self, ret)
502
+ end
491
503
  if pat.match([@val])
492
- ret = with_quasibinding(ctx, pat.quasibinding, &block)
493
- ::Kernel.throw(:exit_match, ret)
504
+ ret = nil
505
+ fallthrough_called = true
506
+ block_quasibinding = ::Kernel.catch(::PatternMatch::FALLTHROUGH_TAG) do
507
+ ret = with_quasibinding(ctx, pat.quasibinding, &block)
508
+ fallthrough_called = false
509
+ end
510
+ if fallthrough_called
511
+ @fallthrough_quasibinding = pat.quasibinding.merge(block_quasibinding)
512
+ else
513
+ ::Kernel.throw(self, ret)
514
+ end
494
515
  else
495
516
  nil
496
517
  end
@@ -524,8 +545,6 @@ module PatternMatch
524
545
  when 0
525
546
  uscore = PatternVariable.new(:_)
526
547
  class << uscore
527
- using PatternMatch if respond_to?(:using, true)
528
-
529
548
  def [](*args)
530
549
  Array.(*args)
531
550
  end
@@ -568,17 +587,8 @@ module PatternMatch
568
587
  PatternNot.new(*subpatterns)
569
588
  end
570
589
 
571
- def check_for_duplicate_vars(vars)
572
- vars.each_with_object({}) do |v, h|
573
- if h.has_key?(v.name)
574
- unless h[v.name] == v.val
575
- return false
576
- end
577
- else
578
- h[v.name] = v.val
579
- end
580
- end
581
- true
590
+ def validate_uniqueness_of_dup_vars(vars)
591
+ vars.group_by(&:name).all? {|_, dup_vars| dup_vars.map(&:val).uniq.length == 1 }
582
592
  end
583
593
 
584
594
  class QuasiBindingModule < ::Module
@@ -630,27 +640,27 @@ module PatternMatch
630
640
  class NoMatchingPatternError < PatternMatchError; end
631
641
  class MalformedPatternError < PatternMatchError; end
632
642
 
633
- # Make Pattern and its subclasses/Env private.
634
- if respond_to?(:private_constant)
635
- constants.each do |c|
636
- klass = const_get(c)
637
- next unless klass.kind_of?(Class)
638
- if klass <= Pattern
639
- private_constant c
640
- end
643
+ # Make Pattern and its subclasses, etc private.
644
+ constants.each do |c|
645
+ klass = const_get(c)
646
+ next unless klass.kind_of?(Class)
647
+ if klass <= Pattern
648
+ private_constant c
641
649
  end
642
- private_constant :Env
643
650
  end
651
+ private_constant :Env, :HasOrderedSubPatterns
644
652
 
645
653
  refine Object do
646
-
647
654
  private
648
655
 
649
656
  def match(*vals, &block)
650
657
  do_match = Proc.new do |val|
651
658
  env = Env.new(self, val)
652
- catch(:exit_match) do
659
+ catch(env) do
653
660
  env.instance_eval(&block)
661
+ if env.fallthrough_called?
662
+ raise PatternMatchError, 'cannot fallthrough final case in match'
663
+ end
654
664
  raise NoMatchingPatternError
655
665
  end
656
666
  end
@@ -8,17 +8,23 @@ module PatternMatch
8
8
  PatternObjectDeconstructor.new(self, *subpatterns)
9
9
  end
10
10
  end
11
+ end
11
12
 
12
- module Deconstructable
13
- using PatternMatch if respond_to?(:using, true)
13
+ using PatternMatch if respond_to?(:using, true)
14
14
 
15
+ module PatternMatch
16
+ module Deconstructable
15
17
  def call(*subpatterns)
16
18
  pattern_matcher(*subpatterns)
17
19
  end
18
20
  end
19
21
 
20
22
  refine Class do
21
- include PatternMatch::Deconstructable
23
+ if respond_to?(:import_methods, true)
24
+ import_methods PatternMatch::Deconstructable
25
+ else
26
+ include PatternMatch::Deconstructable
27
+ end
22
28
 
23
29
  def deconstruct(val)
24
30
  raise NotImplementedError, "need to define `#{__method__}'"
@@ -67,7 +73,11 @@ module PatternMatch
67
73
  end
68
74
 
69
75
  refine Regexp do
70
- include PatternMatch::Deconstructable
76
+ if respond_to?(:import_methods, true)
77
+ import_methods PatternMatch::Deconstructable
78
+ else
79
+ include PatternMatch::Deconstructable
80
+ end
71
81
 
72
82
  def deconstruct(val)
73
83
  m = Regexp.new("\\A#{source}\\z", options).match(val.to_s)
@@ -1,10 +1,12 @@
1
1
  class Module
2
- methods = Module.instance_methods(false) + Module.private_instance_methods(false)
2
+ refine_orig = "__refine_orig_#{Time.now.to_i}".to_sym
3
+
4
+ methods = instance_methods(false) + private_instance_methods(false)
3
5
  if methods.include?(:refine)
4
- if methods.include?(:__refine_orig)
6
+ if methods.include?(refine_orig)
5
7
  raise LoadError, "can't re-define Module#refine"
6
8
  end
7
- alias_method :__refine_orig, :refine
9
+ alias_method refine_orig, :refine
8
10
  remove_method :refine
9
11
  end
10
12
 
@@ -17,9 +19,9 @@ class Module
17
19
  ensure
18
20
  remove_method :refine
19
21
 
20
- if Kernel.respond_to?(:__refine_orig, true)
21
- alias_method :refine, :__refine_orig
22
- remove_method :__refine_orig
22
+ if Kernel.respond_to?(refine_orig, true)
23
+ alias_method :refine, refine_orig
24
+ remove_method refine_orig
23
25
  end
24
26
  end
25
27
  end
@@ -4,6 +4,8 @@ require 'set'
4
4
 
5
5
  raise LoadError, 'Module#prepend required' unless Module.respond_to?(:prepend, true)
6
6
 
7
+ using PatternMatch if respond_to?(:using, true)
8
+
7
9
  module PatternMatch
8
10
  class Pattern
9
11
  module Backtrackable
@@ -50,8 +52,6 @@ module PatternMatch
50
52
  end
51
53
 
52
54
  module Deconstructable
53
- using PatternMatch if respond_to?(:using, true)
54
-
55
55
  remove_method :call
56
56
  def call(*subpatterns)
57
57
  if Object == self
@@ -62,6 +62,12 @@ module PatternMatch
62
62
  end
63
63
  end
64
64
 
65
+ refine Class do
66
+ if respond_to?(:import_methods, true)
67
+ import_methods PatternMatch::Deconstructable
68
+ end
69
+ end
70
+
65
71
  module AttributeMatcher
66
72
  def self.included(klass)
67
73
  class << klass
@@ -180,11 +186,23 @@ class Hash
180
186
  end
181
187
 
182
188
  class Object
183
- using PatternMatch if respond_to?(:using, true)
184
-
185
189
  def assert_pattern(pattern)
186
190
  match(self) do
187
191
  Kernel.eval("with(#{pattern}) { self }", Kernel.binding)
188
192
  end
189
193
  end
194
+
195
+ begin
196
+ require 'binding_of_caller'
197
+
198
+ private
199
+
200
+ def fallthrough
201
+ b = binding.of_caller(1)
202
+ vars = b.eval('local_variables')
203
+ quasibinding = Hash[*vars.map {|i| [i, b.local_variable_get(i)] }.flatten(1)]
204
+ throw PatternMatch::FALLTHROUGH_TAG, quasibinding
205
+ end
206
+ rescue LoadError
207
+ end
190
208
  end
@@ -1,3 +1,3 @@
1
1
  module PatternMatch
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/pattern-match.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # pattern-match.rb
2
2
  #
3
- # Copyright (C) 2012-2015 Kazuki Tsujimoto, All rights reserved.
3
+ # Copyright (C) 2012 Kazuki Tsujimoto
4
4
 
5
5
  require 'pattern-match/version'
6
6
  require 'pattern-match/deconstructor'
@@ -16,10 +16,10 @@ Gem::Specification.new do |s|
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f) }
18
18
  s.require_paths = ['lib']
19
- s.add_development_dependency 'test-unit'
20
- s.add_development_dependency 'rake'
21
- s.add_development_dependency 'simplecov'
22
19
  s.extra_rdoc_files = ['README.rdoc']
23
20
  s.rdoc_options = ['--main', 'README.rdoc']
24
21
  s.licenses = ['2-clause BSDL', "Ruby's"]
22
+
23
+ s.add_development_dependency 'test-unit'
24
+ s.add_development_dependency 'rake'
25
25
  end
data/test/helper.rb CHANGED
@@ -6,6 +6,12 @@ module Test::Unit::Assertions
6
6
  end
7
7
  end
8
8
 
9
+ module TestUtils
10
+ def eval_in_unrefined_scope(expr)
11
+ eval(expr)
12
+ end
13
+ end
14
+
9
15
  begin
10
16
  if ENV['COVERAGE']
11
17
  require 'simplecov'
@@ -1,14 +1,14 @@
1
1
  require_relative 'helper'
2
2
  require 'test-unit'
3
- if ENV['DISABLE_REFINEMENTS']
4
- require_relative '../lib/pattern-match/disable_refinements'
5
- require_relative '../lib/pattern-match'
6
- else
7
- require_relative '../lib/pattern-match'
3
+ if ENV['DISABLE_REFINEMENTS'].to_i.zero?
4
+ require 'pattern-match'
8
5
  using PatternMatch
6
+ else
7
+ require 'pattern-match/disable_refinements'
8
+ require 'pattern-match'
9
9
  end
10
10
  begin
11
- require_relative '../lib/pattern-match/experimental'
11
+ require 'pattern-match/experimental'
12
12
  rescue LoadError
13
13
  end
14
14
 
@@ -102,10 +102,10 @@ class TestExperimental < Test::Unit::TestCase
102
102
  end
103
103
 
104
104
  def test_object_assert_pattern
105
- assert_equal([0], [0].assert_pattern('_[Fixnum]'))
106
- assert_equal([0], [0].assert_pattern('_[a & Fixnum], guard { a.even? }'))
105
+ assert_equal([0], [0].assert_pattern('_[Integer]'))
106
+ assert_equal([0], [0].assert_pattern('_[a & Integer], guard { a.even? }'))
107
107
  assert_raises(PatternMatch::NoMatchingPatternError) do
108
- [0, 1].assert_pattern('_[Fixnum]')
108
+ [0, 1].assert_pattern('_[Integer]')
109
109
  end
110
110
  end
111
111
 
@@ -145,4 +145,28 @@ class TestExperimental < Test::Unit::TestCase
145
145
  with(_) { flunk }
146
146
  end
147
147
  end
148
+
149
+ def test_fallthrough
150
+ omit unless respond_to?(:fallthrough, true)
151
+
152
+ match(0) do
153
+ with(a) do
154
+ b = 1
155
+ assert_equal 0, a
156
+ assert_equal 1, b
157
+ fallthrough
158
+ end
159
+ with(_[a, c]) do
160
+ assert_equal 0, a
161
+ assert_equal 1, b
162
+ assert_nil c
163
+ end
164
+ end
165
+
166
+ assert_raises(PatternMatch::PatternMatchError) do
167
+ match(0) do
168
+ with(_) { fallthrough }
169
+ end
170
+ end
171
+ end
148
172
  end if defined? PatternMatch::AttributeMatcher
@@ -1,21 +1,23 @@
1
1
  require_relative 'helper'
2
2
  require 'test-unit'
3
- if ENV['DISABLE_REFINEMENTS']
4
- require_relative '../lib/pattern-match/disable_refinements'
5
- require_relative '../lib/pattern-match'
6
- else
7
- require_relative '../lib/pattern-match'
3
+ if ENV['DISABLE_REFINEMENTS'].to_i.zero?
4
+ require 'pattern-match'
8
5
  using PatternMatch
6
+ else
7
+ require 'pattern-match/disable_refinements'
8
+ require 'pattern-match'
9
9
  end
10
10
 
11
11
  class TestStandard < Test::Unit::TestCase
12
+ include TestUtils
13
+
12
14
  def test_basic
13
15
  this = self
14
16
  ret = match([0, 1, 2, 3]) do
15
17
  with(nil) { flunk }
16
18
  with(_[]) { flunk }
17
19
  with(_[a, 0, 0, b]) { flunk }
18
- with(_[a, Fixnum , 2, b]) do
20
+ with(_[a, Integer , 2, b]) do
19
21
  assert_equal(this, self)
20
22
  assert_equal(0, a)
21
23
  assert_equal(3, b)
@@ -123,8 +125,8 @@ class TestStandard < Test::Unit::TestCase
123
125
  end
124
126
 
125
127
  def test_uscore
126
- match([0, 1, Fixnum]) do
127
- with(_[_, ! _(Float), _(Fixnum, :==)]) do
128
+ match([0, 1, Integer]) do
129
+ with(_[_, ! _(Float), _(Integer, :==)]) do
128
130
  assert_raises(NameError) { _ }
129
131
  end
130
132
  with(_) { flunk }
@@ -275,7 +277,7 @@ class TestStandard < Test::Unit::TestCase
275
277
  end
276
278
 
277
279
  match([[0, 1, :a, 'A'], [2, :b, :c, 'B'], ['C'], 3]) do
278
- with(_[_[a & Fixnum, ___, b & Symbol, ___, c], ___, d]) do
280
+ with(_[_[a & Integer, ___, b & Symbol, ___, c], ___, d]) do
279
281
  assert_equal([[0, 1], [2], []], a)
280
282
  assert_equal([[:a], [:b, :c], []], b)
281
283
  assert_equal(['A', 'B', 'C'], c)
@@ -285,7 +287,7 @@ class TestStandard < Test::Unit::TestCase
285
287
  end
286
288
 
287
289
  match([0, 1, 2, 4, 5]) do
288
- with(_[*a, b & Fixnum, __2, *c], guard { b.all?(&:even?) }) do
290
+ with(_[*a, b & Integer, __2, *c], guard { b.all?(&:even?) }) do
289
291
  assert_equal([0, 1], a)
290
292
  assert_equal([2, 4], b)
291
293
  assert_equal([5], c)
@@ -343,7 +345,7 @@ class TestStandard < Test::Unit::TestCase
343
345
  end
344
346
 
345
347
  match([0, :a, 1, 2, :b, 3]) do
346
- with(_[Seq(a & Fixnum, b & Symbol, c & Fixnum), ___]) do
348
+ with(_[Seq(a & Integer, b & Symbol, c & Integer), ___]) do
347
349
  assert_equal([0, 2], a)
348
350
  assert_equal([:a, :b], b)
349
351
  assert_equal([1, 3], c)
@@ -352,12 +354,12 @@ class TestStandard < Test::Unit::TestCase
352
354
  end
353
355
 
354
356
  match([0, :a, 1, 2, :b, :c]) do
355
- with(_[Seq(a & Fixnum, b & Symbol, c & Fixnum), ___]) { flunk }
357
+ with(_[Seq(a & Integer, b & Symbol, c & Integer), ___]) { flunk }
356
358
  with(_) { pass }
357
359
  end
358
360
 
359
361
  match([0, 1, :a, 2, 3, :b, 4, 5]) do
360
- with(_[a, Seq(b & Fixnum, c & Symbol, d & Fixnum), ___, e]) do
362
+ with(_[a, Seq(b & Integer, c & Symbol, d & Integer), ___, e]) do
361
363
  assert_equal(0, a)
362
364
  assert_equal([1, 3], b)
363
365
  assert_equal([:a, :b], c)
@@ -420,7 +422,7 @@ class TestStandard < Test::Unit::TestCase
420
422
 
421
423
  assert_raises(NotImplementedError) do
422
424
  match([0]) do
423
- with(_[Seq(a & Fixnum, ___), ___]) {}
425
+ with(_[Seq(a & Integer, ___), ___]) {}
424
426
  end
425
427
  end
426
428
  end
@@ -630,16 +632,16 @@ class TestStandard < Test::Unit::TestCase
630
632
  end
631
633
 
632
634
  def test_refinements
633
- if ENV['DISABLE_REFINEMENTS']
634
- assert_kind_of(PatternMatch.const_get(:Pattern), eval('Class.()', TOPLEVEL_BINDING))
635
- assert_equal(0, eval('match(0) { with(_) { 0 } }', TOPLEVEL_BINDING))
636
- else
635
+ if ENV['DISABLE_REFINEMENTS'].to_i.zero?
637
636
  assert_raises(NoMethodError) do
638
- eval('Class.()', TOPLEVEL_BINDING)
637
+ eval_in_unrefined_scope('Class.()')
639
638
  end
640
639
  assert_raises(NoMethodError) do
641
- eval('match(0) { with(_) { 0 } }', TOPLEVEL_BINDING)
640
+ eval_in_unrefined_scope('match(0) { with(_) { 0 } }')
642
641
  end
642
+ else
643
+ assert_kind_of(PatternMatch.const_get(:Pattern), eval_in_unrefined_scope('Class.()'))
644
+ assert_equal(0, eval_in_unrefined_scope('match(0) { with(_) { 0 } }'))
643
645
  end
644
646
  end
645
647
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pattern-match
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kazuki Tsujimoto
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-07 00:00:00.000000000 Z
11
+ date: 2024-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-unit
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: simplecov
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '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'
55
41
  description: A pattern matching library.
56
42
  email:
57
43
  - kazuki@callcc.net
@@ -60,11 +46,12 @@ extensions: []
60
46
  extra_rdoc_files:
61
47
  - README.rdoc
62
48
  files:
49
+ - ".github/workflows/ci.yml"
63
50
  - ".gitignore"
64
- - ".travis.yml"
65
51
  - BSDL
66
52
  - COPYING
67
53
  - Gemfile
54
+ - LEGAL
68
55
  - README.rdoc
69
56
  - Rakefile
70
57
  - lib/pattern-match.rb
@@ -82,7 +69,7 @@ licenses:
82
69
  - 2-clause BSDL
83
70
  - Ruby's
84
71
  metadata: {}
85
- post_install_message:
72
+ post_install_message:
86
73
  rdoc_options:
87
74
  - "--main"
88
75
  - README.rdoc
@@ -99,9 +86,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
86
  - !ruby/object:Gem::Version
100
87
  version: '0'
101
88
  requirements: []
102
- rubyforge_project:
103
- rubygems_version: 2.4.5
104
- signing_key:
89
+ rubygems_version: 3.4.19
90
+ signing_key:
105
91
  specification_version: 4
106
92
  summary: A pattern matching library
107
- test_files: []
93
+ test_files:
94
+ - test/helper.rb
95
+ - test/test_experimental.rb
96
+ - test/test_standard.rb
data/.travis.yml DELETED
@@ -1,30 +0,0 @@
1
- rvm:
2
- - 1.9.3
3
- - 2.0.0
4
- - 2.1
5
- - 2.2
6
- - ruby-head
7
- - jruby-19mode
8
- env:
9
- - TEST="test/test_*"
10
- - TEST="test/test_standard.rb"
11
- - DISABLE_REFINEMENTS=1 TEST="test/test_*"
12
- - DISABLE_REFINEMENTS=1 TEST="test/test_standard.rb"
13
- matrix:
14
- exclude:
15
- - rvm: 1.9.3
16
- env: TEST="test/test_*"
17
- - rvm: 1.9.3
18
- env: TEST="test/test_standard.rb"
19
- - rvm: 2.0.0
20
- env: TEST="test/test_*"
21
- - rvm: 2.0.0
22
- env: TEST="test/test_standard.rb"
23
- - rvm: jruby-19mode
24
- env: TEST="test/test_*"
25
- - rvm: jruby-19mode
26
- env: TEST="test/test_standard.rb"
27
- - rvm: jruby-19mode
28
- env: DISABLE_REFINEMENTS=1 TEST="test/test_*"
29
- allow_failures:
30
- - rvm: ruby-head