unnatural 0.3.1 → 0.3.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 68ba2d1865588727050d496fb3b7a31ae0126504
4
- data.tar.gz: 41df26e3c57b30782f1345df7d6b99c5cd1b0ab0
2
+ SHA256:
3
+ metadata.gz: b3edc05b3b279add39a0b54112548568dc9a1ff96d77936737f57978912636ee
4
+ data.tar.gz: ce84b14bb28120e5806a1f370c05575ec949785fcaf3f80ffbe605d813021d3a
5
5
  SHA512:
6
- metadata.gz: 49584ebd21ac6054f4b6b04ebd8012116bebc94bdee2b2205fc2e8e0ed4f2bba1a04d901775fa35c5280fa37166da6b5a47b88454bf249ad00c2b2680983b35a
7
- data.tar.gz: 0fd83bc665b23760335b9da7894d13a29289bd27df96c4f05aefac0f6e762873b27f44d07d293e1d3fc40ccade012071dfe9c07b4d732bbd14b2c27e4a8f45f4
6
+ metadata.gz: 02c2352f379dca9e31acfe4b9f8194d47de3571bf72ad69f60a87f12b6fdc3ea16152fff533282e386235e8a88e4c1c01c06b685301dd77c7439a081b53477b0
7
+ data.tar.gz: 4ce0601e48bf2854be2c08e554258e5fca14b6ecc167a6f3da8c0dde6adde410ff8e4dd9c1e352ef1941939862f01c4f19b5b84b664329003e9234427d2de401
@@ -0,0 +1,13 @@
1
+ Naming/UncommunicativeMethodParamName:
2
+ AllowedNames:
3
+ - a
4
+ - b
5
+
6
+ Style/ExpandPathArguments:
7
+ Enabled: false
8
+
9
+ Style/NumericPredicate:
10
+ EnforcedStyle: comparison
11
+
12
+ Style/SymbolArray:
13
+ EnforcedStyle: brackets
@@ -4,8 +4,9 @@ rvm:
4
4
  - 2.1.10
5
5
  - 2.2.5
6
6
  - 2.3.1
7
- - jruby-1.7.20
7
+ - jruby-1.7.27
8
8
  - jruby-9.0.5.0
9
+ - jruby-9.1.16.0
9
10
  before_install:
10
11
  - gem install bundler
11
12
  cache:
@@ -1,5 +1,6 @@
1
1
  require 'unnatural/version'
2
2
 
3
+ # A natural sort.
3
4
  module Unnatural
4
5
  def self.algorithms
5
6
  [:Substitution, :Split, :Scan, :Fast]
@@ -20,7 +21,7 @@ module Unnatural
20
21
  end
21
22
 
22
23
  def self.sort_by(enumerable)
23
- raise ArgumentError, "Block expected but none given" unless block_given?
24
+ raise ArgumentError, 'Block expected but none given' unless block_given?
24
25
  @algorithm.sort_by(enumerable) { |*a| yield(*a) }
25
26
  end
26
27
 
@@ -2,7 +2,11 @@ require 'ffi'
2
2
  require 'ffi-compiler/loader'
3
3
 
4
4
  module Unnatural
5
+ # Compares strings byte-by-byte. Comparison function implemented in C. Does
6
+ # not appear to sort unicode strings correctly. Much faster than any of the
7
+ # pure Ruby options. The default.
5
8
  module Fast
9
+ # module to hold the C function
6
10
  module Ext
7
11
  extend FFI::Library
8
12
  ffi_lib FFI::Compiler::Loader.find('unnatural_ext')
@@ -1,19 +1,27 @@
1
1
  require 'strscan'
2
2
 
3
3
  module Unnatural
4
+ # Compares strings using a `StringScanner`. Pure ruby. Tends to be
5
+ # outperformed by `Unnatural::Substitution` and `Unnatural::Split` when
6
+ # sorting short strings via the global sort function, but its comparison
7
+ # function is the fastest of the pure-ruby algorithms.
4
8
  module Scan
5
9
  def self.sort(enumerable)
6
10
  enumerable.sort { |a, b| compare(a, b) }
7
11
  end
8
12
 
9
13
  def self.sort_by(enumerable)
10
- raise ArgumentError, "Block expected but none given" unless block_given?
14
+ raise ArgumentError, 'Block expected but none given' unless block_given?
11
15
  enumerable
12
16
  .map { |e| [(yield e), e] }
13
17
  .sort { |a, b| compare(a, b) }
14
18
  .map { |ary| ary[1] }
15
19
  end
16
20
 
21
+ # rubocop: disable Metrics/AbcSize
22
+ # rubocop: disable Metrics/CyclomaticComplexity
23
+ # rubocop: disable Metrics/MethodLength
24
+ # rubocop: disable Metrics/PerceivedComplexity
17
25
  def self.compare(a_string, b_string)
18
26
  if a_string.is_a?(Array) && b_string.is_a?(Array)
19
27
  a_string = a_string.first
@@ -57,5 +65,9 @@ module Unnatural
57
65
  return +1 if b.eos?
58
66
  end
59
67
  end
