edn 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # 0.9.3 (17 Sep 2012)
2
+
3
+ * Updated to latest EDN spec
4
+ ** Added new symbol characters
5
+ ** Added ability to have a + before a number
6
+
7
+ # 0.9.2 (13 Sep 2012)
8
+
9
+ * EDN spec fully implemented
data/README.md CHANGED
@@ -4,6 +4,19 @@
4
4
 
5
5
  **edn-ruby** is a Ruby library to read and write [edn][edn] (extensible data notation), a subset of Clojure used for transferring data between applications, much like JSON, YAML, or XML.
6
6
 
7
+ ## Metadata
8
+
9
+ tags and metadata do not work together
10
+
11
+ metadata keys can be symbols, keywords, or strings
12
+
13
+ only collections and symbols can have metadata
14
+
15
+ ^foo => ^{:tag foo}
16
+ ^:foo => ^{:foo true}
17
+ These do stack.
18
+
19
+
7
20
  ## Installation
8
21
 
9
22
  Add this line to your application's Gemfile:
data/lib/edn/parser.rb CHANGED
@@ -1,29 +1,5 @@
1
1
  require 'parslet'
2
-
3
- class IgnoreParslet < Parslet::Atoms::Base
4
- def initialize(parslet)
5
- @parslet = parslet
6
- end
7
- def to_s_inner(prec)
8
- @parslet.to_s(prec)
9
- end
10
- def try(source, context)
11
- success, value = result = @parslet.try(source, context)
12
-
13
- return succ(nil) if success
14
- return result
15
- end
16
- end
17
-
18
- module IgnoreDSL
19
- def ignore
20
- IgnoreParslet.new(self)
21
- end
22
- end
23
-
24
- class Parslet::Atoms::Base
25
- include IgnoreDSL
26
- end
2
+ require 'parslet/ignore'
27
3
 
28
4
  module EDN
29
5
  class Parser < Parslet::Parser
@@ -90,13 +66,13 @@ module EDN
90
66
  # Primitives
91
67
 
