dolos 0.1.1 → 0.1.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 +4 -4
- data/README.md +26 -7
- data/lib/dolos/version.rb +1 -1
- data/lib/dolos.rb +5 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68d26c878ffd86122b9c12273645cf351f5b20d6e1306e140c53727c29e49b2b
|
4
|
+
data.tar.gz: 6bda399416128f5692e2966a46194591209f61602408e6873cb4e41f37a22ec4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ae6b3a4750cc5bfb5f54a84d518f8d4176eaf10dfef4482f45aaadc3db422a14f04cabb65ee0e1fe85b7dfb95fa1b54c8daf4f91083f4f39beac32c70c25616
|
7
|
+
data.tar.gz: e4ab436619a690d257fdaba829fcbc00ec74c56cd8fda0c754fd5f1985fe2d3b21adcda1db69f7ca116437ccf8cf9c6455f03cb05ab44b8107033db590266398
|
data/README.md
CHANGED
@@ -11,15 +11,24 @@
|
|
11
11
|
It does not use exceptions and instead returns a result object.
|
12
12
|
Library is composable and concise.
|
13
13
|
|
14
|
+
### Getting started
|
15
|
+
|
16
|
+
#### Installation
|
17
|
+
- Update Gemfile with `gem 'dolos'`
|
18
|
+
- Run bundle install
|
19
|
+
|
20
|
+
#### Usage
|
14
21
|
```ruby
|
22
|
+
require 'dolos'
|
15
23
|
include Dolos
|
16
24
|
|
25
|
+
ws = c(" ")
|
17
26
|
parser = c("Parsers") >> ws >> c("are") >> ws >> c("great!")
|
18
|
-
parser.
|
27
|
+
parser.run("Parsers are great!") # <Result::Success>
|
19
28
|
|
20
29
|
greeter = c("Hello")
|
21
30
|
greet_and_speak = greeter >> c(", ") >> parser
|
22
|
-
greet_and_speak.
|
31
|
+
greet_and_speak.run("Hello, Parsers are great!") # <Result::Success>
|
23
32
|
```
|
24
33
|
|
25
34
|
### Letter address parser example
|
@@ -30,12 +39,14 @@ require 'dolos_common_parsers/common_parsers'
|
|
30
39
|
include Dolos
|
31
40
|
|
32
41
|
# Include common parsers
|
33
|
-
# In future this can be more structured,
|
42
|
+
# In future this can be more structured,
|
43
|
+
# moved them to separate module to prevent breaking changes
|
34
44
|
include Dolos::CommonParsers
|
35
45
|
|
36
46
|
# Library usage example
|
37
47
|
# Parse out a name and address from a letter
|
38
|
-
# For higher difficulty, we will not split this into multiple lines,
|
48
|
+
# For higher difficulty, we will not split this into multiple lines,
|
49
|
+
# but instead parse it all at once
|
39
50
|
letter = <<-LETTER
|
40
51
|
Mr. Vardeniui Pavardeniui
|
41
52
|
AB „Lietuvos Paštas“
|
@@ -77,21 +88,29 @@ second_line = ws.rep0 >> company_info >> eol
|
|
77
88
|
# After that result is captured and mapped to hash
|
78
89
|
# Mapping to hash so at the end its easy to tell tuples apart
|
79
90
|
# Also while mapping, doing some cleaning with '.strip'
|
80
|
-
street_name = char_while(->(char) { !char.match(/\d/) })
|
91
|
+
street_name = char_while(->(char) { !char.match(/\d/) })
|
92
|
+
.capture!
|
93
|
+
.map(&:first)
|
94
|
+
.map { |s| { street: s.strip } }
|
81
95
|
building = digits.capture!.map(&:first).map { |s| { building: s.strip } }
|
82
96
|
address_line = ws.rep0 >> street_name >> building >> eol
|
83
97
|
|
84
98
|
# City line
|
85
|
-
# All digits can be matched here or 'digits.rep(5)' could be used.
|
99
|
+
# All digits can be matched here or 'digits.rep(5)' could be used.
|
100
|
+
# Also joining with map results.
|
86
101
|
postcode = digits.capture!.map(&:join).map { |s| { postcode: s.strip } }
|
87
102
|
city = alpha_with_lt.rep.capture!.map(&:join).map { |s| { city: s.strip } }
|
88
103
|
city_line = ws.rep0 >> postcode >> ws >> city >> eol
|
89
104
|
|
90
|
-
# Full letter parser which is combined from all previous parsers.
|
105
|
+
# Full letter parser which is combined from all previous parsers.
|
106
|
+
# Also, all previous parsers can be ran separately.
|
91
107
|
letter_parser = name_line >> second_line >> address_line >> city_line
|
92
108
|
result = letter_parser.run(letter)
|
93
109
|
|
110
|
+
# List of tuples
|
94
111
|
pp result.captures
|
112
|
+
# ["Vardeniui", "Pavardeniui", "Lietuvos Paštas", {:street=>"Totorių g."},
|
113
|
+
# {:building=>"8"}, {:postcode=>"01121"}, {:city=>"Vilnius"}]
|
95
114
|
|
96
115
|
```
|
97
116
|
|
data/lib/dolos/version.rb
CHANGED
data/lib/dolos.rb
CHANGED
@@ -109,7 +109,8 @@ module Dolos
|
|
109
109
|
# repeat(n_min: 2) # 2 or more
|
110
110
|
def repeat(n_min:, n_max: Float::INFINITY)
|
111
111
|
Parser.new do |state|
|
112
|
-
|
112
|
+
values = []
|
113
|
+
captures = []
|
113
114
|
count = 0
|
114
115
|
|
115
116
|
while count < n_max
|
@@ -117,7 +118,8 @@ module Dolos
|
|
117
118
|
|
118
119
|
break if result.failure?
|
119
120
|
|
120
|
-
|
121
|
+
values << result.value
|
122
|
+
captures.concat(result.captures)
|
121
123
|
state.input.advance(result.length)
|
122
124
|
count += 1
|
123
125
|
end
|
@@ -125,7 +127,7 @@ module Dolos
|
|
125
127
|
if count < n_min
|
126
128
|
Failure.new("Expected parser to match at least #{n_min} times but matched only #{count} times", false)
|
127
129
|
else
|
128
|
-
Success.new(
|
130
|
+
Success.new(values, 0, captures)
|
129
131
|
end
|
130
132
|
end
|
131
133
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dolos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- benetis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-16 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Parser combinators library for Ruby. In active development, not stable
|
14
14
|
yet.
|