historical_dating 1.1.0 → 1.4.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: 61c2761f143332e112b83166ce6625fa43290563bf54c5f7e7657c13b2436a84
4
- data.tar.gz: 27a4cf50e18e236c2a4ef28c7c414dd157d564c832a58e45de851557a7240521
3
+ metadata.gz: 47c1a58ce160b759e2787853d78b7aa96428fe9e2f7076fdf96158a38664902f
4
+ data.tar.gz: 236c5fadd1663f7516fa09f5504d2fc5227c0290a8739814da2ebc7e0cf1dd36
5
5
  SHA512:
6
- metadata.gz: c924bc2b924f9618ac9f0cebe5c74a1af9c2aaa41223476a72294576e8fcda5c948aeabc3b44823b23cb7e413a6ad2efd2ea3229d2758e765481629eadb5d52b
7
- data.tar.gz: 89af9de4952185120151316468db777565f0c44d9081009627bc6d4e4f4a7dc450397432507a433a58fc7a20459db7a6e583cd2bb2e4036b6df12867efbcda57
6
+ metadata.gz: c9f810f66539567fa1cdc3f83e22106d533e94c6bb334d28ca884d1dcbf60e078835cd2a8b47f2490149cc7e4063cb76ff6f7d2078afdf13a4432f447a2300fb
7
+ data.tar.gz: 6b5ce82213a10cb258cad1062eccc431aeed3444679062b3584b08771351f467c12d65209344a4677c9380365eda9dca2ef8898c9b49742a045893ac99507a0a
@@ -1,48 +1,48 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- historical_dating (1.1.0)
4
+ historical_dating (1.4.0)
5
5
  activesupport (>= 3.0.0)
6
- parslet (~> 1.8)
6
+ parslet (~> 2.0.0)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activesupport (6.0.3.1)
11
+ activesupport (6.0.3.4)
12
12
  concurrent-ruby (~> 1.0, >= 1.0.2)
13
13
  i18n (>= 0.7, < 2)
14
14
  minitest (~> 5.1)
15
15
  tzinfo (~> 1.1)
16
16
  zeitwerk (~> 2.2, >= 2.2.2)
17
- coderay (1.1.2)
18
- concurrent-ruby (1.1.6)
19
- diff-lcs (1.3)
20
- i18n (1.8.2)
17
+ coderay (1.1.3)
18
+ concurrent-ruby (1.1.7)
19
+ diff-lcs (1.4.4)
20
+ i18n (1.8.5)
21
21
  concurrent-ruby (~> 1.0)
22
- method_source (0.9.2)
23
- minitest (5.13.0)
24
- parslet (1.8.2)
25
- pry (0.12.2)
26
- coderay (~> 1.1.0)
27
- method_source (~> 0.9.0)
22
+ method_source (1.0.0)
23
+ minitest (5.14.1)
24
+ parslet (2.0.0)
25
+ pry (0.13.1)
26
+ coderay (~> 1.1)
27
+ method_source (~> 1.0)
28
28
  rake (12.3.3)
29
29
  rspec (3.9.0)
30
30
  rspec-core (~> 3.9.0)
31
31
  rspec-expectations (~> 3.9.0)
32
32
  rspec-mocks (~> 3.9.0)
33
- rspec-core (3.9.1)
34
- rspec-support (~> 3.9.1)
35
- rspec-expectations (3.9.0)
33
+ rspec-core (3.9.2)
34
+ rspec-support (~> 3.9.3)
35
+ rspec-expectations (3.9.2)
36
36
  diff-lcs (>= 1.2.0, < 2.0)
37
37
  rspec-support (~> 3.9.0)
38
38
  rspec-mocks (3.9.1)
39
39
  diff-lcs (>= 1.2.0, < 2.0)
40
40
  rspec-support (~> 3.9.0)
41
- rspec-support (3.9.2)
41
+ rspec-support (3.9.3)
42
42
  thread_safe (0.3.6)
43
- tzinfo (1.2.7)
43
+ tzinfo (1.2.8)
44
44
  thread_safe (~> 0.1)
45
- zeitwerk (2.3.0)
45
+ zeitwerk (2.4.1)
46
46
 
47
47
  PLATFORMS
48
48
  ruby
data/README.md CHANGED
@@ -22,7 +22,7 @@ Or install it yourself as:
22
22
  ## Usage
23
23
 
24
24
  ~~~ruby
25
- hd = HistoryDating.parse("2. Jahrhundert nach Christus")
25
+ hd = HistoricalDating.parse("2. Jahrhundert nach Christus")
26
26
  hd.from