92
68
  rule(:integer) {
93
- (str('-').maybe >>
69
+ (match['\-\+'].maybe >>
94
70
  (str('0') | match('[1-9]') >> digit.repeat)).as(:integer) >>
95
71
  str('N').maybe.as(:precision)
96
72
  }
97
73
 
98
74
  rule(:float) {
99
- (str('-').maybe >>
75
+ (match['\-\+'].maybe >>
100
76
  (str('0') | (match('[1-9]') >> digit.repeat)) >>
101
77
  str('.') >> digit.repeat(1) >>
102
78
  (match('[eE]') >> match('[\-+]').maybe >> digit.repeat).maybe).as(:float) >>
@@ -111,7 +87,7 @@ module EDN
111
87
 
112
88
  rule(:character) {
113
89
  str("\\") >>
114
- (str('newline') | str('space') | str('tab') |
90
+ (str('newline') | str('space') | str('tab') | str('return') |
115
91
  match['[:graph:]']).as(:character)
116
92
  }
117
93
 
@@ -137,11 +113,11 @@ module EDN
137
113
  rule(:symbol_chars) {
138
114
  (symbol_first_char >>
139
115
  valid_chars.repeat) |
140
- match['\-\.']
116
+ match['\-\+\.']
141
117
  }
142
118
 
143
119
  rule(:symbol_first_char) {
144
- (match['\-\.'] >> match['0-9'].absent? |
120
+ (match['\-\+\.'] >> match['0-9'].absent? |
145
121
  match['\#\:0-9'].absent?) >> valid_chars
146
122
  }
147
123
 
@@ -150,7 +126,7 @@ module EDN
150
126
  }
151
127
 
152
128
  rule(:sym_punct) {
153
- match['\.\*\+\!\-\?\:\#\_']
129
+ match['\.\*\+\!\-\?\$_%&=:#']
154
130
  }
155
131
 
156
132
  rule(:digit) {
data/lib/edn/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module EDN
2
- VERSION = "0.9.2"
2
+ VERSION = "0.9.3"
3
3
  end
@@ -0,0 +1,24 @@
1
+ class IgnoreParslet < Parslet::Atoms::Base
2
+ def initialize(parslet)
3
+ @parslet = parslet
4
+ end
5
+ def to_s_inner(prec)
6
+ @parslet.to_s(prec)
7
+ end
8
+ def try(source, context)
9
+ success, value = result = @parslet.try(source, context)
10
+
11
+ return succ(nil) if success
12
+ return result
13
+ end
14
+ end
15
+
16
+ module IgnoreDSL
17
+ def ignore
18
+ IgnoreParslet.new(self)
19
+ end
20
+ end
21
+
22
+ class Parslet::Atoms::Base
23
+ include IgnoreDSL
24
+ end
@@ -53,6 +53,12 @@ describe EDN::Parser do
53
53
  parser.integer.should parse(int)
54
54
  end
55
55
  end
56
+
57
+ it "should consume integers prefixed with a +" do
58
+ rant(RantlyHelpers::INTEGER).each do |int|
59
+ parser.integer.should parse("+#{int.to_i.abs.to_s}")
60
+ end
61
+ end
56
62
  end
57
63
 
58
64
  context "float" do
@@ -67,6 +73,12 @@ describe EDN::Parser do
67
73
  parser.float.should parse(float)
68
74
  end
69
75
  end
76
+
77
+ it "should consume floats prefixed with a +" do
78
+ rant(RantlyHelpers::FLOAT).each do |float|
79
+ parser.float.should parse("+#{float.to_f.abs.to_s}")
80
+ end
81
+ end
70
82
  end
71
83
 
72
84
  context "symbol" do
data/spec/edn_spec.rb CHANGED
@@ -54,10 +54,15 @@ describe EDN do
54
54
  it "reads any valid value" do
55
55
  values = rant(RantlyHelpers::VALUE)
56
56
  values.each do |value|
57
- if value == "nil"
58
- EDN.read(value).should be_nil
59
- else
60
- EDN.read(value).should_not be_nil
57
+ begin
58
+ if value == "nil"
59
+ EDN.read(value).should be_nil
60
+ else
61
+ EDN.read(value).should_not be_nil
62
+ end
63
+ rescue Exception => ex
64
+ puts "Bad value: #{value}"
65
+ raise ex
61
66
  end
62
67
  end
63
68
  end
@@ -68,7 +73,12 @@ describe EDN do
68
73
  values = rant(RantlyHelpers::VALUE)
69
74
  values.each do |value|
70
75
  expect {
71
- EDN.read(value).to_edn
76
+ begin
77
+ EDN.read(value).to_edn
78
+ rescue Exception => ex
79
+ puts "Bad value: #{value}"
80
+ raise ex
81
+ end
72
82
  }.to_not raise_error
73
83
  end
74
84
  end
data/spec/spec_helper.rb CHANGED
@@ -26,9 +26,10 @@ module RantlyHelpers
26
26
 
27
27
  PLAIN_SYMBOL = lambda { |_|
28
28
  sized(range(1, 100)) {
29
- s = string(/[[:alnum:]]|[\-\.\.\*\+\!\-\?\:\#\_]/)
30
- guard s =~ /^[A-Za-z\-\.\.\*\+\!\-\?\:\#\_]/
31
- guard s !~ /^[\-\.][0-9]/
29
+ s = string(/[[:alnum:]]|[\.\*\+\!\-\?\$_%&=:#]/)
30
+ # guard s =~ /^[A-Za-z\.\*\+\!\-\?\$_%&=:#]/
31
+ guard s !~ /^[0-9]/
32
+ guard s !~ /^[\+\-\.][0-9]/
32
33
  guard s !~ /^[\:\#]/
33
34
  s
34
35
  }
@@ -122,7 +123,11 @@ module RantlyHelpers
122
123
  }
123
124
 
124
125
  INST = lambda { |_|
125
- 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
126
+ begin
127
+ 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
128
+ rescue ArgumentError
129
+ guard false
130
+ end
126
131
  }
127
132
 
128
133
  def rant(fun, count = REPEAT)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.9.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-13 00:00:00.000000000 Z
12
+ date: 2012-09-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: parslet
@@ -83,6 +83,7 @@ extensions: []
83
83
  extra_rdoc_files: []
84
84
  files:
85
85
  - .gitignore
86
+ - CHANGELOG.md
86
87
  - Gemfile
87
88
  - LICENSE
88
89
  - README.md
@@ -99,6 +100,7 @@ files:
99
100
  - lib/edn/type/uuid.rb
100
101
  - lib/edn/types.rb
101
102
  - lib/edn/version.rb
103
+ - lib/parslet/ignore.rb
102
104
  - spec/edn/parser_spec.rb
103
105
  - spec/edn/transform_spec.rb
104
106
  - spec/edn_spec.rb
@@ -117,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
117
119
  version: '0'
118
120
  segments:
119
121
  - 0
120
- hash: -3622317026699243756
122
+ hash: -2167184458695188347
121
123
  required_rubygems_version: !ruby/object:Gem::Requirement
122
124
  none: false
123
125
  requirements:
@@ -126,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
128
  version: '0'
127
129
  segments:
128
130
  - 0
129
- hash: -3622317026699243756
131
+ hash: -2167184458695188347
130
132
  requirements: []
131
133
  rubyforge_project:
132
134
  rubygems_version: 1.8.23