range_compressor 1.0.0 → 1.2.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
2
  SHA256:
3
- metadata.gz: 83e62be00199f227f3dae78b086d5f63759205cfa19c5eeb255bf5787b33450b
4
- data.tar.gz: f62233009ec12d166fb2072897e8ecc95336ec6df6745facaa7b7cb530d9c2f7
3
+ metadata.gz: 31e9cdfc716d5a8d19654cd30d69540aaacb5f0b98372cf39de878d0a0b2f33e
4
+ data.tar.gz: b2b0d7803f967cccda9a729f40e825ff640c300edfbbb93a9824c6166c323750
5
5
  SHA512:
6
- metadata.gz: 4ca724e589d5827ce79c89556acf4b97d8984f65d8c417f66b227a64b82d5e8b1aa3e20d372818214146ef750d8f445ac731136d1cbc1862de7c3152b29af1a7
7
- data.tar.gz: 178feded786fb56dbcd52574a4dca4cae421ef96f37318d3c778206d83849aa9b1d221fb91750c466945eb05fe21342ad381322e3656a8b427a8831f7c11998e
6
+ metadata.gz: 508c545f44479bd9c3365385acfd92a26fcb77cea09bbe57145580e3e8bb603706cdd4907091ab1eeffc42f5c5de572cd8a7913aabac03e91dcfc90af52edd84
7
+ data.tar.gz: 3f829b5a3c82158c5b88534646be0327ef306270bd7e5687630aa1dd1760a28762bcb8d30cd417250f71678623f8e3964b5c6274aaaf1d3484fb1eb299eb3960
@@ -0,0 +1,22 @@
1
+ name: tests
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+
9
+ strategy:
10
+ matrix:
11
+ ruby: [ '2.4', '3.0', 'ruby-head' ]
12
+
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ - name: Set up Ruby ${{ matrix.ruby }}
16
+ uses: ruby/setup-ruby@v1
17
+ with:
18
+ ruby-version: ${{ matrix.ruby }}
19
+ - name: Install dependencies
20
+ run: bundle install --jobs 4
21
+ - name: Test with Rake
22
+ run: bundle exec rake
data/CHANGELOG.md ADDED
@@ -0,0 +1,31 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
+ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [1.2.0]
8
+
9
+ ### Added
10
+
11
+ - improved performance
12
+
13
+ ## [1.1.1]
14
+
15
+ ### Fixed
16
+
17
+ - fixed unnecessary double sorting when given RBTree instances as input
18
+
19
+ ## [1.1.0]
20
+
21
+ ### Added
22
+
23
+ - support for compressing lists of Ranges as well as mixed and nested inputs
24
+
25
+ ### Fixed
26
+
27
+ - fixed implicit dependency on `sorted_set` in Ruby >= 3.0 by no longer requiring `sorted_set`
28
+
29
+ ## [1.0.0]
30
+
31
+ Initial release.
data/Gemfile CHANGED
@@ -4,3 +4,10 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in range_compressor.gemspec
6
6
  gemspec
