enotype 0.1.0 → 0.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: 49b45ee141f7108c88785143cbae350f76dee9dbb6d5dd1acbce7972bc3bbfe6
4
- data.tar.gz: 5e3f2de9a97da96a79757a56d2c3be830b3f3ccec01c7392fd437a4bf26fdad6
3
+ metadata.gz: 696aaec3692ebde4b659d55dfa9204c518c1ef79dbd1cb3e471b8adfefd3b2d3
4
+ data.tar.gz: 43ac82acba4c279448ce1772df426e7c5ea3171407491807d16255736e5401b6
5
5
  SHA512:
6
- metadata.gz: 8cc784fcf21d0d73ade3cd036288b953d40f32fe4a8394cbfb92f10610c052b10fa9ce2997d4237b97e9fec9cf09751bf0ace0464851dab3cd0a634bda24d362
7
- data.tar.gz: 57d00f2f5c740134ccfbea7b125ab0ea335795bb0d0b2f9b9e200f2bb60d34494abc11feda7c0caeedf9b23ba4dd37f47faf4e5487d11dd4ffa7ea54e6a2da08
6
+ metadata.gz: 98e65e3c1ab680317b0d7c2f6fe467a21fb3aa8511e247c8eec49527072e4a24969d7e2f21ff5db911f16e3f168f164cfdf4d8feece7358ab69ff125bed6927c
7
+ data.tar.gz: 5ee2dec7a1fd2c962006a3481e845521ad03fc4ca0a6a931ec849a5913fc2d7fb8474b5b532814967fda8dc15aa220ab829861e95e5461850f3ce26fcb799785
data/README.md CHANGED
@@ -1,14 +1,234 @@
1
1
  # enotype
2
2
 
3
- **A cross-language standard library for types.**
3
+ **A cross-language type library**
4
4
 
5
5
  ```ruby
6
6
  require 'enotype'
7
7
 
8
- Enotype::color('#fff') # returns '#fff'
9
- Enotype::color('#xyz') # raises 'A color is required, for instance '#B6D918', '#fff' or '#01b'.'
8
+ Enotype::color('#fff') # returns "#fff"
9
+ Enotype::color('#xyz') # raises "A color is required, for instance '#B6D918', '#fff' or '#01b'."
10
10
  ```
11
11
 
