positionrange 0.6.7 → 0.7.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.
- data/README +7 -7
 - data/Rakefile +1 -1
 - data/lib/position_range/error.rb +7 -9
 - data/lib/position_range/list.rb +35 -1
 - data/lib/position_range/version.rb +2 -2
 - data/lib/position_range.rb +7 -9
 - data/test/position_range_list_test.rb +26 -3
 - data/test/position_range_test.rb +7 -9
 - metadata +6 -6
 
    
        data/README
    CHANGED
    
    | 
         @@ -68,7 +68,7 @@ Clustering overlaps maintains attributes. 
     | 
|
| 
       68 
68 
     | 
    
         | 
| 
       69 
69 
     | 
    
         
             
            == Installation
         
     | 
| 
       70 
70 
     | 
    
         | 
| 
       71 
     | 
    
         
            -
            You can install  
     | 
| 
      
 71 
     | 
    
         
            +
            You can install PositionRange with the following command:
         
     | 
| 
       72 
72 
     | 
    
         | 
| 
       73 
73 
     | 
    
         
             
              % [sudo] gem install positionrange
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
         @@ -82,9 +82,9 @@ And then from its distribution directory installed with: 
     | 
|
| 
       82 
82 
     | 
    
         | 
| 
       83 
83 
     | 
    
         
             
            == Support
         
     | 
| 
       84 
84 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
            The  
     | 
| 
      
 85 
     | 
    
         
            +
            The PositionRange homepage is http://positionrange.rubyforge.org.
         
     | 
| 
       86 
86 
     | 
    
         | 
| 
       87 
     | 
    
         
            -
            For the latest news on  
     | 
| 
      
 87 
     | 
    
         
            +
            For the latest news on PositionRange:
         
     | 
| 
       88 
88 
     | 
    
         | 
| 
       89 
89 
     | 
    
         
             
            * http://foundation.logilogi.org/tags/PositionRange
         
     | 
| 
       90 
90 
     | 
    
         | 
| 
         @@ -99,11 +99,11 @@ This documentation can be browsed online at: 
     | 
|
| 
       99 
99 
     | 
    
         | 
| 
       100 
100 
     | 
    
         
             
            == Copyrights
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
            Foundation.  
     | 
| 
      
 102 
     | 
    
         
            +
            PositionRange and these docs are Copyright (c) 2006-2009 The LogiLogi
         
     | 