68
+ # rubocop: enable Metrics/AbcSize
69
+ # rubocop: enable Metrics/CyclomaticComplexity
70
+ # rubocop: enable Metrics/MethodLength
71
+ # rubocop: enable Metrics/PerceivedComplexity
60
72
  end
61
73
  end
@@ -1,4 +1,6 @@
1
1
  module Unnatural
2
+ # Compares strings by spliting them into arrays of alternating string and
3
+ # integer values. Pure Ruby. Tends to be outperformed by the others.
2
4
  module Split
3
5
  SPLITTER = /(?<=\d)(?=\D)|(?<=\D)(?=\d)/
4
6
  PRED = ['0'.ord.pred.chr].freeze
@@ -8,7 +10,7 @@ module Unnatural
8
10
  end
9
11
 
10
12
  def self.sort_by(enumerable)
11
- raise ArgumentError, "Block expected but none given" unless block_given?
13
+ raise ArgumentError, 'Block expected but none given' unless block_given?
12
14
  enumerable.sort_by { |s| split(yield s) }
13
15
  end
14
16
 
@@ -1,4 +1,7 @@
1
1
  module Unnatural
2
+ # Compares strings by zero-padding integer sequences such that all are the
3
+ # same length. Pure Ruby. Tends to be outperformed by `Unnatural::Scan` on
4
+ # longer strings. Recommended for sorting short unicode strings.
2
5
  module Substitution
3
6
  def self.sort(enumerable)
4
7
  largest = enumerable.map(&:size).max
@@ -6,7 +9,7 @@ module Unnatural
6
9
  end
7
10
 
8
11
  def self.sort_by(enumerable)
9
- raise ArgumentError, "Block expected but none given" unless block_given?
12
+ raise ArgumentError, 'Block expected but none given' unless block_given?
10
13
  largest = enumerable.map { |e| yield e }.map(&:size).max
11
14
  enumerable.sort_by { |s| substitute((yield s), largest) }
12
15
  end
@@ -1,3 +1,3 @@
1
1
  module Unnatural
2
- VERSION = '0.3.1'.freeze
2
+ VERSION = '0.3.2'.freeze
3
3
  end
@@ -1,4 +1,4 @@
1
- # coding: utf-8
1
+
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'unnatural/version'
@@ -10,11 +10,12 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ['bjmllr@gmail.com']
11
11
 
12
12
  spec.summary = 'A natural sort.'
13
- spec.description = 'A natural sort implementation with an emphasis on speed.'
13
+ spec.description = 'A natural sort implementation with an emphasis on speed.'
14
14
  spec.homepage = 'https://github.com/bjmllr/unnatural'
15
15
  spec.license = 'MIT'
16
16
 
17
- spec.files = `git ls-files -z`.split("\x0")
17
+ spec.files = `git ls-files -z`
18
+ .split("\x0")
18
19
  .reject { |f| f.match(%r{^(test|spec|features)/}) }
19
20
  spec.files += Dir.glob('ext/unnatural/*')
20
21
  spec.require_paths = ['lib']
@@ -22,9 +23,8 @@ Gem::Specification.new do |spec|
22
23
  spec.extensions = ['ext/unnatural/Rakefile']
23
24
 
24
25
  spec.add_dependency 'ffi-compiler', '~> 1.0'
25
- spec.add_dependency 'rake', '>= 9', '< 12'
26
26
 
27
+ spec.add_development_dependency 'benchmark-ips'
27
28
  spec.add_development_dependency 'bundler', '~> 1.12'
28
29
  spec.add_development_dependency 'minitest', '~> 5.0'
29
- spec.add_development_dependency 'benchmark-ips'
30
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unnatural
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Miller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-27 00:00:00.000000000 Z
11
+ date: 2018-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi-compiler
@@ -25,25 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: benchmark-ips
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '9'
34
- - - "<"
35
- - !ruby/object:Gem::Version
36
- version: '12'
37
- type: :runtime
33
+ version: '0'
34
+ type: :development
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
38
  - - ">="
42
39
  - !ruby/object:Gem::Version
43
- version: '9'
44
- - - "<"
45
- - !ruby/object:Gem::Version
46
- version: '12'
40
+ version: '0'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: bundler
49
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,20 +66,6 @@ dependencies:
72
66
  - - "~>"
73
67
  - !ruby/object:Gem::Version
74
68
  version: '5.0'
75
- - !ruby/object:Gem::Dependency
76
- name: benchmark-ips
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: '0'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
69
  description: A natural sort implementation with an emphasis on speed.
90
70
  email:
91
71
  - bjmllr@gmail.com
@@ -95,6 +75,7 @@ extensions:
95
75
  extra_rdoc_files: []
96
76
  files:
97
77
  - ".gitignore"
78
+ - ".rubocop.yml"
98
79
  - ".travis.yml"
99
80
  - CODE_OF_CONDUCT.md
100
81
  - Gemfile
@@ -132,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
113
  version: '0'
133
114
  requirements: []
134
115
  rubyforge_project:
135
- rubygems_version: 2.5.1
116
+ rubygems_version: 2.7.3
136
117
  signing_key:
137
118
  specification_version: 4
138
119
  summary: A natural sort.