ejson_ext 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: ''