edn2023 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.travis.yml +7 -0
- data/CHANGELOG.md +29 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +268 -0
- data/Rakefile +12 -0
- data/edn2023.gemspec +22 -0
- data/lib/edn/char_stream.rb +84 -0
- data/lib/edn/core_ext.rb +112 -0
- data/lib/edn/metadata.rb +27 -0
- data/lib/edn/parser.rb +92 -0
- data/lib/edn/reader.rb +23 -0
- data/lib/edn/ruby_edn_parser.rb +266 -0
- data/lib/edn/type/list.rb +13 -0
- data/lib/edn/type/symbol.rb +39 -0
- data/lib/edn/type/unknown.rb +9 -0
- data/lib/edn/type/uuid.rb +9 -0
- data/lib/edn/types.rb +3 -0
- data/lib/edn/version.rb +3 -0
- data/lib/edn.rb +80 -0
- data/spec/edn/char_stream_spec.rb +111 -0
- data/spec/edn/metadata_spec.rb +38 -0
- data/spec/edn/parser_spec.rb +162 -0
- data/spec/edn/reader_spec.rb +23 -0
- data/spec/edn_spec.rb +114 -0
- data/spec/exemplars/big_decimal.edn +1 -0
- data/spec/exemplars/big_decimal.rb +1 -0
- data/spec/exemplars/big_int.edn +1 -0
- data/spec/exemplars/big_int.rb +1 -0
- data/spec/exemplars/char.edn +1 -0
- data/spec/exemplars/char.rb +1 -0
- data/spec/exemplars/empty_string.edn +1 -0
- data/spec/exemplars/empty_string.rb +1 -0
- data/spec/exemplars/false.edn +1 -0
- data/spec/exemplars/false.rb +1 -0
- data/spec/exemplars/float.edn +1 -0
- data/spec/exemplars/float.rb +1 -0
- data/spec/exemplars/float_neg_exp.edn +1 -0
- data/spec/exemplars/float_neg_exp.rb +1 -0
- data/spec/exemplars/float_point_dec_neg_exp.edn +1 -0
- data/spec/exemplars/float_point_dec_neg_exp.rb +1 -0
- data/spec/exemplars/float_point_plus_exp.edn +1 -0
- data/spec/exemplars/float_point_plus_exp.rb +1 -0
- data/spec/exemplars/float_pointneg_exp.edn +1 -0
- data/spec/exemplars/float_pointneg_exp.rb +1 -0
- data/spec/exemplars/float_pos_exp.edn +1 -0
- data/spec/exemplars/float_pos_exp.rb +1 -0
- data/spec/exemplars/float_sign_exp.edn +1 -0
- data/spec/exemplars/float_sign_exp.rb +1 -0
- data/spec/exemplars/float_with_exp.edn +1 -0
- data/spec/exemplars/float_with_exp.rb +1 -0
- data/spec/exemplars/float_with_exp_no_dec.edn +1 -0
- data/spec/exemplars/float_with_exp_no_dec.rb +1 -0
- data/spec/exemplars/gt_symbol.edn +1 -0
- data/spec/exemplars/gt_symbol.rb +1 -0
- data/spec/exemplars/integer.edn +1 -0
- data/spec/exemplars/integer.rb +1 -0
- data/spec/exemplars/keyword.edn +1 -0
- data/spec/exemplars/keyword.rb +1 -0
- data/spec/exemplars/keyword_with_namespace.edn +1 -0
- data/spec/exemplars/keyword_with_namespace.rb +1 -0
- data/spec/exemplars/list_empty.edn +1 -0
- data/spec/exemplars/list_empty.rb +1 -0
- data/spec/exemplars/list_mixed.edn +1 -0
- data/spec/exemplars/list_mixed.rb +1 -0
- data/spec/exemplars/list_nested.edn +1 -0
- data/spec/exemplars/list_nested.rb +1 -0
- data/spec/exemplars/list_one_element.edn +1 -0
- data/spec/exemplars/list_one_element.rb +1 -0
- data/spec/exemplars/long_string.edn +1 -0
- data/spec/exemplars/long_string.rb +1 -0
- data/spec/exemplars/map_empty.edn +1 -0
- data/spec/exemplars/map_empty.rb +1 -0
- data/spec/exemplars/map_nested.edn +1 -0
- data/spec/exemplars/map_nested.rb +1 -0
- data/spec/exemplars/map_one_element.edn +1 -0
- data/spec/exemplars/map_one_element.rb +1 -0
- data/spec/exemplars/map_two_entry.edn +1 -0
- data/spec/exemplars/map_two_entry.rb +1 -0
- data/spec/exemplars/mmv +4 -0
- data/spec/exemplars/nil.edn +1 -0
- data/spec/exemplars/nil.rb +1 -0
- data/spec/exemplars/set_empty.edn +1 -0
- data/spec/exemplars/set_empty.rb +1 -0
- data/spec/exemplars/set_nested.edn +1 -0
- data/spec/exemplars/set_nested.rb +1 -0
- data/spec/exemplars/set_one_element.edn +1 -0
- data/spec/exemplars/set_one_element.rb +1 -0
- data/spec/exemplars/set_two_elements.edn +1 -0
- data/spec/exemplars/set_two_elements.rb +1 -0
- data/spec/exemplars/simple_skip.edn +1 -0
- data/spec/exemplars/simple_skip.rb +1 -0
- data/spec/exemplars/skip_more_space.edn +1 -0
- data/spec/exemplars/skip_more_space.rb +1 -0
- data/spec/exemplars/skip_more_vector_elements.edn +1 -0
- data/spec/exemplars/skip_more_vector_elements.rb +1 -0
- data/spec/exemplars/skip_some_vector_elements.edn +1 -0
- data/spec/exemplars/skip_some_vector_elements.rb +1 -0
- data/spec/exemplars/skip_two_vector_elements.edn +1 -0
- data/spec/exemplars/skip_two_vector_elements.rb +1 -0
- data/spec/exemplars/skip_vector_element.edn +1 -0
- data/spec/exemplars/skip_vector_element.rb +1 -0
- data/spec/exemplars/skip_with_spaces.edn +1 -0
- data/spec/exemplars/skip_with_spaces.rb +1 -0
- data/spec/exemplars/skip_yet_more_space.edn +1 -0
- data/spec/exemplars/skip_yet_more_space.rb +1 -0
- data/spec/exemplars/special_symbol.edn +1 -0
- data/spec/exemplars/special_symbol.rb +1 -0
- data/spec/exemplars/string_with_newline.edn +1 -0
- data/spec/exemplars/string_with_newline.rb +1 -0
- data/spec/exemplars/symbol.edn +1 -0
- data/spec/exemplars/symbol.rb +1 -0
- data/spec/exemplars/symbol_begins_with_false.edn +1 -0
- data/spec/exemplars/symbol_begins_with_false.rb +1 -0
- data/spec/exemplars/symbol_begins_with_nil.edn +1 -0
- data/spec/exemplars/symbol_begins_with_nil.rb +1 -0
- data/spec/exemplars/symbol_with_dash.edn +1 -0
- data/spec/exemplars/symbol_with_dash.rb +1 -0
- data/spec/exemplars/symbol_with_namespace.edn +1 -0
- data/spec/exemplars/symbol_with_namespace.rb +1 -0
- data/spec/exemplars/tagged_instant.edn +1 -0
- data/spec/exemplars/tagged_instant.rb +1 -0
- data/spec/exemplars/tagged_uuid.edn +1 -0
- data/spec/exemplars/tagged_uuid.rb +1 -0
- data/spec/exemplars/true.edn +1 -0
- data/spec/exemplars/true.rb +1 -0
- data/spec/exemplars/utf8.edn +1 -0
- data/spec/exemplars/utf8.rb +1 -0
- data/spec/exemplars/vector_empty.edn +1 -0
- data/spec/exemplars/vector_empty.rb +1 -0
- data/spec/exemplars/vector_mixed.edn +1 -0
- data/spec/exemplars/vector_mixed.rb +1 -0
- data/spec/exemplars/vector_nested.edn +1 -0
- data/spec/exemplars/vector_nested.rb +1 -0
- data/spec/exemplars/vector_one_element.edn +1 -0
- data/spec/exemplars/vector_one_element.rb +1 -0
- data/spec/exemplars/whole_number_with_exp.edn +1 -0
- data/spec/exemplars/whole_number_with_exp.rb +1 -0
- data/spec/spec_helper.rb +164 -0
- metadata +357 -0
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
@@ -0,0 +1 @@
|
|
1
|
+
({})
|
@@ -0,0 +1 @@
|
|
1
|
+
{:a {:b :c}}
|
@@ -0,0 +1 @@
|
|
1
|
+
({:a => {:b => :c}})
|
@@ -0,0 +1 @@
|
|
1
|
+
{:a :b}
|
@@ -0,0 +1 @@
|
|
1
|
+
({:a => :b})
|
@@ -0,0 +1 @@
|
|
1
|
+
{:a 1, :b 2}
|
@@ -0,0 +1 @@
|
|
1
|
+
({:a => 1, :b => 2})
|
data/spec/exemplars/mmv
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
nil
|
@@ -0,0 +1 @@
|
|
1
|
+
nil
|
@@ -0,0 +1 @@
|
|
1
|
+
#{}
|
@@ -0,0 +1 @@
|
|
1
|
+
Set.new
|
@@ -0,0 +1 @@
|
|
1
|
+
#{1 #{:abc}}
|
@@ -0,0 +1 @@
|
|
1
|
+
Set[1, Set[:abc]]
|
@@ -0,0 +1 @@
|
|
1
|
+
#{1}
|
@@ -0,0 +1 @@
|
|
1
|
+
Set[1]
|
@@ -0,0 +1 @@
|
|
1
|
+
#{1 "abc"}
|
@@ -0,0 +1 @@
|
|
1
|
+
Set[1, "abc"]
|
@@ -0,0 +1 @@
|
|
1
|
+
#_123 4
|
@@ -0,0 +1 @@
|
|
1
|
+
4
|
@@ -0,0 +1 @@
|
|
1
|
+
#_ 123 4
|
@@ -0,0 +1 @@
|
|
1
|
+
4
|
@@ -0,0 +1 @@
|
|
1
|
+
[#_ "hello" 1 2]
|
@@ -0,0 +1 @@
|
|
1
|
+
[1, 2]
|
@@ -0,0 +1 @@
|
|
1
|
+
[#_64 1 #_ 65]
|
@@ -0,0 +1 @@
|
|
1
|
+
[1]
|
@@ -0,0 +1 @@
|
|
1
|
+
[#_1 #_"hello"]
|
@@ -0,0 +1 @@
|
|
1
|
+
[]
|
@@ -0,0 +1 @@
|
|
1
|
+
[#_1]
|
@@ -0,0 +1 @@
|
|
1
|
+
[]
|
@@ -0,0 +1 @@
|
|
1
|
+
#_ 123 4
|
@@ -0,0 +1 @@
|
|
1
|
+
4
|
@@ -0,0 +1 @@
|
|
1
|
+
#_ 123 74
|
@@ -0,0 +1 @@
|
|
1
|
+
74
|
@@ -0,0 +1 @@
|
|
1
|
+
<
|
@@ -0,0 +1 @@
|
|
1
|
+
EDN::Type::Symbol.new('<')
|
@@ -0,0 +1 @@
|
|
1
|
+
"hello\nworld"
|
@@ -0,0 +1 @@
|
|
1
|
+
"hello\nworld"
|
@@ -0,0 +1 @@
|
|
1
|
+
whatever
|
@@ -0,0 +1 @@
|
|
1
|
+
EDN::Type::Symbol.new('whatever')
|
@@ -0,0 +1 @@
|
|
1
|
+
falsey
|
@@ -0,0 +1 @@
|
|
1
|
+
EDN::Type::Symbol.new('falsey')
|
@@ -0,0 +1 @@
|
|
1
|
+
nillable
|
@@ -0,0 +1 @@
|
|
1
|
+
EDN::Type::Symbol.new('nillable')
|
@@ -0,0 +1 @@
|
|
1
|
+
true-foo
|
@@ -0,0 +1 @@
|
|
1
|
+
EDN::Type::Symbol.new('true-foo')
|
@@ -0,0 +1 @@
|
|
1
|
+
hello/world
|
@@ -0,0 +1 @@
|
|
1
|
+
EDN::Type::Symbol.new('hello/world')
|
@@ -0,0 +1 @@
|
|
1
|
+
#inst "2012-09-10T16:16:03-04:00"
|
@@ -0,0 +1 @@
|
|
1
|
+
DateTime.rfc3339("2012-09-10T16:16:03-04:00")
|
@@ -0,0 +1 @@
|
|
1
|
+
#uuid "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
|
@@ -0,0 +1 @@
|
|
1
|
+
"f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
|
@@ -0,0 +1 @@
|
|
1
|
+
true
|
@@ -0,0 +1 @@
|
|
1
|
+
true
|
@@ -0,0 +1 @@
|
|
1
|
+
"øhi utf8"
|
@@ -0,0 +1 @@
|
|
1
|
+
"øhi utf8"
|
@@ -0,0 +1 @@
|
|
1
|
+
[]
|
@@ -0,0 +1 @@
|
|
1
|
+
[]
|
@@ -0,0 +1 @@
|
|
1
|
+
["hello" 1 2]
|
@@ -0,0 +1 @@
|
|
1
|
+
['hello', 1, 2]
|
@@ -0,0 +1 @@
|
|
1
|
+
[[1 [:hi]]]
|
@@ -0,0 +1 @@
|
|
1
|
+
[[1, [:hi]]]
|
@@ -0,0 +1 @@
|
|
1
|
+
[1]
|
@@ -0,0 +1 @@
|
|
1
|
+
[1]
|
@@ -0,0 +1 @@
|
|
1
|
+
3e10
|
@@ -0,0 +1 @@
|
|
1
|
+
3.0e10
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'edn'
|
3
|
+
require 'rantly'
|
4
|
+
require 'date'
|
5
|
+
require 'time'
|
6
|
+
|
7
|
+
REPEAT = (ENV["REPEAT"] || 150).to_i
|
8
|
+
|
9
|
+
RSpec.configure do |c|
|
10
|
+
c.fail_fast = true
|
11
|
+
c.filter_run_including :focused => true
|
12
|
+
c.alias_example_to :fit, :focused => true
|
13
|
+
c.run_all_when_everything_filtered = true
|
14
|
+
|
15
|
+
c.filter_run :focus
|
16
|
+
c.run_all_when_everything_filtered = true
|
17
|
+
end
|
18
|
+
|
19
|
+
def io_for(s)
|
20
|
+
StringIO.new(s)
|
21
|
+
end
|
22
|
+
|
23
|
+
module RantlyHelpers
|
24
|
+
|
25
|
+
KEYWORD = lambda { |_|
|
26
|
+
call(SYMBOL).to_sym.to_edn
|
27
|
+
}
|
28
|
+
|
29
|
+
SYMBOL = lambda { |_|
|
30
|
+
branch(PLAIN_SYMBOL, NAMESPACED_SYMBOL)
|
31
|
+
}
|
32
|
+
|
33
|
+
PLAIN_SYMBOL = lambda { |_|
|
34
|
+
sized(range(1, 100)) {
|
35
|
+
s = string(/[[:alnum:]]|[\.\*\+\!\-\?\$_%<>&=:#]/)
|
36
|
+
guard s !~ /^[0-9]/
|
37
|
+
guard s !~ /^[\+\-\.][0-9]/
|
38
|
+
guard s !~ /^[\:\#]/
|
39
|
+
s
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
NAMESPACED_SYMBOL = lambda { |_|
|
44
|
+
[call(PLAIN_SYMBOL), call(PLAIN_SYMBOL)].join("/")
|
45
|
+
}
|
46
|
+
|
47
|
+
INTEGER = lambda { |_| integer.to_edn }
|
48
|
+
|
49
|
+
STRING = lambda { |_| sized(range(1, 100)) { string.to_edn } }
|
50
|
+
|
51
|
+
RUBY_STRING = lambda { |_| sized(range(1, 100)) { string } }
|
52
|
+
|
53
|
+
FLOAT = lambda { |_| (float * range(-4000, 5000)).to_edn }
|
54
|
+
|
55
|
+
FLOAT_WITH_EXP = lambda { |_|
|
56
|
+
# limited range because of Infinity
|
57
|
+
f = float.to_s
|
58
|
+
guard f !~ /[Ee]/
|
59
|
+
|
60
|
+
[f, choose("e", "E", "e+", "E+", "e-", "e+"), range(1, 100)].
|
61
|
+
map(&:to_s).
|
62
|
+
join("")
|
63
|
+
}
|
64
|
+
|
65
|
+
RUBY_CHAR = lambda { |_|
|
66
|
+
"\\" +
|
67
|
+
sized(1) {
|
68
|
+
freq([1, [:choose, "\n", "\r", " ", "\t"]],
|
69
|
+
[5, [:string, :graph]])
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
CHARACTER = lambda { |_|
|
74
|
+
"\\" +
|
75
|
+
sized(1) {
|
76
|
+
freq([1, [:choose, "newline", "return", "space", "tab"]],
|
77
|
+
[5, [:string, :graph]])
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
BOOL_OR_NIL = lambda { |_|
|
82
|
+
choose("true", "false", "nil")
|
83
|
+
}
|
84
|
+
|
85
|
+
ARRAY = lambda { |_|
|
86
|
+
array(range(1, 10)) { call(ELEMENT) }
|
87
|
+
}
|
88
|
+
|
89
|
+
VECTOR = lambda { |_|
|
90
|
+
'[' + call(ARRAY).join(', ') + ']'
|
91
|
+
}
|
92
|
+
|
93
|
+
LIST = lambda { |_|
|
94
|
+
'(' + call(ARRAY).join(', ') + ')'
|
95
|
+
}
|
96
|
+
|
97
|
+
SET = lambda { |_|
|
98
|
+
'#{' + call(ARRAY).join(', ') + '}'
|
99
|
+
}
|
100
|
+
|
101
|
+
MAP = lambda { |_|
|
102
|
+
size = range(0, 10)
|
103
|
+
keys = array(size) { call(ELEMENT) }
|
104
|
+
elements = array(size) { call(ELEMENT) }
|
105
|
+
arrays = keys.zip(elements)
|
106
|
+
'{' + arrays.map { |array| array.join(" ") }.join(", ") + '}'
|
107
|
+
}
|
108
|
+
|
109
|
+
ELEMENT = lambda { |_|
|
110
|
+
freq([8, BASIC_ELEMENT],
|
111
|
+
[2, ELEMENT_WITH_METADATA],
|
112
|
+
[1, INST],
|
113
|
+
[1, TAGGED_ELEMENT])
|
114
|
+
}
|
115
|
+
|
116
|
+
BASIC_ELEMENT = lambda { |_|
|
117
|
+
branch(INTEGER,
|
118
|
+
FLOAT,
|
119
|
+
FLOAT_WITH_EXP,
|
120
|
+
STRING,
|
121
|
+
KEYWORD,
|
122
|
+
SYMBOL,
|
123
|
+
CHARACTER,
|
124
|
+
BOOL_OR_NIL,
|
125
|
+
VECTOR,
|
126
|
+
LIST,
|
127
|
+
SET,
|
128
|
+
MAP)
|
129
|
+
}
|
130
|
+
|
131
|
+
METADATA = lambda { |_|
|
132
|
+
size = range(1, 4)
|
133
|
+
keys = array(size) { branch(KEYWORD, SYMBOL, STRING) }
|
134
|
+
elements = array(size) { call(ELEMENT) }
|
135
|
+
arrays = keys.zip(elements)
|
136
|
+
'^{' + arrays.map { |array| array.join(" ") }.join(", ") + '}'
|
137
|
+
}
|
138
|
+
|
139
|
+
ELEMENT_WITH_METADATA = lambda { |_|
|
140
|
+
[call(METADATA), branch(SYMBOL, VECTOR, LIST, SET, MAP)].join(" ")
|
141
|
+
}
|
142
|
+
|
143
|
+
TAG = lambda { |_|
|
144
|
+
tag = call(SYMBOL)
|
145
|
+
guard tag =~ /^[A-Za-z]/
|
146
|
+
"##{tag}"
|
147
|
+
}
|
148
|
+
|
149
|
+
TAGGED_ELEMENT = lambda { |_|
|
150
|
+
[call(TAG), call(BASIC_ELEMENT)].join(" ")
|
151
|
+
}
|
152
|
+
|
153
|
+
INST = lambda { |_|
|
154
|
+
begin
|
155
|
+
DateTime.new(range(0, 2500), range(1, 12), range(1, 28), range(0, 23), range(0, 59), range(0, 59), "#{range(-12,12)}").to_edn
|
156
|
+
rescue ArgumentError
|
157
|
+
guard false
|
158
|
+
end
|
159
|
+
}
|
160
|
+
|
161
|
+
def rant(fun, count = REPEAT)
|
162
|
+
Rantly(count) { call(fun) }
|
163
|
+
end
|
164
|
+
end
|