swedish-pin 1.1.0 → 2.0.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: 2c73538c495e9979b1e6c9e0522cf0f31e256b7b702b7d3ef90ac129652cd69f
4
- data.tar.gz: 21425a9f86ea45183ae7f980f9123f90bc057e211f2fbb6c2fff827e1069b194
3
+ metadata.gz: 8dd38e3a23539a5d2c44a2f47dca405748640377ff60f4f5f64359ccf78739b2
4
+ data.tar.gz: c03e1cd7d9d34ab5739a5e9e7647621138c3a7cb7e0ef8c9d12cd14d0ae28b57
5
5
  SHA512:
6
- metadata.gz: 85a480ae496c3dfada7d9c87527ea2a0b3d8cf5d1f1149971ac41a8efb563ba01bb4b8db52f438014d37f4fa523ca743eef72d275accac161d423d50f409f156
7
- data.tar.gz: d4183b7a8c578c4e18aa11b7617044f01789d67d1e85ce8d2449385246a443ebbb40f4e8e7905b347b31f1f8922d40208b6f511a2cc818d584aa15fe50d7f1db
6
+ metadata.gz: 8c44152a32e0f99508dd754ab975e7bf8bb28dc5029c6d37f0f193edf82c7b0a410807c00e9beee2a8377fd3acc295ee4a5b15453dc3f9783151c9d9d0fa9df2
7
+ data.tar.gz: 13f23fd9dac7c68c6dc2227a7ada375f4ed335d1caf3f42496cf947932054e39c5b0a71c5a1183b55d6a13160071aefe0a9c402ef5a91d7bdc96ca52d95ba803
@@ -0,0 +1,33 @@
1
+ # yaml-language-server: $schema=https://github.com/SchemaStore/schemastore/raw/master/src/schemas/json/github-workflow.json
2
+ name: CI
3
+
4
+ on: [push, pull_request]
5
+
6
+ jobs:
7
+ lint:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v3
11
+ - uses: ruby/setup-ruby@v1
12
+ with:
13
+ ruby-version: "2.7"
14
+ bundler-cache: true
15
+ - run: bundle exec standardrb --no-fix
16
+
17
+ tests:
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ os: [ubuntu-latest]
22
+ # Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
23
+ ruby: ["2.7", "3.0", "3.1", "3.2"]
24
+
25
+ runs-on: ${{ matrix.os }}
26
+
27
+ steps:
28
+ - uses: actions/checkout@v3
29
+ - uses: ruby/setup-ruby@v1
30
+ with:
31
+ ruby-version: ${{ matrix.ruby }}
32
+ bundler-cache: true
33
+ - run: rake
data/CHANGELOG.md CHANGED
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ Nothing yet.
11
+
12
+ ## [2.0.0] - 2023-01-11
13
+
14
+ ### Breaking changes
15
+
16
+ * Minimum supported Ruby version bumped from 2.5 to 2.7.
17
+
18
+ ### Fixed
19
+
20
+ * PINs with future birthdates are now parsed as long as they are for the
21
+ current year.
22
+ * **Example:** `20xyab-nnnn` used to be parsed as `1920` until `2020-xy-ab`,
23
+ but now it's parsed as `2020` from 2020-01-01 and onwards. This is more
24
+ correct, since all 1920s PINs should be written with a `+` after
25
+ 2020-01-01.
26
+ * Parsing of 10-digit PINs were improved so it is always consistent so
27
+ `parse(pin.to_s(10)) == pin`.
28
+
29
+ ### Removed
30
+
31
+ * Explicit installation of `rake` and `minitest` as development dependencies
32
+ removed. Now relying on the versions bundled with Ruby.
33
+
34
+ ### Other
35
+
36
+ * Travis CI setup changed into Github Actions.
37
+
10
38
  ## [1.1.0] - 2022-07-04
11
39
 
12
40
  ### Fixed
@@ -22,6 +50,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
22
50
 
23
51
  Initial release.
24
52
 