12
- enotype is a collection of minimalist pure functions that validate and convert type-unsafe `string` representations into type-safe, native types.
12
+ ```ruby
13
+ require 'enotype/es' # with localized error messages
14
+
15
+ Enotype::color('#xyz') # raises "Se requiere un color, por ejemplo '#B6D918', '#fff' o '#01b'."
16
+ ```
17
+
18
+ ## Installation
19
+
20
+ Either add it to your `Gemfile`:
21
+
22
+ ```ruby
23
+ gem 'enotype'
24
+ ```
25
+
26
+ Or install it manually:
27
+
28
+ ```
29
+ gem install enotype
30
+ ```
31
+
32
+ ## Features
33
+
34
+ - Validation and conversion of `string` representations into language-native types.
35
+ - Implemented as a collection of minimalist functions, so called *loaders*.
36
+ - Zero-cost localization (currently `de`, `en`, `es`) through statically generated code.
37
+ - Generically usable in a multitude of contexts through a plain and simple design.
38
+ - Standard type library for the [eno notation language](https://eno-lang.org).
39
+
40
+ ## Documentation
41
+
42
+ ### boolean
43
+
44
+ ```ruby
45
+ require 'enotype'
46
+
47
+ Enotype::boolean('true') # returns true
48
+ ```
49
+
50
+ `'true'` returns `true`.
51
+ `'false'` returns `false`.
52
+ `'yes'` returns `true`.
53
+ `'no'` returns `false`.
54
+ `'nope'` raises an exception.
55
+ ### color
56
+
57
+ ```ruby
58
+ require 'enotype'
59
+
60
+ Enotype::color('#abcdef') # returns '#abcdef'
61
+ ```
62
+
63
+ `'#abcdef'` returns `'#abcdef'`.
64
+ `'#ABCDEF'` returns `'#ABCDEF'`.
65
+ `'#012345'` returns `'#012345'`.
66
+ `'#678'` returns `'#678'`.
67
+ `'#89a'` returns `'#89a'`.
68
+ `'#ab'` raises an exception.
69
+ `'#abcd'` raises an exception.
70
+ `'#abcde'` raises an exception.
71
+ `'#bcdefg'` raises an exception.
72
+ `'blue'` raises an exception.
73
+ ### comma_separated
74
+
75
+ ```ruby
76
+ require 'enotype'
77
+
78
+ Enotype::comma_separated('one,two,three') # returns ['one', 'two', 'three']
79
+ ```
80
+
81
+ `'one,two,three'` returns `['one', 'two', 'three']`.
82
+ `' one,two,three '` returns `['one', 'two', 'three']`.
83
+ `'one , two , three'` returns `['one', 'two', 'three']`.
84
+ `' one , two , three '` returns `['one', 'two', 'three']`.
85
+ `',,'` returns `['', '', '']`.
86
+ `'one two three'` returns `['one two three']`.
87
+ `'one;two;three'` returns `['one;two;three']`.
88
+ `' '` returns `['']`.
89
+ ### date
90
+
91
+ ```ruby
92
+ require 'enotype'
93
+
94
+ Enotype::date('1992-02-02') # returns Time.utc(1992, 2, 2)
95
+ ```
96
+
97
+ `'1992-02-02'` returns `Time.utc(1992, 2, 2)`.
98
+ `'1990'` raises an exception.
99
+ `'1991-01'` raises an exception.
100
+ `'1993-03-03T1920+01:00'` raises an exception.
101
+ `'1994-04-04T1920:30+01:00'` raises an exception.
102
+ `'1995-05-05T1920:30.45+01:00'` raises an exception.
103
+ `'1996-06-06T0815:30-05:00'` raises an exception.
104
+ `'1997-07-07T1315:30Z'` raises an exception.
105
+ `'2002 12 14'` raises an exception.
106
+ `'2002-12-14 20:15'` raises an exception.
107
+ `'January'` raises an exception.
108
+ `'13:00'` raises an exception.
109
+ ### datetime
110
+
111
+ ```ruby
112
+ require 'enotype'
113
+
114
+ Enotype::datetime('1990') # returns Time.utc(1990, 1, 1)
115
+ ```
116
+
117
+ `'1990'` returns `Time.utc(1990, 1, 1)`.
118
+ `'1991-01'` returns `Time.utc(1991, 1, 1)`.
119
+ `'1992-02-02'` returns `Time.utc(1992, 2, 2)`.
120
+ `'1993-03-03T19:20+01:00'` returns `Time.utc(1993, 3, 3, 18, 20)`.
121
+ `'1994-04-04T19:20:30+01:00'` returns `Time.new(1994, 4, 4, 19, 20, 30, '+01:00')`.
122
+ `'1995-05-05T19:20:30.450+01:00'` returns `Time.new(1995, 5, 5, 19, 20, 30.450, '+01:00')`.
123
+ `'1996-06-06T08:15:30-05:00'` returns `Time.new(1996, 6, 6, 8, 15, 30, '-05:00')`.
124
+ `'1997-07-07T13:15:30Z'` returns `Time.utc(1997, 7, 7, 13, 15, 30)`.
125
+ `'2002 12 14'` raises an exception.
126
+ `'2002-12-14 20:15'` raises an exception.
127
+ `'January'` raises an exception.
128
+ `'13:00'` raises an exception.
129
+ ### email
130
+
131
+ ```ruby
132
+ require 'enotype'
133
+
134
+ Enotype::email('john.doe@eno-lang.org') # returns 'john.doe@eno-lang.org'
135
+ ```
136
+
137
+ `'john.doe@eno-lang.org'` returns `'john.doe@eno-lang.org'`.
138
+ `'john.doe@eno-lang'` raises an exception.
139
+ `'@eno-lang.org'` raises an exception.
140
+ `'john.doe@.org'` raises an exception.
141
+ ### float
142
+
143
+ ```ruby
144
+ require 'enotype'
145
+
146
+ Enotype::float('42') # returns 42.0
147
+ ```
148
+
149
+ `'42'` returns `42.0`.
150
+ `'-42'` returns `-42.0`.
151
+ `'42.0'` returns `42.0`.
152
+ `'42,0'` raises an exception.
153
+ `'4 2.0'` raises an exception.
154
+ `'fortytwo'` raises an exception.
155
+ ### integer
156
+
157
+ ```ruby
158
+ require 'enotype'
159
+
160
+ Enotype::integer('42') # returns 42
161
+ ```
162
+
163
+ `'42'` returns `42`.
164
+ `'-42'` returns `-42`.
165
+ `'42.0'` raises an exception.
166
+ `'42,0'` raises an exception.
167
+ `'4 2'` raises an exception.
168
+ `'fortytwo'` raises an exception.
169
+ ### json
170
+
171
+ ```ruby
172
+ require 'enotype'
173
+
174
+ Enotype::json('{ "valid": true }') # returns { 'valid' => true }
175
+ ```
176
+
177
+ `'{ "valid": true }'` returns `{ 'valid' => true }`.
178
+ `'42'` returns `42`.
179
+ `'["valid", true]'` returns `['valid', true]`.
180
+ `'invalid'` raises an exception.
181
+ `'{ invalid: true }'` raises an exception.
182
+ `'{ "invalid": true, }'` raises an exception.
183
+ ### lat_lng
184
+
185
+ ```ruby
186
+ require 'enotype'
187
+
188
+ Enotype::lat_lng('48.205870, 16.413690') # returns { lat: 48.205870, lng: 16.413690 }
189
+ ```
190
+
191
+ `'48.205870, 16.413690'` returns `{ lat: 48.205870, lng: 16.413690 }`.
192
+ `'41.25, -120.9762'` returns `{ lat: 41.25, lng: -120.9762 }`.
193
+ `'-31.96, 115.84'` returns `{ lat: -31.96, lng: 115.84 }`.
194
+ `'90, 0'` returns `{ lat: 90, lng: 0 }`.
195
+ `' 0 , 0 '` returns `{ lat: 0, lng: 0 }`.
196
+ `'-0,-0'` returns `{ lat: -0, lng: -0 }`.
197
+ `'1000,10'` raises an exception.
198
+ `'10,1000'` raises an exception.
199
+ `'48.205870,'` raises an exception.
200
+ `', 16.413690'` raises an exception.
201
+ `'48,205870, 16,413690'` raises an exception.
202
+ ### slug
203
+
204
+ ```ruby
205
+ require 'enotype'
206
+
207
+ Enotype::slug('eno-lang-article') # returns 'eno-lang-article'
208
+ ```
209
+
210
+ `'eno-lang-article'` returns `'eno-lang-article'`.
211
+ `'eno_lang_article'` returns `'eno_lang_article'`.
212
+ `'eno-lang-article!'` raises an exception.
213
+ `'%eno-lang-article'` raises an exception.
214
+ `'eno lang article'` raises an exception.
215
+ `'enö-läng-ärticle'` raises an exception.
216
+ `'énó-láng-ártíclé'` raises an exception.
217
+ ### url
218
+
219
+ ```ruby
220
+ require 'enotype'
221
+
222
+ Enotype::url('http://www.valid.com') # returns 'http://www.valid.com'
223
+ ```
13
224
 
14
- It is the standard type library for the [eno notation language](https://eno-lang.org) but can be utilized in a multitude of other contexts as well.
225
+ `'http://www.valid.com'` returns `'http://www.valid.com'`.
226
+ `'https://valid.com'` returns `'https://valid.com'`.
227
+ `'https://www.valid.com'` returns `'https://www.valid.com'`.
228
+ `'invalid'` raises an exception.
229
+ `'www.invalid'` raises an exception.
230
+ `'www.invalid.com'` raises an exception.
231
+ `'htp://www.invalid.com'` raises an exception.
232
+ `'http:/invalid.com'` raises an exception.
233
+ `'https//invalid.com'` raises an exception.
234
+ `'https://invalid'` raises an exception.
@@ -7,6 +7,7 @@ EMAIL_REGEXP = /^\s*[^@\s]+@[^@\s]+\.[^@\s]+\s*$/
7
7
  FLOAT_REGEXP = /^\s*-?\d+(\.\d+)?\s*$/
8
8
  INTEGER_REGEXP = /^\s*-?\d+\s*$/
9
9
  LAT_LNG_REGEXP = /^\s*(-?\d{1,3}(?:\.\d+)?)\s*,\s*(-?\d{1,3}(?:\.\d+)?)\s*$/
10
+ SLUG_REGEXP = /^[0-9a-z\-_]+$/
10
11
  URL_REGEXP = /^\s*https?:\/\/[^\s.]+\.\S+\s*$/
11
12
 
12
13
  module Enotype
@@ -95,6 +96,12 @@ module Enotype
95
96
  { lat: match[1].to_f, lng: match[2].to_f }
96
97
  end
97
98
 
99
+ def self.slug(value)
100
+ raise 'Ein Slug wie zum Beispiel \'blog_post\', \'eno-notation\' oder \'62-dinge\' ist erforderlich - nur die Zeichen a-z, 0-9, \'-\' und \'_\' sind erlaubt.' unless value.match(SLUG_REGEXP)
101
+
102
+ value
103
+ end
104
+
98
105
  def self.url(value)
99
106
  raise 'Eine valide URL ist erforderlich, zum Beispiel \'https://eno-lang.org\'.' unless value.match(URL_REGEXP)
100
107
 
@@ -7,6 +7,7 @@ EMAIL_REGEXP = /^\s*[^@\s]+@[^@\s]+\.[^@\s]+\s*$/
7
7
  FLOAT_REGEXP = /^\s*-?\d+(\.\d+)?\s*$/
8
8
  INTEGER_REGEXP = /^\s*-?\d+\s*$/
9
9
  LAT_LNG_REGEXP = /^\s*(-?\d{1,3}(?:\.\d+)?)\s*,\s*(-?\d{1,3}(?:\.\d+)?)\s*$/
10
+ SLUG_REGEXP = /^[0-9a-z\-_]+$/
10
11
  URL_REGEXP = /^\s*https?:\/\/[^\s.]+\.\S+\s*$/
11
12
 
12
13
  module Enotype
@@ -95,6 +96,12 @@ module Enotype
95
96
  { lat: match[1].to_f, lng: match[2].to_f }
96
97
  end
97
98
 
99
+ def self.slug(value)
100
+ raise 'A slug like for instance \'blog_post\', \'eno-notation\' or \'62-things\' is required - only the characters a-z, 0-9, \'-\' und \'_\' are allowed.' unless value.match(SLUG_REGEXP)
101
+
102
+ value
103
+ end
104
+
98
105
  def self.url(value)
99
106
  raise 'A valid URL is required, for instance \'https://eno-lang.org\'.' unless value.match(URL_REGEXP)
100
107
 
@@ -7,6 +7,7 @@ EMAIL_REGEXP = /^\s*[^@\s]+@[^@\s]+\.[^@\s]+\s*$/
7
7
  FLOAT_REGEXP = /^\s*-?\d+(\.\d+)?\s*$/
8
8
  INTEGER_REGEXP = /^\s*-?\d+\s*$/
9
9
  LAT_LNG_REGEXP = /^\s*(-?\d{1,3}(?:\.\d+)?)\s*,\s*(-?\d{1,3}(?:\.\d+)?)\s*$/
10
+ SLUG_REGEXP = /^[0-9a-z\-_]+$/
10
11
  URL_REGEXP = /^\s*https?:\/\/[^\s.]+\.\S+\s*$/
11
12
 
12
13
  module Enotype
@@ -95,6 +96,12 @@ module Enotype
95
96
  { lat: match[1].to_f, lng: match[2].to_f }
96
97
  end
97
98
 
99
+ def self.slug(value)
100
+ raise 'Se requiere un slug como por ejemplo \'blog_post\', \'eno-notacion\' o \'62-cosas\' - solo los caracteres a-z, 0-9, \'-\' und \'_\' son permitidos.' unless value.match(SLUG_REGEXP)
101
+
102
+ value
103
+ end
104
+
98
105
  def self.url(value)
99
106
  raise 'Se requiere un URL valido, por ejemplo \'https://eno-lang.org\'.' unless value.match(URL_REGEXP)
100
107
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enotype
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Repp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-21 00:00:00.000000000 Z
11
+ date: 2019-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -24,8 +24,8 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.8'
27
- description: enotype is a collection of minimalist pure functions that validate and
28
- convert type-unsafe string representations into type-safe, native types.
27
+ description: Validation and conversion of `string` representations into language-native
28
+ types
29
29
  email: simon@fdpl.io
30
30
  executables: []
31
31
  extensions: []
@@ -37,7 +37,7 @@ files:
37
37
  - lib/enotype/de.rb
38
38
  - lib/enotype/en.rb
39
39
  - lib/enotype/es.rb
40
- homepage: https://eno-lang.org/
40
+ homepage: https://eno-lang.org/enotype/
41
41
  licenses:
42
42
  - MIT
43
43
  metadata: {}
@@ -60,5 +60,5 @@ rubyforge_project:
60
60
  rubygems_version: 2.7.8
61
61
  signing_key:
62
62
  specification_version: 4
63
- summary: A cross-language standard library for types
63
+ summary: A cross-language type library
64
64
  test_files: []