27
27
  # => #<Date: 0100-01-01 ((1757583j,0s,0n),+0s,2299161j)>
28
28
  hd.to
@@ -33,11 +33,10 @@ hd.julian_range
33
33
 
34
34
  ## Development
35
35
 
36
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
36
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rspec` to run the tests. In order to run a single test, execute: `bundle exec rspec <test-filename>:<test-line-number>`. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
37
37
 
38
38
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
39
39
 
40
40
  ## Contributing
41
41
 
42
42
  Bug reports and pull requests are welcome on GitHub at https://github.com/wendig-ou/historical_dating.
43
-
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
27
  spec.require_paths = ["lib"]
28
28
 
29
- spec.add_runtime_dependency 'parslet', '~> 1.8'
29
+ spec.add_runtime_dependency 'parslet', '~> 2.0.0'
30
30
  spec.add_runtime_dependency 'activesupport', '>= 3.0.0'
31
31
 
32
32
  spec.add_development_dependency 'rspec', '~> 3.9.0'
@@ -18,6 +18,7 @@ module HistoricalDating
18
18
 
19
19
  autoload :Api, 'historical_dating/api'
20
20
  autoload :Parser, 'historical_dating/parser'
21
+ autoload :PreTransform, 'historical_dating/pre_transform'
21
22
  autoload :Range, 'historical_dating/range'
22
23
  autoload :Transform, 'historical_dating/transform'
23
24
 
@@ -5,6 +5,7 @@ class HistoricalDating::Parser < Parslet::Parser
5
5
  rule(:natural_number){ match['1-9'] >> match['0-9'].repeat }
6
6
  rule(:positive_number){ zero | natural_number }
7
7
  rule(:minus){ match '-' }
8
+ rule(:whole_number_without_zero){ natural_number | minus >> natural_number }
8
9
  rule(:whole_number){ positive_number | minus >> natural_number }
9
10
  rule(:day){ match['1-2'] >> match['0-9'] | str('3') >> match['0-1'] | match['1-9'] | str('0') >> match['1-9'] }
10
11
  rule(:month){ str('1') >> match['0-2'] | match['1-9'] | str('0') >> match['1-9'] }
@@ -13,22 +14,43 @@ class HistoricalDating::Parser < Parslet::Parser
13
14
 
14
15
  rule(:space){ str(' ').repeat(1, nil) }
15
16
  rule(:christ){ str('Chr.') | str('Christus') }
16
- rule(:age){ str('v.') | str('vor') }
17
- rule(:bc){ age >> space >> christ }
18
- rule(:century_string){ str('Jahrhundert') | str('Jh.') }
17
+ rule(:age){ str('v.') | str('vor') | str('n.') | str('nach') }
18
+ rule(:acbc){ age >> space >> christ | str('BC') | str('AC') }
19
+ rule(:century_string){ str('Jahrhundert') | str('Jh.') | str('Jhd') }
19
20
  rule(:approx){ str('ca.') | str('um') | str('circa') }
20
21
  rule(:unknown){ str('?') }
21
- rule(:to){ space >> str('bis') >> space }
22
+ rule(:to){
23
+ ((space >> (str('bis') | str('-') | str('/')) >> space) |
24
+ str('-') |
25
+ str('/'))
26
+ }
22
27
  rule(:before){ str('vor') >> space }
23
28
  rule(:after){ str('nach') >> space }
24
29
  rule(:negate){ str('nicht') >> space }
25
- rule(:part){ str('Anfang') | str('Mitte') | str('Ende') | str('1. Hälfte') | str('2. Hälfte') | str('1. Drittel') | str('2. Drittel') | str('3. Drittel') | str('1. Viertel') | str('2. Viertel') | str('3. Viertel') | str('4. Viertel') }
30
+ rule(:part){
31
+ str('Anfang') |
32
+ str('Mitte') |
33
+ str('Ende') |
34
+ str('1. Hälfte') |
35
+ str('2. Hälfte') |
36
+ str('1. Drittel') |
37
+ str('2. Drittel') |
38
+ str('3. Drittel') |
39
+ str('1. Viertel') |
40
+ str('2. Viertel') |
41
+ str('3. Viertel') |
42
+ str('4. Viertel')
43
+ }
26
44
 
27
45
  # Dating
28
46
 
29
- rule(:century){ (approx >> space).maybe.as(:approx) >> positive_number.as(:num) >> str('.') >> space >> century_string.as(:cs) >> (space >> bc).maybe.as(:bc) }
30
- rule(:year){ (approx >> space).maybe.as(:approx) >> natural_number.as(:num) >> (space >> bc).maybe.as(:bc) }
31
- rule(:century_part){ part.as(:part) >> space >> positive_number.as(:num) >> str('.') >> space >> century_string.as(:cs) >> (space >> bc).maybe.as(:bc) }
47
+ rule(:century){
48
+ (approx >> space).maybe.as(:approx) >>
49
+ positive_number.as(:num) >> str('.').as(:cd) >>
50
+ (space >> century_string.as(:cs) >> (space >> acbc).maybe.as(:acbc)).maybe
51
+ }
52
+ rule(:year){ (approx >> space).maybe.as(:approx) >> whole_number_without_zero.as(:num) >> (space >> acbc).maybe.as(:acbc) }
53
+ rule(:century_part){ part.as(:part) >> space >> positive_number.as(:num) >> str('.') >> space >> century_string.as(:cs) >> (space >> acbc).maybe.as(:acbc) }
32
54
  rule(:european_date){ day.as(:day) >> str('.') >> month.as(:month) >> str('.') >> whole_number.as(:yearnum) }
33
55
  rule(:machine_date){ whole_number.as(:yearnum) >> (str('.') | str('-')) >> month.as(:month) >> (str('.') | str('-')) >> day.as(:day) }
34
56
  rule(:date){ european_date | machine_date }
@@ -36,14 +58,21 @@ class HistoricalDating::Parser < Parslet::Parser
36
58
  rule(:century_interval){ century.as(:from) >> to >> century.as(:to) }
37
59
  rule(:before_year){ negate.maybe.as(:not) >> before >> year.as(:date) }
38
60
  rule(:after_year){ negate.maybe.as(:not) >> after >> year.as(:date) }
39
- rule(:year_interval){ year.as(:from) >> to >> (year | unknown).as(:to) | (year | unknown).as(:from) >> to >> year.as(:to) }
61
+ rule(:year_interval){
62
+ year.as(:from) >> to >> (year | unknown).as(:to) |
63
+ (year | unknown).as(:from) >> to >> year.as(:to)
64
+ }
65
+ rule(:before_century){ before >> century.as(:century) }
66
+
40
67
  rule(:interval){
41
68
  before_year.as(:before_year) |
42
69
  after_year.as(:after_year) |
43
70
  date_interval.as(:date_interval) |
44
71
  century_interval.as(:century_interval) |
45
- year_interval.as(:year_interval)
72
+ year_interval.as(:year_interval) |
73
+ before_century.as(:before_century)
46
74
  }
75
+
47
76
  rule(:dating){
48
77
  interval.as(:interval) |
49
78
  century_part.as(:century_part) |
@@ -57,6 +86,8 @@ class HistoricalDating::Parser < Parslet::Parser
57
86
  # Transform
58
87
 
59
88
  def transform(input)
60
- HistoricalDating::Transform.new.apply(self.class.new.parse(input))
89
+ result = self.class.new.parse(input)
90
+ result = HistoricalDating::PreTransform.new.apply(result)
91
+ HistoricalDating::Transform.new.apply(result)
61
92
  end
62
93
  end
@@ -0,0 +1,42 @@
1
+ class HistoricalDating::PreTransform < Parslet::Transform
2
+ rule(from: subtree(:from), to: subtree(:to)) do
3
+ if to[:acbc] && (to[:acbc].match(/(vor|v.) (Chr.|Christus)/) || to[:acbc].match(/BC/))
4
+ from[:acbc] = to[:acbc]
5
+ end
6
+
7
+ if to[:num].to_s.size == 2 && to[:cs].nil?
8
+ # e.g.: 1890/91
9
+ to[:num] = (from[:num].to_i / 100).to_s + to[:num]
10
+ end
11
+
12
+ {from: from, to: to}
13
+ end
14
+
15
+ # detect century by :cd and add :cs
16
+ rule(num: simple(:num), approx: simple(:approx), acbc: simple(:acbc), cd: simple(:cd)) do |data|
17
+ data.delete :cd
18
+ data.merge(
19
+ cs: 'Jahrhundert'
20
+ )
21
+ end
22
+
23
+ # detect century by :cd and add :cs
24
+ rule(num: simple(:num), approx: simple(:approx), cd: simple(:cd)) do |data|
25
+ data.delete :cd
26
+ data.merge(
27
+ cs: 'Jahrhundert'
28
+ )
29
+ end
30
+
31
+ # remove :cd if :cs already present (with acbc)
32
+ rule(num: simple(:num), approx: simple(:approx), acbc: simple(:acbc), cd: simple(:cd), cs: simple(:cs)) do |data|
33
+ data.delete :cd
34
+ data
35
+ end
36
+
37
+ # remove :cd if :cs already present (no acbc)
38
+ rule(num: simple(:num), approx: simple(:approx), cd: simple(:cd), cs: simple(:cs)) do |data|
39
+ data.delete :cd
40
+ data
41
+ end
42
+ end
@@ -1,5 +1,5 @@
1
1
  class HistoricalDating::Transform < Parslet::Transform
2
- rule(:num => simple(:num), :part => simple(:part), :bc => simple(:bc), :cs => simple(:cs)) do
2
+ rule(:num => simple(:num), :part => simple(:part), :acbc => simple(:acbc), :cs => simple(:cs)) do
3
3
  modifier = case part
4
4
  when "Anfang" then [0, 75]
5
5
  when "Mitte" then [35, 35]
@@ -15,7 +15,7 @@ class HistoricalDating::Transform < Parslet::Transform
15
15
  when "4. Viertel" then [75, 0]
16
16
  end
17
17
 
18
- if bc.nil?
18
+ if acbc.nil? || acbc.match(/(nach|n.) (Chr.|Christus)/) || acbc.match(/AC/)
19
19
  {
20
20
  :from => Date.new((num.to_i - 1) * 100 + modifier.first, 1, 1),
21
21
  :to => Date.new((num.to_i - 1) * 100 + 99 - modifier.last, 12, 31)
@@ -28,8 +28,8 @@ class HistoricalDating::Transform < Parslet::Transform
28
28
  end
29
29
  end
30
30
 
31
- rule(:num => simple(:num), :approx => simple(:approx), :bc => simple(:bc), :cs => simple(:cs)) do
32
- result = if bc.nil?
31
+ rule(:num => simple(:num), :approx => simple(:approx), :acbc => simple(:acbc), :cs => simple(:cs)) do
32
+ result = if acbc.nil? || acbc.match(/(nach|n.) (Chr.|Christus)/) || acbc.match(/AC/)
33
33
  {
34
34
  :from => Date.new((num.to_i - 1) * 100, 1, 1),
35
35
  :to => Date.new((num.to_i - 1) * 100 + 99, 12, 31)
@@ -49,10 +49,10 @@ class HistoricalDating::Transform < Parslet::Transform
49
49
  result
50
50
  end
51
51
 
52
- rule(:num => simple(:num), :approx => simple(:approx), :bc => simple(:bc)) do
52
+ rule(:num => simple(:num), :approx => simple(:approx), :acbc => simple(:acbc)) do
53
53
  modifier = (approx ? 5 : 0)
54
54
 
55
- if bc.nil?
55
+ if acbc.nil? || acbc.match(/(nach|n.) (Chr.|Christus)/) || acbc.match(/AC/)
56
56
  {
57
57
  :from => Date.new(num.to_i - modifier, 1, 1),
58
58
  :to => Date.new(num.to_i + modifier, 12, 31)
@@ -84,8 +84,16 @@ class HistoricalDating::Transform < Parslet::Transform
84
84
  {:from => first_from, :to => last_to}
85
85
  end
86
86
 
87
+ rule(before_century: {from: simple(:from), to: simple(:to) }) do
88
+ {from: from - 100.years, to: to - 100.years}
89
+ end
90
+
87
91
  [:century, :date_interval, :year, :year_interval, :interval, :century_interval, :century_part].each do |key|
88
92
  rule(key => {:from => simple(:from), :to => simple(:to)}) do
93
+ if to < from
94
+ raise HistoricalDating::Error, 'from_later_than_to'
95
+ end
96
+
89
97
  {:from => from, :to => to}
90
98
  end
91
99
  end
@@ -1,3 +1,3 @@
1
1
  module HistoricalDating
2
- VERSION = "1.1.0"
2
+ VERSION = "1.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: historical_dating
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Moritz Schepp
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-03 00:00:00.000000000 Z
11
+ date: 2020-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.8'
19
+ version: 2.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.8'
26
+ version: 2.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -89,6 +89,7 @@ files:
89
89
  - lib/historical_dating.rb
90
90
  - lib/historical_dating/api.rb
91
91
  - lib/historical_dating/parser.rb
92
+ - lib/historical_dating/pre_transform.rb
92
93
  - lib/historical_dating/range.rb
93
94
  - lib/historical_dating/transform.rb
94
95
  - lib/historical_dating/version.rb