ejson_ext 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4ac9a364eee394e745ab9b94c6c852e0852c3efe
4
+ data.tar.gz: b72fc9d4efe307acb79f0b7af36eced99e5771c0
5
+ SHA512:
6
+ metadata.gz: 93bcedc4ce00346b62826446c83ad72d4a24f329d7307bb2af549feb7a19bb33004fe635b12af1c40622d5a8211bf0c8fb8090d903f684e0e9a6e88b2990b8c5
7
+ data.tar.gz: 2558936e468c5aab7a595d1c66ab8861b89e0fcacc296d15aed3239a4cdad4253d2379a7f7fe3b11328543ebdf7670868e45ad223bed6196253609988723df91
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
@@ -0,0 +1,13 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
6
+
7
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
+
9
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
+
11
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
+
13
+ This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ejson.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # EJSONExt
2
+
3
+ A light parser for Meteors EJSON spec. Only has date parsing out of the box for now.
4
+
5
+ You can learn more about EJSON here: [https://www.meteor.com/ejson]
6
+
7
+ ## Installation
8
+
9
+ ```ruby
10
+ gem 'ejson_ext'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install ejson_ext
20
+
21
+ ## Usage
22
+
23
+ Parsing EJSON
24
+ ```ruby
25
+ EJSONExt.parse('{"$escape":{"$date":{"$date":35820576553}}}}')
26
+ ```
27
+
28
+ Stringifying EJSON
29
+ ```ruby
30
+ EJSONExt.stringify({ when: Time.now })
31
+ ```
32
+
33
+ ## Development
34
+
35
+ After checking out the repo, run `bin/setup` to install dependencies.
36
+
37
+ ## Contributing
38
+
39
+ 1. Fork it ( https://github.com/vinniefranco/ejson/fork )
40
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
41
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
42
+ 4. Push to the branch (`git push origin my-new-feature`)
43
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/ejson_ext.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ejson_ext/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ejson_ext"
8
+ spec.version = EJSONExt::VERSION
9
+ spec.authors = ["Vincent Franco"]
10
+ spec.email = ["vince@freshivore.net"]
11
+
12
+ spec.summary = %q{Light implementation of Meteors EJSON parsing}
13
+ spec.description = %q{}
14
+ spec.homepage = ""
15
+
16
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
17
+ # delete this section to allow pushing this gem to any host.
18
+ if spec.respond_to?(:metadata)
19
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
20
+ else
21
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ end
23
+
24
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.9"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ spec.add_development_dependency "byebug", "~> 3.0"
33
+ spec.add_development_dependency "simplecov", "~> 0.10"
34
+ end
@@ -0,0 +1,36 @@
1
+ module EJSONExt
2
+ module Decoders
3
+ class Node
4
+ attr_reader :key
5
+
6
+ def initialize(key, value)
7
+ @key = key
8
+ @value = value
9
+ end
10
+
11
+ def value
12
+ if @value.is_a?(Hash)
13
+ @value.each.inject({}) { |hash, args| subnode(hash, args) }
14
+ else
15
+ @value
16
+ end
17
+ end
18
+
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
27
+ end
28
+
29
+ private
30
+
31
+ def subnode(hash, args)
32
+ self.class.new(*args).compile(self, hash)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+
2
+ module EJSONExt
3
+ module Decoders
4
+ class NullNode
5
+ def key
6
+ false
7
+ end
8
+
9
+ def value
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ module EJSONExt
2
+ module Decoders
3
+ class StartNode
4
+ def initialize(value)
5
+ @value = value
6
+ end
7
+
8
+ def compile
9
+ Decoders::Node.new(nil, value).
10
+ compile(Decoders::NullNode.new, {}).
11
+ values.
12
+ first
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :value
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,34 @@
1
+ module EJSONExt
2
+ module Encoders
3
+ class DefaultType
4
+ def initialize(key, value)
5
+ @key = key
6
+ @value = value
7
+ end
8
+
9
+ def handler?
10
+ true
11
+ end
12
+
13
+ def next_handler
14
+ @next_handler || DefaultType.new(key, value)
15
+ end
16
+
17
+ def next_handler=(handler)
18
+ @next_handler = handler
19
+ end
20
+
21
+ def parse
22
+ if handler?
23
+ [key, value]
24
+ else
25
+ next_handler.parse
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :key, :value
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,17 @@
1
+ module EJSONExt
2
+ module Encoders
3
+ class EscapeType < DefaultType
4
+ def handler?
5
+ @key == '$date' && !@value.is_a?(Time)
6
+ end
7
+
8
+ def key
9
+ '$escape'
10
+ end
11
+
12
+ def value
13
+ { @key => @value }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module EJSONExt
2
+ module Encoders
3
+ class RecursiveType < DefaultType
4
+ def handler?
5
+ @value.is_a?(Hash)
6
+ end
7
+
8
+ def value
9
+ EJSONExt.ejson_hash_from_hash(@value)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module EJSONExt
2
+ module Encoders
3
+ class TimeType < DefaultType
4
+ def handler?
5
+ @value.is_a?(Time)
6
+ end
7
+
8
+ def value
9
+ { '$date' => (@value.to_i * 1_000) }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module EJSONExt
2
+ class KeyValParser < Encoders::DefaultType
3
+ include Encoders
4
+
5
+ def handler
6
+ parser = RecursiveType.new key, value
7
+
8
+ [EscapeType, TimeType, DefaultType].inject(parser) do |handler, klass|
9
+ handler.next_handler = klass.new(key, value)
10
+ end
11
+
12
+ parser
13
+ end
14
+
15
+ def parse
16
+ handler.parse
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module EJSONExt
2
+ VERSION = "0.1.0"
3
+ end
data/lib/ejson_ext.rb ADDED
@@ -0,0 +1,28 @@
1
+ require 'json'
2
+ require 'ejson_ext/version'
3
+ require 'ejson_ext/encoders/default_type'
4
+ require 'ejson_ext/encoders/time_type'
5
+ require 'ejson_ext/encoders/recursive_type'
6
+ require 'ejson_ext/encoders/escape_type'
7
+ require 'ejson_ext/key_val_parser'
8
+ require 'ejson_ext/decoders/node'
9
+ require 'ejson_ext/decoders/null_node'
10
+ require 'ejson_ext/decoders/start_node'
11
+
12
+ module EJSONExt
13
+ def self.parse(item)
14
+ if item.is_a?(String)
15
+ Decoders::StartNode.new(JSON.parse item).compile
16
+ else
17
+ fail %(EJSONExt.parse argument should be a string "#{item.class}" given)
18
+ end
19
+ end
20
+
21
+ def self.stringify(value)
22
+ ejson_hash_from_hash(value).to_json
23
+ end
24
+
25
+ def self.ejson_hash_from_hash(value)
26
+ Hash[value.each.map { |key, val| KeyValParser.new(key, val).parse }]
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ejson_ext
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Vincent Franco
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-05-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.9'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.10'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.10'
83
+ description: ''
84
+ email:
85
+ - vince@freshivore.net
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - CODE_OF_CONDUCT.md
94
+ - Gemfile
95
+ - README.md
96
+ - Rakefile
97
+ - bin/setup
98
+ - ejson_ext.gemspec
99
+ - lib/ejson_ext.rb
100
+ - lib/ejson_ext/decoders/node.rb
101
+ - lib/ejson_ext/decoders/null_node.rb
102
+ - lib/ejson_ext/decoders/start_node.rb
103
+ - lib/ejson_ext/encoders/default_type.rb
104
+ - lib/ejson_ext/encoders/escape_type.rb
105
+ - lib/ejson_ext/encoders/recursive_type.rb
106
+ - lib/ejson_ext/encoders/time_type.rb
107
+ - lib/ejson_ext/key_val_parser.rb
108
+ - lib/ejson_ext/version.rb
109
+ homepage: ''
110
+ licenses: []
111
+ metadata:
112
+ allowed_push_host: https://rubygems.org
113
+ post_install_message:
114
+ rdoc_options: []
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ requirements: []
128
+ rubyforge_project:
129
+ rubygems_version: 2.4.5
130
+ signing_key:
131
+ specification_version: 4
132
+ summary: Light implementation of Meteors EJSON parsing
133
+ test_files: []