| 
      
 103 
     | 
    
         
            +
            Foundation. PositionRange is licensed under the {GNU Lesser General 
         
     | 
| 
       104 
104 
     | 
    
         
             
            Public License}[http://www.gnu.org/licenses/lgpl-3.0-standalone.html].
         
     | 
| 
       105 
105 
     | 
    
         
             
            These docs are available under the {Creative Commons Attribution-Share
         
     | 
| 
       106 
106 
     | 
    
         
             
            Alike License}[http://creativecommons.org/licenses/by-sa/3.0/].
         
     | 
| 
       107 
107 
     | 
    
         | 
| 
       108 
     | 
    
         
            -
            You can use  
     | 
| 
       109 
     | 
    
         
            -
            but  
     | 
| 
      
 108 
     | 
    
         
            +
            You can use PositionRange in an application that is not Free Software
         
     | 
| 
      
 109 
     | 
    
         
            +
            but PositionRange itself remains Free Software.
         
     | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/lib/position_range/error.rb
    CHANGED
    
    | 
         @@ -1,15 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #--#
         
     | 
| 
       2 
     | 
    
         
            -
            # Copyright: (c) 2006- 
     | 
| 
      
 2 
     | 
    
         
            +
            # Copyright: (c) 2006-2009 The LogiLogi Foundation <foundation@logilogi.org>
         
     | 
| 
       3 
3 
     | 
    
         
             
            #
         
     | 
| 
       4 
4 
     | 
    
         
             
            # License:
         
     | 
| 
       5 
     | 
    
         
            -
            #   This file is part of the PositionRange Library. PositionRange is Free
         
     | 
| 
       6 
     | 
    
         
            -
            #   Software. You can run/distribute/modify PositionRange under the terms  
     | 
| 
       7 
     | 
    
         
            -
            #   the GNU  
     | 
| 
       8 
     | 
    
         
            -
            #   that  
     | 
| 
       9 
     | 
    
         
            -
            #    
     | 
| 
       10 
     | 
    
         
            -
            #    
     | 
| 
       11 
     | 
    
         
            -
            #   and libre (LICENSE.txt contains the full text of the legally binding
         
     | 
| 
       12 
     | 
    
         
            -
            #   license).
         
     | 
| 
      
 5 
     | 
    
         
            +
            #   This file is part of the PositionRange Library. PositionRange is Free 
         
     | 
| 
      
 6 
     | 
    
         
            +
            #   Software. You can run/distribute/modify PositionRange under the terms 
         
     | 
| 
      
 7 
     | 
    
         
            +
            #   of the GNU Lesser General Public License version 3. This license
         
     | 
| 
      
 8 
     | 
    
         
            +
            #   states that you can use PositionRange in applications that are not Free 
         
     | 
| 
      
 9 
     | 
    
         
            +
            #   Software but PositionRange itself remains Free Software. (LICENSE contains 
         
     | 
| 
      
 10 
     | 
    
         
            +
            #   the full text of the legally binding license).
         
     | 
| 
       13 
11 
     | 
    
         
             
            #++#
         
     | 
| 
       14 
12 
     | 
    
         
             
            #
         
     | 
| 
       15 
13 
     | 
    
         
             
            # This Error is raised if positions are out of range.
         
     | 
    
        data/lib/position_range/list.rb
    CHANGED
    
    | 
         @@ -270,7 +270,7 @@ class PositionRange::List < Array 
     | 
|
| 
       270 
270 
     | 
    
         
             
                self.dup.invert!(maximum_size)
         
     | 
| 
       271 
271 
     | 
    
         
             
              end
         
     | 
| 
       272 
272 
     | 
    
         | 
| 
       273 
     | 
    
         
            -
              # Makes sure that there are no  
     | 
| 
      
 273 
     | 
    
         
            +
              # Makes sure that there are no overlapping borders between
         
     | 
| 
       274 
274 
     | 
    
         
             
              # PositionRanges.
         
     | 
| 
       275 
275 
     | 
    
         
             
              #
         
     | 
| 
       276 
276 
     | 
    
         
             
              # The guaranteed situation after calling this method:
         
     | 
| 
         @@ -401,6 +401,9 @@ class PositionRange::List < Array 
     | 
|
| 
       401 
401 
     | 
    
         
             
                      'of different range_sizes: ' + ranges_to_insert.to_s + ', ' +
         
     | 
| 
       402 
402 
     | 
    
         
             
                      ranges_at_which_to_insert.to_s
         
     | 
| 
       403 
403 
     | 
    
         
             
                end
         
     | 
| 
      
 404 
     | 
    
         
            +
                ranges_to_insert.align_chunks!(ranges_at_which_to_insert)
         
     | 
| 
      
 405 
     | 
    
         
            +
                ranges_at_which_to_insert.align_chunks!(ranges_to_insert)
         
     | 
| 
      
 406 
     | 
    
         
            +
             
     | 
| 
       404 
407 
     | 
    
         
             
                ranges_to_act = ranges_at_which_to_insert.each {|p_r| p_r.action = :ins}.concat(
         
     | 
| 
       405 
408 
     | 
    
         
             
                    ranges_to_skip).sort!
         
     | 
| 
       406 
409 
     | 
    
         | 
| 
         @@ -433,6 +436,37 @@ class PositionRange::List < Array 
     | 
|
| 
       433 
436 
     | 
    
         
             
                return self
         
     | 
| 
       434 
437 
     | 
    
         
             
              end
         
     | 
| 
       435 
438 
     | 
    
         | 
| 
      
 439 
     | 
    
         
            +
              # Ensures that the other list and this list don't have any
         
     | 
| 
      
 440 
     | 
    
         
            +
              # overlapping chunks, considering their size.
         
     | 
| 
      
 441 
     | 
    
         
            +
              #
         
     | 
| 
      
 442 
     | 
    
         
            +
              # So PositionRange::List.from_s('10,20:50,70').align_chunks!(
         
     | 
| 
      
 443 
     | 
    
         
            +
              #     PositionRange::List.from_s('20,30:200,210,550,560'))
         
     | 
| 
      
 444 
     | 
    
         
            +
              #
         
     | 
| 
      
 445 
     | 
    
         
            +
              # will result in:
         
     | 
| 
      
 446 
     | 
    
         
            +
              # PositionRange::List.from_s('10,20:50,60:60,70')
         
     | 
| 
      
 447 
     | 
    
         
            +
              #
         
     | 
| 
      
 448 
     | 
    
         
            +
              def align_chunks!(other_ranges)
         
     | 
| 
      
 449 
     | 
    
         
            +
                i = -1
         
     | 
| 
      
 450 
     | 
    
         
            +
                self_p = 0
         
     | 
| 
      
 451 
     | 
    
         
            +
                other_p = 0
         
     | 
| 
      
 452 
     | 
    
         
            +
                other_ranges.each {|p_r|
         
     | 
| 
      
 453 
     | 
    
         
            +
                  i += 1
         
     | 
| 
      
 454 
     | 
    
         
            +
                  if !self[i]
         
     | 
| 
      
 455 
     | 
    
         
            +
                    return self
         
     | 
| 
      
 456 
     | 
    
         
            +
                  end
         
     | 
| 
      
 457 
     | 
    
         
            +
                  other_p += p_r.size
         
     | 
| 
      
 458 
     | 
    
         
            +
                  self_p += self[i].size
         
     | 
| 
      
 459 
     | 
    
         
            +
                  if self_p > other_p
         
     | 
| 
      
 460 
     | 
    
         
            +
                    copy = self[i]
         
     | 
| 
      
 461 
     | 
    
         
            +
                    cut = self[i].begin + p_r.size
         
     | 
| 
      
 462 
     | 
    
         
            +
                    self[i] = copy.new_dup(copy.begin, cut)
         
     | 
| 
      
 463 
     | 
    
         
            +
                    self.insert(i + 1, copy.new_dup(cut, copy.end))
         
     | 
| 
      
 464 
     | 
    
         
            +
                    self_p = other_p
         
     | 
| 
      
 465 
     | 
    
         
            +
                  end
         
     | 
| 
      
 466 
     | 
    
         
            +
                }
         
     | 
| 
      
 467 
     | 
    
         
            +
                return self
         
     | 
| 
      
 468 
     | 
    
         
            +
              end
         
     | 
| 
      
 469 
     | 
    
         
            +
             
     | 
| 
       436 
470 
     | 
    
         
             
              # Inserting at ranges returning a new list.
         
     | 
| 
       437 
471 
     | 
    
         
             
              #
         
     | 
| 
       438 
472 
     | 
    
         
             
              # See insert_at_ranges!
         
     | 
    
        data/lib/position_range.rb
    CHANGED
    
    | 
         @@ -1,15 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #--#
         
     | 
| 
       2 
     | 
    
         
            -
            # Copyright: (c) 2006- 
     | 
| 
      
 2 
     | 
    
         
            +
            # Copyright: (c) 2006-2009 The LogiLogi Foundation <foundation@logilogi.org>
         
     | 
| 
       3 
3 
     | 
    
         
             
            #
         
     | 
| 
       4 
4 
     | 
    
         
             
            # License:
         
     | 
| 
       5 
     | 
    
         
            -
            #   This file is part of the PositionRange Library. PositionRange is Free
         
     | 
| 
       6 
     | 
    
         
            -
            #   Software. You can run/distribute/modify PositionRange under the terms  
     | 
| 
       7 
     | 
    
         
            -
            #   the GNU  
     | 
| 
       8 
     | 
    
         
            -
            #   that  
     | 
| 
       9 
     | 
    
         
            -
            #    
     | 
| 
       10 
     | 
    
         
            -
            #    
     | 
| 
       11 
     | 
    
         
            -
            #   and libre (LICENSE.txt contains the full text of the legally binding
         
     | 
| 
       12 
     | 
    
         
            -
            #   license).
         
     | 
| 
      
 5 
     | 
    
         
            +
            #   This file is part of the PositionRange Library. PositionRange is Free 
         
     | 
| 
      
 6 
     | 
    
         
            +
            #   Software. You can run/distribute/modify PositionRange under the terms 
         
     | 
| 
      
 7 
     | 
    
         
            +
            #   of the GNU Lesser General Public License version 3. This license
         
     | 
| 
      
 8 
     | 
    
         
            +
            #   states that you can use PositionRange in applications that are not Free 
         
     | 
| 
      
 9 
     | 
    
         
            +
            #   Software but PositionRange itself remains Free Software. (LICENSE contains 
         
     | 
| 
      
 10 
     | 
    
         
            +
            #   the full text of the legally binding license).
         
     | 
| 
       13 
11 
     | 
    
         
             
            #++#
         
     | 
| 
       14 
12 
     | 
    
         
             
            #
         
     | 
| 
       15 
13 
     | 
    
         
             
            # PositionRanges allow one to model ranges of text.
         
     | 
| 
         @@ -378,10 +378,10 @@ class PositionRangeListTest < Test::Unit::TestCase 
     | 
|
| 
       378 
378 
     | 
    
         | 
| 
       379 
379 
     | 
    
         
             
              def test_insert_at_ranges
         
     | 
| 
       380 
380 
     | 
    
         
             
                # Without skipping
         
     | 
| 
       381 
     | 
    
         
            -
                assert_equal PositionRange::List.from_s('0,10:50, 
     | 
| 
      
 381 
     | 
    
         
            +
                assert_equal PositionRange::List.from_s('0,10:50,60:15,20'),
         
     | 
| 
       382 
382 
     | 
    
         
             
                    PositionRange::List.from_s('0,10:15,20').insert_at_ranges!(
         
     | 
| 
       383 
     | 
    
         
            -
                        PositionRange::List.from_s('50, 
     | 
| 
       384 
     | 
    
         
            -
                        PositionRange::List.from_s(' 
     | 
| 
      
 383 
     | 
    
         
            +
                        PositionRange::List.from_s('50,60'),
         
     | 
| 
      
 384 
     | 
    
         
            +
                        PositionRange::List.from_s('10,20'))
         
     | 
| 
       385 
385 
     | 
    
         | 
| 
       386 
386 
     | 
    
         
             
                # With skipping
         
     | 
| 
       387 
387 
     | 
    
         
             
                assert_equal PositionRange::List.from_s('39,49:100,102:6,7:16,20'),
         
     | 
| 
         @@ -414,6 +414,12 @@ class PositionRangeListTest < Test::Unit::TestCase 
     | 
|
| 
       414 
414 
     | 
    
         
             
                        PositionRange::List.from_s('20,30:40,50'),
         
     | 
| 
       415 
415 
     | 
    
         
             
                        PositionRange::List.from_s('800,810:850,860'))
         
     | 
| 
       416 
416 
     | 
    
         | 
| 
      
 417 
     | 
    
         
            +
                # error-case
         
     | 
| 
      
 418 
     | 
    
         
            +
                assert_equal PositionRange::List.from_s('0,10:50,59:15,20:59,68'),
         
     | 
| 
      
 419 
     | 
    
         
            +
                    PositionRange::List.from_s('0,10:15,20').insert_at_ranges!(
         
     | 
| 
      
 420 
     | 
    
         
            +
                        PositionRange::List.from_s('50,68'),
         
     | 
| 
      
 421 
     | 
    
         
            +
                        PositionRange::List.from_s('11,20:25,34'))
         
     | 
| 
      
 422 
     | 
    
         
            +
             
     | 
| 
       417 
423 
     | 
    
         
             
                # dup-alternatives
         
     | 
| 
       418 
424 
     | 
    
         
             
                p = PositionRange::List.from_s('0,10:15,20')
         
     | 
| 
       419 
425 
     | 
    
         
             
                to_p = PositionRange::List.from_s('0,10:50,59:15,20')
         
     | 
| 
         @@ -429,6 +435,23 @@ class PositionRangeListTest < Test::Unit::TestCase 
     | 
|
| 
       429 
435 
     | 
    
         
             
                assert_equal p, to_p
         
     | 
| 
       430 
436 
     | 
    
         
             
              end
         
     | 
| 
       431 
437 
     | 
    
         | 
| 
      
 438 
     | 
    
         
            +
              def test_align_chunks
         
     | 
| 
      
 439 
     | 
    
         
            +
                # standard case
         
     | 
| 
      
 440 
     | 
    
         
            +
                assert_equal PositionRange::List.from_s('10,20:50,60:60,70'),
         
     | 
| 
      
 441 
     | 
    
         
            +
                    PositionRange::List.from_s('10,20:50,70').align_chunks!(
         
     | 
| 
      
 442 
     | 
    
         
            +
                        PositionRange::List.from_s('20,30:200,210:550,560'))
         
     | 
| 
      
 443 
     | 
    
         
            +
             
     | 
| 
      
 444 
     | 
    
         
            +
                # self longer
         
     | 
| 
      
 445 
     | 
    
         
            +
                assert_equal PositionRange::List.from_s('10,20:50,60:60,70:70,80'),
         
     | 
| 
      
 446 
     | 
    
         
            +
                    PositionRange::List.from_s('10,20:50,80').align_chunks!(
         
     | 
| 
      
 447 
     | 
    
         
            +
                        PositionRange::List.from_s('20,30:200,210:550,560'))
         
     | 
| 
      
 448 
     | 
    
         
            +
             
     | 
| 
      
 449 
     | 
    
         
            +
                # other longer
         
     | 
| 
      
 450 
     | 
    
         
            +
                assert_equal PositionRange::List.from_s('10,20:50,60:60,70'),
         
     | 
| 
      
 451 
     | 
    
         
            +
                    PositionRange::List.from_s('10,20:50,70').align_chunks!(
         
     | 
| 
      
 452 
     | 
    
         
            +
                        PositionRange::List.from_s('20,30:200,210:550,590'))
         
     | 
| 
      
 453 
     | 
    
         
            +
              end
         
     | 
| 
      
 454 
     | 
    
         
            +
             
     | 
| 
       432 
455 
     | 
    
         
             
              ### Highlevel methods
         
     | 
| 
       433 
456 
     | 
    
         | 
| 
       434 
457 
     | 
    
         
             
              def test_translate_to_view
         
     | 
    
        data/test/position_range_test.rb
    CHANGED
    
    | 
         @@ -1,15 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #--#
         
     | 
| 
       2 
     | 
    
         
            -
            # Copyright: (c) 2006- 
     | 
| 
      
 2 
     | 
    
         
            +
            # Copyright: (c) 2006-2009 The LogiLogi Foundation <foundation@logilogi.org>
         
     | 
| 
       3 
3 
     | 
    
         
             
            #
         
     | 
| 
       4 
4 
     | 
    
         
             
            # License:
         
     | 
| 
       5 
     | 
    
         
            -
            #   This file is part of the PositionRange Library. PositionRange is  
     | 
| 
       6 
     | 
    
         
            -
            #    
     | 
| 
       7 
     | 
    
         
            -
            #   the GNU  
     | 
| 
       8 
     | 
    
         
            -
            #   that  
     | 
| 
       9 
     | 
    
         
            -
            #    
     | 
| 
       10 
     | 
    
         
            -
            #    
     | 
| 
       11 
     | 
    
         
            -
            #   and libre (LICENSE.txt contains the full text of the legally binding
         
     | 
| 
       12 
     | 
    
         
            -
            #   license).
         
     | 
| 
      
 5 
     | 
    
         
            +
            #   This file is part of the PositionRange Library. PositionRange is Free 
         
     | 
| 
      
 6 
     | 
    
         
            +
            #   Software. You can run/distribute/modify PositionRange under the terms 
         
     | 
| 
      
 7 
     | 
    
         
            +
            #   of the GNU Lesser General Public License version 3. This license
         
     | 
| 
      
 8 
     | 
    
         
            +
            #   states that you can use PositionRange in applications that are not Free 
         
     | 
| 
      
 9 
     | 
    
         
            +
            #   Software but PositionRange itself remains Free Software. (LICENSE contains 
         
     | 
| 
      
 10 
     | 
    
         
            +
            #   the full text of the legally binding license).
         
     | 
| 
       13 
11 
     | 
    
         
             
            #++#
         
     | 
| 
       14 
12 
     | 
    
         | 
| 
       15 
13 
     | 
    
         
             
            require File.dirname(__FILE__) + '/test_helper.rb'
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: positionrange
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.7.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors: 
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Wybo Wiersma
         
     | 
| 
         @@ -9,7 +9,7 @@ autorequire: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
            date:  
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2010-02-02 00:00:00 +00:00
         
     | 
| 
       13 
13 
     | 
    
         
             
            default_executable: 
         
     | 
| 
       14 
14 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
         @@ -27,14 +27,14 @@ files: 
     | 
|
| 
       27 
27 
     | 
    
         
             
            - README
         
     | 
| 
       28 
28 
     | 
    
         
             
            - CHANGELOG
         
     | 
| 
       29 
29 
     | 
    
         
             
            - LICENSE
         
     | 
| 
       30 
     | 
    
         
            -
            - lib/position_range.rb
         
     | 
| 
       31 
     | 
    
         
            -
            - lib/position_range/version.rb
         
     | 
| 
       32 
30 
     | 
    
         
             
            - lib/position_range/error.rb
         
     | 
| 
       33 
31 
     | 
    
         
             
            - lib/position_range/list.rb
         
     | 
| 
      
 32 
     | 
    
         
            +
            - lib/position_range/version.rb
         
     | 
| 
      
 33 
     | 
    
         
            +
            - lib/position_range.rb
         
     | 
| 
       34 
34 
     | 
    
         
             
            - lib/positionrange.rb
         
     | 
| 
      
 35 
     | 
    
         
            +
            - test/test_helper.rb
         
     | 
| 
       35 
36 
     | 
    
         
             
            - test/position_range_list_test.rb
         
     | 
| 
       36 
37 
     | 
    
         
             
            - test/position_range_test.rb
         
     | 
| 
       37 
     | 
    
         
            -
            - test/test_helper.rb
         
     | 
| 
       38 
38 
     | 
    
         
             
            has_rdoc: true
         
     | 
| 
       39 
39 
     | 
    
         
             
            homepage: http://positionrange.rubyforge.org
         
     | 
| 
       40 
40 
     | 
    
         
             
            licenses: []
         
     | 
| 
         @@ -59,7 +59,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       59 
59 
     | 
    
         
             
            requirements: 
         
     | 
| 
       60 
60 
     | 
    
         
             
            - none
         
     | 
| 
       61 
61 
     | 
    
         
             
            rubyforge_project: positionrange
         
     | 
| 
       62 
     | 
    
         
            -
            rubygems_version: 1.3. 
     | 
| 
      
 62 
     | 
    
         
            +
            rubygems_version: 1.3.5
         
     | 
| 
       63 
63 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       64 
64 
     | 
    
         
             
            specification_version: 3
         
     | 
| 
       65 
65 
     | 
    
         
             
            summary: Ranges with attributes that can be juggled.
         
     |