edn 0.0.0
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.
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +111 -0
- data/Rakefile +2 -0
- data/edn.gemspec +17 -0
- data/lib/edn.rb +5 -0
- data/lib/edn/version.rb +3 -0
- metadata +53 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Clinton R. Nixon
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
# edn-ruby
|
2
|
+
|
3
|
+
**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.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'edn'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install edn
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
To read a string of **edn**:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
EDN.read("[1 2 {:foo \"bar\"}]")
|
25
|
+
```
|
26
|
+
|
27
|
+
To convert a data structure to an **edn** string:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
data.to_edn
|
31
|
+
```
|
32
|
+
|
33
|
+
By default, this will work for strings, symbols, numbers, arrays, hashes, sets, nil, Time, and boolean values.
|
34
|
+
|
35
|
+
### Tagged Values
|
36
|
+
|
37
|
+
The interesting part of **edn** is the _extensible_ part. Data can be be _tagged_ to coerce interpretation of it to a particular data type. An example of a tagged data element:
|
38
|
+
|
39
|
+
```
|
40
|
+
#wolf/pack {:alpha "Greybeard" :betas ["Frostpaw" "Blackwind" "Bloodjaw"]}
|
41
|
+
```
|
42
|
+
|
43
|
+
The tag (`#wolf/pack`) will tell any consumers of this data to use a data type registered to handle `wolf/pack` to represent this data.
|
44
|
+
|
45
|
+
The rules for tags from the [**edn** README][README] should be followed. In short, custom tags should have a prefix (the part before the `/`) designating the user that created them or context they are used in. Non-prefixed tags are reserved for built-in tags.
|
46
|
+
|
47
|
+
There are two tags built in by default: `#uuid`, used for UUIDs, and `#inst`, used for an instant in time. In `edn-ruby`, `#inst` is converted to a Time, and Time values are tagged as `#inst`. There is not a UUID data type built into Ruby, so `#uuid` is converted to a string, but if you require `edn/uuid`, `#uuid` values are converted to an instance of `EDN::UUID`.
|
48
|
+
|
49
|
+
Tags that are not registered are converted as their base data type and a warning will be shown.
|
50
|
+
|
51
|
+
### Registering a New Tag For Reading
|
52
|
+
|
53
|
+
To register a tag for reading, call the method `EDN.register` with a tag and one of the following:
|
54
|
+
|
55
|
+
- A block that accepts data and returns a value.
|
56
|
+
- A lambda that accepts data and returns a value.
|
57
|
+
- A class that has an `initialize` method that accepts data.
|
58
|
+
|
59
|
+
Examples:
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
EDN.register("clinton/uri") do |uri|
|
63
|
+
URI(uri)
|
64
|
+
end
|
65
|
+
|
66
|
+
EDN.register("clinton/date", lambda { |date_array| Date.new(*date_array) }
|
67
|
+
|
68
|
+
class Dog
|
69
|
+
def initialize(name)
|
70
|
+
@name = name
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
EDN.register("clinton/dog", Dog)
|
75
|
+
```
|
76
|
+
|
77
|
+
### Writing Tags
|
78
|
+
|
79
|
+
Writing tags should be done as part of the class's `.to_edn` method, like so:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
class Dog
|
83
|
+
def to_edn
|
84
|
+
["#clinton/dog", @name.to_edn].join(" ")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
```
|
88
|
+
|
89
|
+
`EDN` provides a helper method, `EDN.tagout`:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
class Dog
|
93
|
+
def to_edn
|
94
|
+
EDN.tagout("clinton/dog", @name)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
```
|
98
|
+
|
99
|
+
This method calls `.to_edn` on the second argument and joins the arguments appropriately.
|
100
|
+
|
101
|
+
## Contributing
|
102
|
+
|
103
|
+
1. Fork it
|
104
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
105
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
106
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
107
|
+
5. Create new Pull Request
|
108
|
+
|
109
|
+
|
110
|
+
[edn]: https://github.com/richhickey/edn
|
111
|
+
[README]: https://github.com/richhickey/edn/blob/master/README.md
|
data/Rakefile
ADDED
data/edn.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/edn/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Clinton N. Dreisbach"]
|
6
|
+
gem.email = ["clinton@thinkrelevance.com"]
|
7
|
+
gem.description = %q{'edn implements a reader for Extensible Data Notation by Rich Hickey.'}
|
8
|
+
gem.summary = gem.description
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "edn"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = EDN::VERSION
|
17
|
+
end
|
data/lib/edn.rb
ADDED
data/lib/edn/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: edn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Clinton N. Dreisbach
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-09-07 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: ! '''edn implements a reader for Extensible Data Notation by Rich Hickey.'''
|
15
|
+
email:
|
16
|
+
- clinton@thinkrelevance.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- LICENSE
|
24
|
+
- README.md
|
25
|
+
- Rakefile
|
26
|
+
- edn.gemspec
|
27
|
+
- lib/edn.rb
|
28
|
+
- lib/edn/version.rb
|
29
|
+
homepage: ''
|
30
|
+
licenses: []
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubyforge_project:
|
49
|
+
rubygems_version: 1.8.23
|
50
|
+
signing_key:
|
51
|
+
specification_version: 3
|
52
|
+
summary: ! '''edn implements a reader for Extensible Data Notation by Rich Hickey.'''
|
53
|
+
test_files: []
|