ejson_ext 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: 4ac9a364eee394e745ab9b94c6c852e0852c3efe
4
- data.tar.gz: b72fc9d4efe307acb79f0b7af36eced99e5771c0
3
+ metadata.gz: 4cbce41acb75e53c4cb08c8da28b211b4142731e
4
+ data.tar.gz: 7b46754673eb1a91940dd004b66ef4d201677697
5
5
  SHA512:
6
- metadata.gz: 93bcedc4ce00346b62826446c83ad72d4a24f329d7307bb2af549feb7a19bb33004fe635b12af1c40622d5a8211bf0c8fb8090d903f684e0e9a6e88b2990b8c5
7
- data.tar.gz: 2558936e468c5aab7a595d1c66ab8861b89e0fcacc296d15aed3239a4cdad4253d2379a7f7fe3b11328543ebdf7670868e45ad223bed6196253609988723df91
6
+ metadata.gz: 9e7a8e1ae105c3dcdc1988380073ced59a249fa2c01f9cdc93ede7d0cadb4f32ccbeaae3d41308babbd206f9099c58c287164c27a787dfdd001be62860059c0a
7
+ data.tar.gz: d84a42db67d28614c745229b2d0851b927f4c6d8158c1c8d4fb90fd61b2934d8093954f5fbd76a352ac1b05269d7e00caa2166e09d5f673ac13baa237f0067c1
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  # EJSONExt
2
+ [![Code Climate](https://codeclimate.com/repos/55497f8d69568026d9000403/badges/2991c8216c311dee3981/gpa.svg)](https://codeclimate.com/repos/55497f8d69568026d9000403/feed)
2
3
 
3
4
  A light parser for Meteors EJSON spec. Only has date parsing out of the box for now.
4
5
 
@@ -1,35 +1,39 @@
1
1
  module EJSONExt
2
2
  module Decoders
3
3
  class Node
4
- attr_reader :key
4
+ attr_reader :key, :parent
5
5
 
6
- def initialize(key, value)
6
+ def initialize(key, value, decoders, parent = NullNode.new)
7
7
  @key = key
8
8
  @value = value
9
+ @decoders = decoders
10
+ @parent = parent
9
11
  end
10
12
 
11
13
  def value
12
- if @value.is_a?(Hash)
13
- @value.each.inject({}) { |hash, args| subnode(hash, args) }
14
- else
15
- @value
16
- end
14
+ @computed_value ||= computed_value
17
15
  end
18
16
 
19
- def compile(parent_node, hash)
20
- if parent_node.key && @value.is_a?(Integer)
21
- Time.at(value / 1_000.0)
22
- elsif key == '$escape'
23
- value
24
- else
25
- hash.merge @key => value
26
- end
17
+ def compile(hash)
18
+ decoder.decoded_value(self, hash)
27
19
  end
28
20
 
29
21
  private
30
22
 
31
- def subnode(hash, args)
32
- self.class.new(*args).compile(self, hash)
23
+ attr_reader :decoders
24
+
25
+ def decoder
26
+ decoders.detect { |d| d.callee?(self) }
27
+ end
28
+
29
+ def computed_value
30
+ if @value.is_a?(Hash)
31
+ @value.each.inject({}) do |hash, (ky, va)|
32
+ self.class.new(ky, va, decoders, self).compile(hash)
33
+ end
34
+ else
35
+ @value
36
+ end
33
37
  end
34
38
  end
35
39
  end
@@ -6,10 +6,13 @@ module EJSONExt
6
6
  end
7
7
 
8
8
  def compile
9
- Decoders::Node.new(nil, value).
10
- compile(Decoders::NullNode.new, {}).
11
- values.
12
- first
9
+ extensions = [
10
+ Extensions::TimeExt.new,
11
+ Extensions::Escape.new,
12
+ Extensions::Default.new
13
+ ]
14
+
15
+ Decoders::Node.new(nil, value, extensions).compile({}).values.first
13
16
  end
14
17
 
15
18
  private
@@ -2,11 +2,11 @@ module EJSONExt
2
2
  module Encoders
3
3
  class RecursiveType < DefaultType
4
4
  def handler?
5
- @value.is_a?(Hash)
5
+ @value.is_a?(Hash) || @value.is_a?(Array)
6
6
  end
7
7
 
8
8
  def value
9
- EJSONExt.ejson_hash_from_hash(@value)
9
+ EJSONExt.ejson_for_type(@value)
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,13 @@
1
+ module EJSONExt
2
+ module Extensions
3
+ class Default
4
+ def callee?(_node)
5
+ true
6
+ end
7
+
8
+ def decoded_value(node, out)
9
+ out.merge node.key => node.value
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module EJSONExt
2
+ module Extensions
3
+ class Escape
4
+ def callee?(node)
5
+ node.key == '$escape'
6
+ end
7
+
8
+ def decoded_value(node, _)
9
+ node.value
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module EJSONExt
2
+ module Extensions
3
+ class TimeExt
4
+ def callee?(node)
5
+ node.parent.key && node.value.is_a?(Integer)
6
+ end
7
+
8
+ def decoded_value(node, _)
9
+ Time.at(node.value / 1_000.0)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module EJSONExt
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/ejson_ext.rb CHANGED
@@ -7,6 +7,9 @@ require 'ejson_ext/encoders/escape_type'
7
7
  require 'ejson_ext/key_val_parser'
8
8
  require 'ejson_ext/decoders/node'
9
9
  require 'ejson_ext/decoders/null_node'
10
+ require 'ejson_ext/extensions/default'
11
+ require 'ejson_ext/extensions/escape'
12
+ require 'ejson_ext/extensions/time_ext'
10
13
  require 'ejson_ext/decoders/start_node'
11
14
 
12
15
  module EJSONExt
@@ -19,10 +22,16 @@ module EJSONExt
19
22
  end
20
23
 
21
24
  def self.stringify(value)
22
- ejson_hash_from_hash(value).to_json
25
+ ejson_for_type(value).to_json
23
26
  end
24
27
 
25
- def self.ejson_hash_from_hash(value)
26
- Hash[value.each.map { |key, val| KeyValParser.new(key, val).parse }]
28
+ def self.ejson_for_type(value)
29
+ if value.is_a?(Hash)
30
+ Hash[value.each.map { |key, val| KeyValParser.new(key, val).parse }]
31
+ elsif value.is_a?(Array)
32
+ value.map { |item| ejson_for_type(item) }
33
+ else
34
+ value
35
+ end
27
36
  end
28
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ejson_ext
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vincent Franco
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-05-05 00:00:00.000000000 Z
11
+ date: 2015-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -104,6 +104,9 @@ files:
104
104
  - lib/ejson_ext/encoders/escape_type.rb
105
105
  - lib/ejson_ext/encoders/recursive_type.rb
106
106
  - lib/ejson_ext/encoders/time_type.rb
107
+ - lib/ejson_ext/extensions/default.rb
108
+ - lib/ejson_ext/extensions/escape.rb
109
+ - lib/ejson_ext/extensions/time_ext.rb
107
110
  - lib/ejson_ext/key_val_parser.rb
108
111
  - lib/ejson_ext/version.rb
109
112
  homepage: ''