riagent-document 0.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1a09ba3c82e9fe9ea1f42ba80b76bf087e269143
4
+ data.tar.gz: d0d0b9cc0854aa4d65f9eadc28e14f200202f531
5
+ SHA512:
6
+ metadata.gz: 0863630345215d6f8481d292e3287b79a96036526536a5294215da7ef9c788eb999ee964be53645dfbdb5d759acce3a96f7d156b5574314f0fcf107b303da6ff
7
+ data.tar.gz: 2683c521e20c3ef5857ad5f605bca2cdc8e42fe6d8a898c045e8170c7049eff34614860300890fdfc59ee0933ba1ca5b83afa37521586700f62e222cfb626a2d
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,24 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Copyright (c) "2013" Dmitri Zagidulin and Basho Technologies, Inc.
4
+ ##
5
+ ## This file is provided to you under the Apache License,
6
+ ## Version 2.0 (the "License"); you may not use this file
7
+ ## except in compliance with the License. You may obtain
8
+ ## a copy of the License at
9
+ ##
10
+ ## http://www.apache.org/licenses/LICENSE-2.0
11
+ ##
12
+ ## Unless required by applicable law or agreed to in writing,
13
+ ## software distributed under the License is distributed on an
14
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ ## KIND, either express or implied. See the License for the
16
+ ## specific language governing permissions and limitations
17
+ ## under the License.
18
+ ##
19
+ ## -------------------------------------------------------------------
20
+
21
+ source 'https://rubygems.org'
22
+
23
+ # Specify your gem's dependencies in riagent-document.gemspec
24
+ gemspec
@@ -0,0 +1,48 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ riagent-document (0.0.1)
5
+ activesupport (~> 4.0)
6
+ virtus
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (4.0.2)
12
+ i18n (~> 0.6, >= 0.6.4)
13
+ minitest (~> 4.2)
14
+ multi_json (~> 1.3)
15
+ thread_safe (~> 0.1)
16
+ tzinfo (~> 0.3.37)
17
+ atomic (1.1.14)
18
+ axiom-types (0.0.5)
19
+ descendants_tracker (~> 0.0.1)
20
+ ice_nine (~> 0.9)
21
+ coercible (1.0.0)
22
+ descendants_tracker (~> 0.0.1)
23
+ descendants_tracker (0.0.3)
24
+ equalizer (0.0.9)
25
+ i18n (0.6.9)
26
+ ice_nine (0.11.0)
27
+ minitest (4.7.5)
28
+ minitest-spec-context (0.0.3)
29
+ multi_json (1.8.4)
30
+ rake (10.1.1)
31
+ thread_safe (0.1.3)
32
+ atomic
33
+ tzinfo (0.3.38)
34
+ virtus (1.0.1)
35
+ axiom-types (~> 0.0.5)
36
+ coercible (~> 1.0)
37
+ descendants_tracker (~> 0.0.1)
38
+ equalizer (~> 0.0.7)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ bundler
45
+ minitest (~> 4.2)
46
+ minitest-spec-context
47
+ rake
48
+ riagent-document!
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Dmitri Zagidulin
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.
@@ -0,0 +1,125 @@
1
+ ## riagent-document
2
+
3
+ Riagent::Document is a Ruby object to JSON document conversion format, for persistence to Riak db.
4
+
5
+ ### Features
6
+ * Convenient model definition language that is familiar to anyone who has worked with Ruby MVC frameworks
7
+ * Support for embedded documents for ease of object composition
8
+ * Serialization to and from JSON (which can be saved in Riak)
9
+
10
+ ### Model/Document Definition
11
+ Riagent::Document uses [Virtus](https://github.com/solnic/virtus) for document attributes, defaults and coercions.
12
+
13
+ To turn a Ruby class into a Document, add ```riagent-document``` to your Gemfile,
14
+ and ```include``` Riagent::Document in your model class.
15
+
16
+ ```ruby
17
+ include 'riagent-document'
18
+
19
+ # models/user.rb
20
+ class User
21
+ include Riagent::Document
22
+
23
+ attribute :username, String
24
+ attribute :email, String
25
+ attribute :country, String, default: 'USA'
26
+ end
27
+ ```
28
+
29
+ ### Conversion to and from JSON
30
+ ```ruby
31
+ # Documents accept mass attribute assignment in the initializer
32
+ user = User.new username: 'Test User', email: 'test@user.com'
33
+ user.country = 'Canada'
34
+
35
+ # Convert to JSON string
36
+ user_string = user.to_json_document
37
+ # => '{"username":"Test User", "email":"test@user.com", "country":"Canada"}'
38
+
39
+ # Convert from JSON string back to an object instance
40
+ new_user = User.from_json(user_string)
41
+ puts new_user.inspect
42
+ # => #<User:0x00000102a9aaa8 @username="Test User", @email="test@user.com", ...>
43
+ ```
44
+
45
+ ### Embedding Documents
46
+ You can compose Documents out of complex types.
47
+
48
+ For example, if you were implementing an ```AddressBook``` object, you could embed ```Contact``` objects directly, using a Set.
49
+
50
+ ```ruby
51
+ class Contact
52
+ include Riagent::Document
53
+
54
+ attribute :contact_name, String
55
+ attribute :contact_email, String
56
+ end
57
+
58
+ class AddressBook
59
+ include Riagent::Document
60
+
61
+ attribute :user_key, String
62
+ attribute :contacts, Set[Contact]
63
+ end
64
+ ```
65
+
66
+ Which would then allow you to serialize the whole composite document:
67
+
68
+ ```ruby
69
+ address_book = AddressBook.new user_key: 'test-user123'
70
+ c1 = Contact.new contact_name: 'Joe', contact_email: 'joe@test.net'
71
+ c2 = Contact.new contact_name: 'Jane', contact_email: 'jane@test.net'
72
+ address_book.contacts << c1
73
+ address_book.contacts << c2
74
+ json_str = address_book.to_json_document
75
+ puts json_str
76
+ # '{ "user_key":"test-user123",
77
+ # "contacts":[
78
+ # {"contact_name":"Joe","contact_email":"joe@test.net"},
79
+ # {"contact_name":"Jane","contact_email":"jane@test.net"}
80
+ # ]
81
+ # }'
82
+ ```
83
+
84
+ And then, of course, re-hydrate the JSON string back into document instances:
85
+
86
+ ```ruby
87
+ new_book = AddressBook.from_json(json_str)
88
+ puts new_book.inspect
89
+ # <AddressBook:0x00000102a38fd8 @user_key="test-user123",
90
+ # @contacts=#<Set: {#<Contact:0x00000102a38df8 @contact_name="Joe", @contact_email="joe@test.net">, #<Contact:0x00000102a387e0 @contact_name="Jane", @contact_email="jane@test.net">}>, ...>
91
+ ```
92
+
93
+ ### Persistence
94
+ Now that you can convert model objects into JSON strings and back, how do you actually save them to Riak?
95
+
96
+ #### 1. Manual - Riak Client
97
+ You can manually persist them to Riak by using the [Riak Ruby Client](https://github.com/basho/riak-ruby-client):
98
+
99
+ ```ruby
100
+ require 'riak-client'
101
+ # Get an instance of the model object
102
+ user = User.new username: 'Test User', email: 'test@user.com'
103
+
104
+ # Initialize a Riak client, and save
105
+ client = Riak::Client.new
106
+ riak_object = client.bucket("users").get_or_new("test-user-123") # a Riak::RObject for bucket "users" and key "test-user-123"
107
+ riak_object.content_type = "application/json"
108
+ riak_object.raw_data = user.to_json_document
109
+ riak_object.store
110
+ ```
111
+
112
+ #### 2. Manual - RiakJson Client
113
+ Or save documents to [Solr](https://github.com/basho/yokozuna/)-indexed collections via the
114
+ [RiakJson Client](https://github.com/basho-labs/riak_json_ruby_client):
115
+
116
+ ```ruby
117
+ require 'riak_json'
118
+ # Get an instance of the model object
119
+ user = User.new username: 'Test User', email: 'test@user.com'
120
+
121
+ # Insert into a RiakJson collection
122
+ client = RiakJson::Client.new
123
+ collection = client.collection("users")
124
+ collection.insert(user)
125
+ ```
@@ -0,0 +1,31 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Copyright (c) "2013" Dmitri Zagidulin and Basho Technologies, Inc.
4
+ ##
5
+ ## This file is provided to you under the Apache License,
6
+ ## Version 2.0 (the "License"); you may not use this file
7
+ ## except in compliance with the License. You may obtain
8
+ ## a copy of the License at
9
+ ##
10
+ ## http://www.apache.org/licenses/LICENSE-2.0
11
+ ##
12
+ ## Unless required by applicable law or agreed to in writing,
13
+ ## software distributed under the License is distributed on an
14
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ ## KIND, either express or implied. See the License for the
16
+ ## specific language governing permissions and limitations
17
+ ## under the License.
18
+ ##
19
+ ## -------------------------------------------------------------------
20
+
21
+ require 'bundler/gem_tasks'
22
+ require 'rake'
23
+ require 'rake/testtask'
24
+
25
+ task :default => :test
26
+
27
+ Rake::TestTask.new :test do |t|
28
+ t.libs << 'lib' << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ end
31
+
@@ -0,0 +1,69 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Copyright (c) "2013" Dmitri Zagidulin and Basho Technologies, Inc.
4
+ ##
5
+ ## This file is provided to you under the Apache License,
6
+ ## Version 2.0 (the "License"); you may not use this file
7
+ ## except in compliance with the License. You may obtain
8
+ ## a copy of the License at
9
+ ##
10
+ ## http://www.apache.org/licenses/LICENSE-2.0
11
+ ##
12
+ ## Unless required by applicable law or agreed to in writing,
13
+ ## software distributed under the License is distributed on an
14
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ ## KIND, either express or implied. See the License for the
16
+ ## specific language governing permissions and limitations
17
+ ## under the License.
18
+ ##
19
+ ## -------------------------------------------------------------------
20
+
21
+ require "riagent/document/version"
22
+ require "active_support/concern"
23
+ require 'active_support/json'
24
+ require 'active_support/core_ext/object/to_json'
25
+ require "virtus"
26
+ require "virtus/attribute"
27
+
28
+ module Riagent
29
+ module Document
30
+ extend ActiveSupport::Concern
31
+
32
+ included do
33
+ include Virtus.model # Virtus is used to manage document attributes
34
+
35
+ attr_accessor :key
36
+ alias_method :id, :key # document.id same as document.key, to maintain Rails idiom
37
+ end
38
+
39
+ # Returns the JSON representation of the document.
40
+ # Does not include the document +key+
41
+ def to_json_document
42
+ self.attributes.to_json
43
+ end
44
+
45
+ module ClassMethods
46
+ # Returns a Riagent::Document instance, given a JSON string
47
+ # @param [String] json_object JSON Object string
48
+ # @param [String] key Optional document key. If not provided, will be loaded from +_id+ attribute in the JSON itself
49
+ # @return [Riagent::Document, nil] Riagent::Document instance, or nil if the JSON string is nil/empty
50
+ def from_json(json_obj, key=nil)
51
+ return nil if json_obj.nil? or json_obj.empty?
52
+ attributes_hash = JSON.parse(json_obj)
53
+ return nil if attributes_hash.empty?
54
+ instance = self.instantiate(attributes_hash)
55
+ if key.nil?
56
+ # Load key from the JSON object
57
+ key = attributes_hash['_id']
58
+ end
59
+ instance.key = key
60
+ instance
61
+ end
62
+
63
+ # Returns Riagent::Document instance, given a Hash of attributes
64
+ def instantiate(attributes)
65
+ self.new attributes
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,25 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Copyright (c) "2013" Dmitri Zagidulin and Basho Technologies, Inc.
4
+ ##
5
+ ## This file is provided to you under the Apache License,
6
+ ## Version 2.0 (the "License"); you may not use this file
7
+ ## except in compliance with the License. You may obtain
8
+ ## a copy of the License at
9
+ ##
10
+ ## http://www.apache.org/licenses/LICENSE-2.0
11
+ ##
12
+ ## Unless required by applicable law or agreed to in writing,
13
+ ## software distributed under the License is distributed on an
14
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ ## KIND, either express or implied. See the License for the
16
+ ## specific language governing permissions and limitations
17
+ ## under the License.
18
+ ##
19
+ ## -------------------------------------------------------------------
20
+
21
+ module Riagent
22
+ module Document
23
+ VERSION = "0.0.1"
24
+ end
25
+ end
@@ -0,0 +1,48 @@
1
+ # coding: utf-8
2
+ ## -------------------------------------------------------------------
3
+ ##
4
+ ## Copyright (c) "2013" Dmitri Zagidulin and Basho Technologies, Inc.
5
+ ##
6
+ ## This file is provided to you under the Apache License,
7
+ ## Version 2.0 (the "License"); you may not use this file
8
+ ## except in compliance with the License. You may obtain
9
+ ## a copy of the License at
10
+ ##
11
+ ## http://www.apache.org/licenses/LICENSE-2.0
12
+ ##
13
+ ## Unless required by applicable law or agreed to in writing,
14
+ ## software distributed under the License is distributed on an
15
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ ## KIND, either express or implied. See the License for the
17
+ ## specific language governing permissions and limitations
18
+ ## under the License.
19
+ ##
20
+ ## -------------------------------------------------------------------
21
+
22
+ lib = File.expand_path('../lib', __FILE__)
23
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
24
+ require 'riagent/document/version'
25
+
26
+ Gem::Specification.new do |spec|
27
+ spec.name = "riagent-document"
28
+ spec.version = Riagent::Document::VERSION
29
+ spec.authors = ["Dmitri Zagidulin"]
30
+ spec.email = ["dzagidulin@gmail.com"]
31
+ spec.summary = %q{Ruby object to JSON document conversion format, for persistence to Riak db}
32
+ spec.description = spec.summary
33
+ spec.homepage = "https://github.com/dmitrizagidulin/riagent-document"
34
+ spec.license = "Apache 2.0"
35
+
36
+ spec.files = `git ls-files -z`.split("\x0")
37
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
38
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
39
+ spec.require_paths = ["lib"]
40
+
41
+ spec.add_runtime_dependency "virtus"
42
+ spec.add_runtime_dependency "activesupport", "~> 4.0"
43
+
44
+ spec.add_development_dependency "bundler"
45
+ spec.add_development_dependency "rake"
46
+ spec.add_development_dependency "minitest", "~> 4.2"
47
+ spec.add_development_dependency "minitest-spec-context"
48
+ end
@@ -0,0 +1,33 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
4
+ ##
5
+ ## This file is provided to you under the Apache License,
6
+ ## Version 2.0 (the "License"); you may not use this file
7
+ ## except in compliance with the License. You may obtain
8
+ ## a copy of the License at
9
+ ##
10
+ ## http://www.apache.org/licenses/LICENSE-2.0
11
+ ##
12
+ ## Unless required by applicable law or agreed to in writing,
13
+ ## software distributed under the License is distributed on an
14
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ ## KIND, either express or implied. See the License for the
16
+ ## specific language governing permissions and limitations
17
+ ## under the License.
18
+ ##
19
+ ## -------------------------------------------------------------------
20
+
21
+ class Contact
22
+ include Riagent::Document
23
+
24
+ attribute :contact_name, String
25
+ attribute :contact_email, String
26
+ end
27
+
28
+ class AddressBook
29
+ include Riagent::Document
30
+
31
+ attribute :user_key, String
32
+ attribute :contacts, Set[Contact]
33
+ end
@@ -0,0 +1,27 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Copyright (c) "2013" Basho Technologies, Inc.
4
+ ##
5
+ ## This file is provided to you under the Apache License,
6
+ ## Version 2.0 (the "License"); you may not use this file
7
+ ## except in compliance with the License. You may obtain
8
+ ## a copy of the License at
9
+ ##
10
+ ## http://www.apache.org/licenses/LICENSE-2.0
11
+ ##
12
+ ## Unless required by applicable law or agreed to in writing,
13
+ ## software distributed under the License is distributed on an
14
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ ## KIND, either express or implied. See the License for the
16
+ ## specific language governing permissions and limitations
17
+ ## under the License.
18
+ ##
19
+ ## -------------------------------------------------------------------
20
+
21
+ class User
22
+ include Riagent::Document
23
+
24
+ attribute :username, String
25
+ attribute :email, String
26
+ attribute :language, String, default: 'en'
27
+ end
@@ -0,0 +1,25 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Copyright (c) "2013" Basho Technologies, Inc.
4
+ ##
5
+ ## This file is provided to you under the Apache License,
6
+ ## Version 2.0 (the "License"); you may not use this file
7
+ ## except in compliance with the License. You may obtain
8
+ ## a copy of the License at
9
+ ##
10
+ ## http://www.apache.org/licenses/LICENSE-2.0
11
+ ##
12
+ ## Unless required by applicable law or agreed to in writing,
13
+ ## software distributed under the License is distributed on an
14
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ ## KIND, either express or implied. See the License for the
16
+ ## specific language governing permissions and limitations
17
+ ## under the License.
18
+ ##
19
+ ## -------------------------------------------------------------------
20
+
21
+ require 'minitest/autorun'
22
+ require 'minitest-spec-context'
23
+ require 'riagent/document'
24
+ require 'examples/models/user'
25
+ require 'examples/models/address_book'
@@ -0,0 +1,44 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
4
+ ##
5
+ ## This file is provided to you under the Apache License,
6
+ ## Version 2.0 (the "License"); you may not use this file
7
+ ## except in compliance with the License. You may obtain
8
+ ## a copy of the License at
9
+ ##
10
+ ## http://www.apache.org/licenses/LICENSE-2.0
11
+ ##
12
+ ## Unless required by applicable law or agreed to in writing,
13
+ ## software distributed under the License is distributed on an
14
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ ## KIND, either express or implied. See the License for the
16
+ ## specific language governing permissions and limitations
17
+ ## under the License.
18
+ ##
19
+ ## -------------------------------------------------------------------
20
+
21
+ require 'test_helper'
22
+
23
+ describe "a Riagent::Document" do
24
+ # See test/examples/models/user.rb
25
+ # User class includes the Riagent::Document mixin
26
+ let(:user_document) { User.new }
27
+
28
+ it "has a key" do
29
+ user_document.key.must_be_nil # first initialized
30
+ test_key = 'george'
31
+ user_document.key = test_key
32
+ user_document.key.must_equal test_key
33
+ # Test for the .id alias
34
+ user_document.id.must_equal test_key
35
+ end
36
+
37
+ it "has model attributes" do
38
+ user_document.attributes.count.must_equal 3 # :username, :email, :language
39
+ end
40
+
41
+ it "should respond to to_json_document()" do
42
+ assert user_document.respond_to?(:to_json_document)
43
+ end
44
+ end
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+
3
+ describe "a Riagent::Document" do
4
+
5
+ # See test/examples/models/address_book.rb
6
+ it "can be composed of other embedded Documents" do
7
+ address_book = AddressBook.new user_key: 'earl-123'
8
+ c1 = Contact.new contact_name: 'Joe', contact_email: 'joe@test.net'
9
+ c2 = Contact.new contact_name: 'Jane', contact_email: 'jane@test.net'
10
+ address_book.contacts << c1
11
+ address_book.contacts << c2
12
+ json_str = address_book.to_json_document
13
+
14
+ new_book = AddressBook.from_json json_str
15
+ new_book.contacts.count.must_equal 2
16
+ contact = new_book.contacts.first
17
+ contact.contact_name.must_equal 'Joe'
18
+ contact.must_be_kind_of Contact
19
+ end
20
+ end
@@ -0,0 +1,42 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Copyright (c) "2014" Dmitri Zagidulin and Basho Technologies, Inc.
4
+ ##
5
+ ## This file is provided to you under the Apache License,
6
+ ## Version 2.0 (the "License"); you may not use this file
7
+ ## except in compliance with the License. You may obtain
8
+ ## a copy of the License at
9
+ ##
10
+ ## http://www.apache.org/licenses/LICENSE-2.0
11
+ ##
12
+ ## Unless required by applicable law or agreed to in writing,
13
+ ## software distributed under the License is distributed on an
14
+ ## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ ## KIND, either express or implied. See the License for the
16
+ ## specific language governing permissions and limitations
17
+ ## under the License.
18
+ ##
19
+ ## -------------------------------------------------------------------
20
+
21
+ require 'test_helper'
22
+
23
+ describe "a Riagent::Document" do
24
+ # See test/examples/models/user.rb
25
+ # User class includes the Riagent::Document mixin
26
+
27
+ it "can be converted to JSON and back" do
28
+ user = User.new username: 'earl', email: 'earl@desandwich.com'
29
+ json_obj = user.to_json_document
30
+ json_obj.must_be_kind_of String
31
+
32
+ new_user = User.from_json(json_obj)
33
+ new_user.must_be_kind_of User
34
+ new_user.username.must_equal 'earl'
35
+ end
36
+
37
+ it "from_json() returns nil if passed in an empty result string" do
38
+ User.from_json(nil).must_be_nil
39
+ User.from_json('').must_be_nil
40
+ User.from_json([].to_json).must_be_nil
41
+ end
42
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: riagent-document
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dmitri Zagidulin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: virtus
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-spec-context
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Ruby object to JSON document conversion format, for persistence to Riak
98
+ db
99
+ email:
100
+ - dzagidulin@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - Gemfile
107
+ - Gemfile.lock
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - lib/riagent/document.rb
112
+ - lib/riagent/document/version.rb
113
+ - riagent-document.gemspec
114
+ - test/examples/models/address_book.rb
115
+ - test/examples/models/user.rb
116
+ - test/test_helper.rb
117
+ - test/unit/document_test.rb
118
+ - test/unit/embedded_test.rb
119
+ - test/unit/json_conversion_test.rb
120
+ homepage: https://github.com/dmitrizagidulin/riagent-document
121
+ licenses:
122
+ - Apache 2.0
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubyforge_project:
140
+ rubygems_version: 2.2.1
141
+ signing_key:
142
+ specification_version: 4
143
+ summary: Ruby object to JSON document conversion format, for persistence to Riak db
144
+ test_files:
145
+ - test/examples/models/address_book.rb
146
+ - test/examples/models/user.rb
147
+ - test/test_helper.rb
148
+ - test/unit/document_test.rb
149
+ - test/unit/embedded_test.rb
150
+ - test/unit/json_conversion_test.rb