edn2023 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +7 -0
  4. data/CHANGELOG.md +29 -0
  5. data/Gemfile +6 -0
  6. data/LICENSE +22 -0
  7. data/README.md +268 -0
  8. data/Rakefile +12 -0
  9. data/edn2023.gemspec +22 -0
  10. data/lib/edn/char_stream.rb +84 -0
  11. data/lib/edn/core_ext.rb +112 -0
  12. data/lib/edn/metadata.rb +27 -0
  13. data/lib/edn/parser.rb +92 -0
  14. data/lib/edn/reader.rb +23 -0
  15. data/lib/edn/ruby_edn_parser.rb +266 -0
  16. data/lib/edn/type/list.rb +13 -0
  17. data/lib/edn/type/symbol.rb +39 -0
  18. data/lib/edn/type/unknown.rb +9 -0
  19. data/lib/edn/type/uuid.rb +9 -0
  20. data/lib/edn/types.rb +3 -0
  21. data/lib/edn/version.rb +3 -0
  22. data/lib/edn.rb +80 -0
  23. data/spec/edn/char_stream_spec.rb +111 -0
  24. data/spec/edn/metadata_spec.rb +38 -0
  25. data/spec/edn/parser_spec.rb +162 -0
  26. data/spec/edn/reader_spec.rb +23 -0
  27. data/spec/edn_spec.rb +114 -0
  28. data/spec/exemplars/big_decimal.edn +1 -0
  29. data/spec/exemplars/big_decimal.rb +1 -0
  30. data/spec/exemplars/big_int.edn +1 -0
  31. data/spec/exemplars/big_int.rb +1 -0
  32. data/spec/exemplars/char.edn +1 -0
  33. data/spec/exemplars/char.rb +1 -0
  34. data/spec/exemplars/empty_string.edn +1 -0
  35. data/spec/exemplars/empty_string.rb +1 -0
  36. data/spec/exemplars/false.edn +1 -0
  37. data/spec/exemplars/false.rb +1 -0
  38. data/spec/exemplars/float.edn +1 -0
  39. data/spec/exemplars/float.rb +1 -0
  40. data/spec/exemplars/float_neg_exp.edn +1 -0
  41. data/spec/exemplars/float_neg_exp.rb +1 -0
  42. data/spec/exemplars/float_point_dec_neg_exp.edn +1 -0
  43. data/spec/exemplars/float_point_dec_neg_exp.rb +1 -0
  44. data/spec/exemplars/float_point_plus_exp.edn +1 -0
  45. data/spec/exemplars/float_point_plus_exp.rb +1 -0
  46. data/spec/exemplars/float_pointneg_exp.edn +1 -0
  47. data/spec/exemplars/float_pointneg_exp.rb +1 -0
  48. data/spec/exemplars/float_pos_exp.edn +1 -0
  49. data/spec/exemplars/float_pos_exp.rb +1 -0
  50. data/spec/exemplars/float_sign_exp.edn +1 -0
  51. data/spec/exemplars/float_sign_exp.rb +1 -0
  52. data/spec/exemplars/float_with_exp.edn +1 -0
  53. data/spec/exemplars/float_with_exp.rb +1 -0
  54. data/spec/exemplars/float_with_exp_no_dec.edn +1 -0
  55. data/spec/exemplars/float_with_exp_no_dec.rb +1 -0
  56. data/spec/exemplars/gt_symbol.edn +1 -0
  57. data/spec/exemplars/gt_symbol.rb +1 -0
  58. data/spec/exemplars/integer.edn +1 -0
  59. data/spec/exemplars/integer.rb +1 -0
  60. data/spec/exemplars/keyword.edn +1 -0
  61. data/spec/exemplars/keyword.rb +1 -0
  62. data/spec/exemplars/keyword_with_namespace.edn +1 -0
  63. data/spec/exemplars/keyword_with_namespace.rb +1 -0
  64. data/spec/exemplars/list_empty.edn +1 -0
  65. data/spec/exemplars/list_empty.rb +1 -0
  66. data/spec/exemplars/list_mixed.edn +1 -0
  67. data/spec/exemplars/list_mixed.rb +1 -0
  68. data/spec/exemplars/list_nested.edn +1 -0
  69. data/spec/exemplars/list_nested.rb +1 -0
  70. data/spec/exemplars/list_one_element.edn +1 -0
  71. data/spec/exemplars/list_one_element.rb +1 -0
  72. data/spec/exemplars/long_string.edn +1 -0
  73. data/spec/exemplars/long_string.rb +1 -0
  74. data/spec/exemplars/map_empty.edn +1 -0
  75. data/spec/exemplars/map_empty.rb +1 -0
  76. data/spec/exemplars/map_nested.edn +1 -0
  77. data/spec/exemplars/map_nested.rb +1 -0
  78. data/spec/exemplars/map_one_element.edn +1 -0
  79. data/spec/exemplars/map_one_element.rb +1 -0
  80. data/spec/exemplars/map_two_entry.edn +1 -0
  81. data/spec/exemplars/map_two_entry.rb +1 -0
  82. data/spec/exemplars/mmv +4 -0
  83. data/spec/exemplars/nil.edn +1 -0
  84. data/spec/exemplars/nil.rb +1 -0
  85. data/spec/exemplars/set_empty.edn +1 -0
  86. data/spec/exemplars/set_empty.rb +1 -0
  87. data/spec/exemplars/set_nested.edn +1 -0
  88. data/spec/exemplars/set_nested.rb +1 -0
  89. data/spec/exemplars/set_one_element.edn +1 -0
  90. data/spec/exemplars/set_one_element.rb +1 -0
  91. data/spec/exemplars/set_two_elements.edn +1 -0
  92. data/spec/exemplars/set_two_elements.rb +1 -0
  93. data/spec/exemplars/simple_skip.edn +1 -0
  94. data/spec/exemplars/simple_skip.rb +1 -0
  95. data/spec/exemplars/skip_more_space.edn +1 -0
  96. data/spec/exemplars/skip_more_space.rb +1 -0
  97. data/spec/exemplars/skip_more_vector_elements.edn +1 -0
  98. data/spec/exemplars/skip_more_vector_elements.rb +1 -0
  99. data/spec/exemplars/skip_some_vector_elements.edn +1 -0
  100. data/spec/exemplars/skip_some_vector_elements.rb +1 -0
  101. data/spec/exemplars/skip_two_vector_elements.edn +1 -0
  102. data/spec/exemplars/skip_two_vector_elements.rb +1 -0
  103. data/spec/exemplars/skip_vector_element.edn +1 -0
  104. data/spec/exemplars/skip_vector_element.rb +1 -0
  105. data/spec/exemplars/skip_with_spaces.edn +1 -0
  106. data/spec/exemplars/skip_with_spaces.rb +1 -0
  107. data/spec/exemplars/skip_yet_more_space.edn +1 -0
  108. data/spec/exemplars/skip_yet_more_space.rb +1 -0
  109. data/spec/exemplars/special_symbol.edn +1 -0
  110. data/spec/exemplars/special_symbol.rb +1 -0
  111. data/spec/exemplars/string_with_newline.edn +1 -0
  112. data/spec/exemplars/string_with_newline.rb +1 -0
  113. data/spec/exemplars/symbol.edn +1 -0
  114. data/spec/exemplars/symbol.rb +1 -0
  115. data/spec/exemplars/symbol_begins_with_false.edn +1 -0
  116. data/spec/exemplars/symbol_begins_with_false.rb +1 -0
  117. data/spec/exemplars/symbol_begins_with_nil.edn +1 -0
  118. data/spec/exemplars/symbol_begins_with_nil.rb +1 -0
  119. data/spec/exemplars/symbol_with_dash.edn +1 -0
  120. data/spec/exemplars/symbol_with_dash.rb +1 -0
  121. data/spec/exemplars/symbol_with_namespace.edn +1 -0
  122. data/spec/exemplars/symbol_with_namespace.rb +1 -0
  123. data/spec/exemplars/tagged_instant.edn +1 -0
  124. data/spec/exemplars/tagged_instant.rb +1 -0
  125. data/spec/exemplars/tagged_uuid.edn +1 -0
  126. data/spec/exemplars/tagged_uuid.rb +1 -0
  127. data/spec/exemplars/true.edn +1 -0
  128. data/spec/exemplars/true.rb +1 -0
  129. data/spec/exemplars/utf8.edn +1 -0
  130. data/spec/exemplars/utf8.rb +1 -0
  131. data/spec/exemplars/vector_empty.edn +1 -0
  132. data/spec/exemplars/vector_empty.rb +1 -0
  133. data/spec/exemplars/vector_mixed.edn +1 -0
  134. data/spec/exemplars/vector_mixed.rb +1 -0
  135. data/spec/exemplars/vector_nested.edn +1 -0
  136. data/spec/exemplars/vector_nested.rb +1 -0
  137. data/spec/exemplars/vector_one_element.edn +1 -0
  138. data/spec/exemplars/vector_one_element.rb +1 -0
  139. data/spec/exemplars/whole_number_with_exp.edn +1 -0
  140. data/spec/exemplars/whole_number_with_exp.rb +1 -0
  141. data/spec/spec_helper.rb +164 -0
  142. 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})
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+
3
+ mv $1.edn $2.edn
4
+ mv $1.rb $2.rb
@@ -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
+ [#_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
@@ -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