25
- [Unreleased]: https://github.com/Mange/swedish-pin-ruby/compare/v1.0.0...HEAD
26
53
  [1.0.0]: https://github.com/Mange/swedish-pin-ruby/releases/tag/v1.0.0
27
54
  [1.1.0]: https://github.com/Mange/swedish-pin-ruby/releases/tag/v1.1.0
55
+ [2.0.0]: https://github.com/Mange/swedish-pin-ruby/releases/tag/v2.0.0
56
+ [Unreleased]: https://github.com/Mange/swedish-pin-ruby/compare/v2.0.0...HEAD
data/Gemfile.lock CHANGED
@@ -1,45 +1,46 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- swedish-pin (1.1.0)
4
+ swedish-pin (2.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- ast (2.4.1)
10
- minitest (5.14.2)
11
- parallel (1.19.2)
12
- parser (2.7.1.4)
9
+ ast (2.4.2)
10
+ json (2.6.3)
11
+ language_server-protocol (3.17.0.2)
12
+ parallel (1.22.1)
13
+ parser (3.2.0.0)
13
14
  ast (~> 2.4.1)
14
- rainbow (3.0.0)
15
- rake (13.0.1)
16
- regexp_parser (1.7.1)
17
- rexml (3.2.4)
18
- rubocop (0.90.0)
15
+ rainbow (3.1.1)
16
+ regexp_parser (2.6.1)
17
+ rexml (3.2.5)
18
+ rubocop (1.42.0)
19
+ json (~> 2.3)
19
20
  parallel (~> 1.10)
20
- parser (>= 2.7.1.1)
21
+ parser (>= 3.1.2.1)
21
22
  rainbow (>= 2.2.2, < 4.0)
22
- regexp_parser (>= 1.7)
23
- rexml
24
- rubocop-ast (>= 0.3.0, < 1.0)
23
+ regexp_parser (>= 1.8, < 3.0)
24
+ rexml (>= 3.2.5, < 4.0)
25
+ rubocop-ast (>= 1.24.1, < 2.0)
25
26
  ruby-progressbar (~> 1.7)
26
- unicode-display_width (>= 1.4.0, < 2.0)
27
- rubocop-ast (0.3.0)
28
- parser (>= 2.7.1.4)
29
- rubocop-performance (1.8.0)
30
- rubocop (>= 0.87.0)
31
- ruby-progressbar (1.10.1)
32
- standard (0.6.0)
33
- rubocop (~> 0.90)
34
- rubocop-performance (~> 1.8.0)
35
- unicode-display_width (1.7.0)
27
+ unicode-display_width (>= 1.4.0, < 3.0)
28
+ rubocop-ast (1.24.1)
29
+ parser (>= 3.1.1.0)
30
+ rubocop-performance (1.15.2)
31
+ rubocop (>= 1.7.0, < 2.0)
32
+ rubocop-ast (>= 0.4.0)
33
+ ruby-progressbar (1.11.0)
34
+ standard (1.21.1)
35
+ language_server-protocol (~> 3.17.0.2)
36
+ rubocop (= 1.42.0)
37
+ rubocop-performance (= 1.15.2)
38
+ unicode-display_width (2.4.2)
36
39
 
37
40
  PLATFORMS
38
41
  ruby
39
42
 
40
43
  DEPENDENCIES
41
- minitest
42
- rake
43
44
  standard
44
45
  swedish-pin!
45
46
 
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2017-2020 - Personnummer, Magnus Bergmark and Contributors
3
+ Copyright (c) 2017-2022 - Personnummer, Magnus Bergmark and Contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # swedish-pin
2
2
 
3
- [![Build Status](https://secure.travis-ci.org/Mange/swedish-pin-ruby.png?branch=master)](http://travis-ci.org/Mange/swedish-pin-ruby) [![Inline docs](http://inch-ci.org/github/Mange/swedish-pin-ruby.svg?branch=master)](http://inch-ci.org/github/Mange/swedish-pin-ruby)
3
+ [![Inline docs](http://inch-ci.org/github/Mange/swedish-pin-ruby.svg?branch=master)](http://inch-ci.org/github/Mange/swedish-pin-ruby)
4
4
 
5
5
  Validate, parse, and generate [Swedish Personal Identity
6
6
  Numbers](https://en.wikipedia.org/wiki/Personal_identity_number_(Sweden))
data/bin/standardrb ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'standardrb' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("standard", "standardrb")
@@ -8,37 +8,37 @@ module SwedishPIN
8
8
  #
9
9
  # Generator for PINs.
10
10
  class Generator
11
- # The date all generated PINs will be based on.
12
- attr_reader :date
13
-
14
11
  # Creates a new generator for a particular date.
15
- def initialize(date)
16
- @date = date || random_date
12
+ def initialize(random: Random)
13
+ @random = random
17
14
  end
18
15
 
19
16
  # Generate a {Personnummer} with the given sequence number.
20
- def generate(sequence_number)
17
+ def generate(date: random_date, sequence_number: random_sequence_number)
18
+ # Handle someone explicitly passing `nil`.
19
+ date ||= random_date
21
20
  sequence_number ||= random_sequence_number
21
+
22
22
  Personnummer.new(
23
23
  year: date.year,
24
24
  month: date.month,
25
25
  day: date.day,
26
26
  sequence_number: sequence_number,
27
- control_digit: control_digit(sequence_number)
27
+ control_digit: control_digit(date, sequence_number)
28
28
  )
29
29
  end
30
30
 
31
31
  private
32
32
 
33
33
  def random_date
34
- Date.today - Random.rand(0..(110 * 365))
34
+ Date.today - @random.rand(0..(110 * 365))
35
35
  end
36
36
 
37
37
  def random_sequence_number
38
- Random.rand(0..999)
38
+ @random.rand(0..999)
39
39
  end
40
40
 
41
- def control_digit(sequence_number)
41
+ def control_digit(date, sequence_number)
42
42
  padded = ("%03d" % sequence_number)
43
43
  SwedishPIN.luhn("#{date.strftime("%y%m%d")}#{padded}")
44
44
  end
@@ -17,7 +17,7 @@ module SwedishPIN
17
17
  (?<sequence_number>\d{3})
18
18
  (?<control_digit>\d)
19
19
  \z
20
- /x.freeze
20
+ /x
21
21
  private_constant :MATCHER
22
22
 
23
23
  # Setup a new parser.
@@ -105,19 +105,30 @@ module SwedishPIN
105
105
  end
106
106
 
107
107
  def guess_century
108
- guessed_year = (now.year / 100) * 100 + year
109
-
110
- # Don't guess future dates; skip back a century when that happens.
111
- if Time.new(guessed_year, month, real_day) > now
112
- guessed_year -= 100
108
+ century = now.year / 100
109
+
110
+ # Century could take up to three different values, depending on
111
+ # combination of "future" dates and `+` separators.
112
+ #
113
+ # For example, on year 2010:
114
+ # 100101-nnnn => 2010-01-01
115
+ # 110101-nnnn => 1911-01-01 (because 2011 has not happened yet)
116
+ # 110101+nnnn => 1811-01-01 (1911 - 100 years)
117
+ # 090101+nnnn => 1909-01-01 (2009 - 100 years)
118
+ #
119
+ # One step comes from using the `+` separator, which means "remove
120
+ # another 100 years", despite what the rest of the date seems to imply.
121
+
122
+ # Assume previous century on future years
123
+ if (century * 100) + year > now.year
124
+ century -= 1
113
125
  end
114
126
 
115
- # The "+" separator means another century back.
116
127
  if @matches["separator"] == "+"
117
- guessed_year -= 100
128
+ century -= 1
118
129
  end
119
130
 
120
- guessed_year / 100
131
+ century
121
132
  end
122
133
 
123
134
  def validate_match
@@ -44,7 +44,7 @@ module SwedishPIN
44
44
  @year = year
45
45
  @month = month
46
46
  @coordination_number = day > 60
47
- @day = (day > 60 ? day - 60 : day)
47
+ @day = ((day > 60) ? day - 60 : day)
48
48
  @sequence_number = sequence_number
49
49
  @control_digit = control_digit
50
50
  end
@@ -201,6 +201,8 @@ module SwedishPIN
201
201
  private
202
202
 
203
203
  def short_separator(now)
204
+ # Turn into `+` on the same year as the PINs 100th birthday, even before
205
+ # the actual date.
204
206
  if year <= (now.year - 100)
205
207
  "+"
206
208
  else
@@ -2,5 +2,5 @@
2
2
 
3
3
  module SwedishPIN
4
4
  # The version number of this library.
5
- VERSION = "1.1.0"
5
+ VERSION = "2.0.0"
6
6
  end
data/lib/swedish_pin.rb CHANGED
@@ -81,7 +81,7 @@ module SwedishPIN
81
81
  # @param [Date, Time, nil] birthday The birthday of the person the PIN identifies, or +nil+ for a random date in the past.
82
82
  # @param [String, Integer, nil] sequence_number The sequence number that correspond to the three digits after the birthday, or +nil+ to pick a random one.
83
83
  def self.generate(birthday = nil, sequence_number = nil)
84
- Generator.new(birthday).generate(sequence_number)
84
+ Generator.new.generate(date: birthday, sequence_number: sequence_number)
85
85
  end
86
86
 
87
87
  # @api private
data/personnummer.gemspec CHANGED
@@ -3,7 +3,7 @@ require_relative "lib/swedish_pin/version"
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "swedish-pin"
5
5
  s.version = SwedishPIN::VERSION
6
- s.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
6
+ s.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
7
7
 
8
8
  s.license = "MIT"
9
9
  s.summary = "Work with Swedish PINs (Personnummer)"
@@ -22,7 +22,5 @@ Gem::Specification.new do |s|
22
22
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  s.require_paths = ["lib"]
24
24
 
25
- s.add_development_dependency "rake"
26
- s.add_development_dependency "minitest"
27
25
  s.add_development_dependency "standard"
28
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swedish-pin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Magnus Bergmark
@@ -10,36 +10,8 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2022-07-04 00:00:00.000000000 Z
13
+ date: 2023-01-11 00:00:00.000000000 Z
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: rake
17
- requirement: !ruby/object:Gem::Requirement
18
- requirements:
19
- - - ">="
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :development
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- version: '0'
29
- - !ruby/object:Gem::Dependency
30
- name: minitest
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: '0'
36
- type: :development
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: '0'
43
15
  - !ruby/object:Gem::Dependency
44
16
  name: standard
45
17
  requirement: !ruby/object:Gem::Requirement
@@ -64,15 +36,16 @@ executables: []
64
36
  extensions: []
65
37
  extra_rdoc_files: []
66
38
  files:
39
+ - ".github/workflows/ci.yml"
67
40
  - ".gitignore"
68
41
  - ".solargraph.yml"
69
- - ".travis.yml"
70
42
  - CHANGELOG.md
71
43
  - Gemfile
72
44
  - Gemfile.lock
73
45
  - LICENSE
74
46
  - README.md
75
47
  - Rakefile
48
+ - bin/standardrb
76
49
  - lib/swedish-pin.rb
77
50
  - lib/swedish_pin.rb
78
51
  - lib/swedish_pin/errors.rb
@@ -93,14 +66,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
93
66
  requirements:
94
67
  - - ">="
95
68
  - !ruby/object:Gem::Version
96
- version: 2.5.0
69
+ version: 2.7.0
97
70
  required_rubygems_version: !ruby/object:Gem::Requirement
98
71
  requirements:
99
72
  - - ">="
100
73
  - !ruby/object:Gem::Version
101
74
  version: '0'
102
75
  requirements: []
103
- rubygems_version: 3.2.22
76
+ rubygems_version: 3.3.7
104
77
  signing_key:
105
78
  specification_version: 4
106
79
  summary: Work with Swedish PINs (Personnummer)
data/.travis.yml DELETED
@@ -1,8 +0,0 @@
1
- language: ruby
2
- before_script:
3
- bundle install
4
- rvm:
5
- - 2.5
6
- - 2.6
7
- - 2.7
8
- sudo: false