7
+
8
+ gem 'rake', '~> 13.0'
9
+ gem 'rspec', '~> 3.8'
10
+ # SortedSet was moved to a gem in Ruby 3.
11
+ if RUBY_VERSION.to_f >= 3.0 && !RUBY_PLATFORM[/java/i]
12
+ gem 'sorted_set', '~> 1.0'
13
+ end
data/README.md CHANGED
@@ -1,19 +1,16 @@
1
1
  # RangeCompressor
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/range_compressor.svg)](http://badge.fury.io/rb/range_compressor)
4
- [![Build Status](https://travis-ci.org/janosch-x/range_compressor.svg?branch=master)](https://travis-ci.org/janosch-x/range_compressor)
4
+ [![Build Status](https://github.com/jaynetics/range_compressor/workflows/tests/badge.svg)](https://github.com/jaynetics/range_compressor/actions)
5
5
 
6
- A micro-gem that turns this:
6
+ A micro-gem that compresses enumerables into Ranges.
7
7
 
8
- ```ruby
9
- [1, 2, 3, 4, 6, 8, 9, 10]
10
- ```
11
-
12
- into this:
13
-
14
- ```ruby
15
- [1..4, 6..6, 8..10]
16
- ```
8
+ | Input | Output |
9
+ |----------------------------|----------------------|
10
+ | [1, 2, 3, 4, 6, 8, 9, 10] | [1..4, 6..6, 8..10] |
11
+ | %w[a b c e f g h] | ['a'..'c', 'e'..'h'] |
12
+ | [1..5, 3..8] | [1..8] |
13
+ | [Set[1, 2], 3..6, [9, 10]] | [1..6, 9..10] |
17
14
 
18
15
  ## Installation
19
16
 
@@ -1,3 +1,3 @@
1
1
  module RangeCompressor
2
- VERSION = '1.0.0'
2
+ VERSION = '1.2.0'
3
3
  end
@@ -3,27 +3,16 @@ require 'range_compressor/version'
3
3
  module RangeCompressor
4
4
  module_function
5
5
 
6
- SORTED_SET_CLASSES = %w[
7
- CharacterSet
8
- CharacterSet::Pure
9
- ImmutableSet
10
- SortedSet
11
- ].freeze
12
-
13
- # Set#divide is very slow unfortunately, else it would be nice for this:
14
- # divide { |i, j| (i - j).abs == 1 }
15
- def compress(enum)
16
- if enum.class.ancestors.none? { |anc| SORTED_SET_CLASSES.include? anc.to_s }
17
- require 'set'
18
- enum = SortedSet.new(enum)
19
- end
6
+ def compress(arg)
7
+ # make contents flat, unique, and sorted
8
+ sorted_set = to_sorted_set(arg)
20
9
 
21
10
  ranges = []
22
11
  previous = nil
23
12
  current_start = nil
24
13
  current_end = nil
25
14
 
26
- enum.each do |object|
15
+ sorted_set.each do |object|
27
16
  if previous.nil?
28
17
  current_start = object
29
18
  elsif previous.next != object
@@ -40,4 +29,37 @@ module RangeCompressor
40
29
 
41
30
  ranges
42
31
  end
32
+
33
+ SORTED_SET_CLASSES = %w[
34
+ CharacterSet
35
+ CharacterSet::Pure
36
+ ImmutableSet
37
+ RBTree
38
+ SortedSet
39
+ ].freeze
40
+
41
+ def to_sorted_set(arg)
42
+ if arg.nil?
43
+ []
44
+ elsif (arg.class.ancestors.map(&:to_s) & SORTED_SET_CLASSES).any?
45
+ arg
46
+ elsif arg.respond_to?(:each)
47
+ hash = {}
48
+ flatten(arg, hash)
49
+ hash.keys.sort
50
+ else
51
+ raise(ArgumentError, 'value must be enumerable')
52
+ end
53
+ end
54
+
55
+ def flatten(arg, hash)
56
+ if arg.respond_to?(:each)
57
+ if arg.instance_of?(Range) && (arg.begin.nil? || arg.end.nil?)
58
+ raise ArgumentError, 'beginless and endless Ranges are not supported'
59
+ end
60
+ arg.each { |el| flatten(el, hash) }
61
+ else
62
+ hash[arg] = true
63
+ end
64
+ end
43
65
  end
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.email = ['janosch84@gmail.com']
10
10
 
11
11
  s.summary = 'Compresses Arrays of Objects to Arrays of Ranges.'
12
- s.homepage = 'https://github.com/janosch-x/range_compressor'
12
+ s.homepage = 'https://github.com/jaynetics/range_compressor'
13
13
  s.license = 'MIT'
14
14
 
15
15
  s.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -18,8 +18,4 @@ Gem::Specification.new do |s|
18
18
  s.require_paths = ['lib']
19
19
 
20
20
  s.required_ruby_version = '>= 1.9.3'
21
-
22
- s.add_development_dependency 'bundler', '~> 1.16'
23
- s.add_development_dependency 'rake', '~> 10.0'
24
- s.add_development_dependency 'rspec', '~> 3.0'
25
21
  end
metadata CHANGED
@@ -1,67 +1,26 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: range_compressor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janosch Müller
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-06 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.16'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.16'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '10.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '10.0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '3.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '3.0'
55
- description:
11
+ date: 2022-09-02 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
56
14
  email:
57
15
  - janosch84@gmail.com
58
16
  executables: []
59
17
  extensions: []
60
18
  extra_rdoc_files: []
61
19
  files:
20
+ - ".github/workflows/tests.yml"
62
21
  - ".gitignore"
63
22
  - ".rspec"
64
- - ".travis.yml"
23
+ - CHANGELOG.md
65
24
  - Gemfile
66
25
  - LICENSE.txt
67
26
  - README.md
@@ -71,11 +30,11 @@ files:
71
30
  - lib/range_compressor.rb
72
31
  - lib/range_compressor/version.rb
73
32
  - range_compressor.gemspec
74
- homepage: https://github.com/janosch-x/range_compressor
33
+ homepage: https://github.com/jaynetics/range_compressor
75
34
  licenses:
76
35
  - MIT
77
36
  metadata: {}
78
- post_install_message:
37
+ post_install_message:
79
38
  rdoc_options: []
80
39
  require_paths:
81
40
  - lib
@@ -90,9 +49,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
49
  - !ruby/object:Gem::Version
91
50
  version: '0'
92
51
  requirements: []
93
- rubyforge_project:
94
- rubygems_version: 2.7.6
95
- signing_key:
52
+ rubygems_version: 3.4.0.dev
53
+ signing_key:
96
54
  specification_version: 4
97
55
  summary: Compresses Arrays of Objects to Arrays of Ranges.
98
56
  test_files: []
data/.travis.yml DELETED
@@ -1,8 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.2
5
- - 2.6
6
- before_install:
7
- - gem update --system
8
- - gem install bundler