shadydb 0.1.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/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 jdpace
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,60 @@
1
+ # ShadyDB
2
+
3
+ ShadyDB is a document persistence layer that speaks ActiveModel.
4
+ Like it's name says it is _shady_ and is **merely impersonating a database**.
5
+ Its saves records/documents to the file system as XML or JSON files.
6
+
7
+ In general you should use a traditional database for 99.999% of cases. Real databases
8
+ handle this type of thing way better. If you think ShadyDB is really the way to
9
+ go, think again because you're probably mistaken. ShadyDB is just a ActiveRecord like
10
+ wrapper for the file system and lacks traditional data integrity schemes.
11
+
12
+ ShadyDB is built on top of ActiveModel and as a result is a great learning tool for
13
+ understanding the modularity and power that ActiveModel brings. I highly encourage
14
+ anyone to spend the time to write their own ORM.
15
+
16
+ ## Usage
17
+
18
+ class User < ShadyDB::Document
19
+ end
20
+
21
+ u = User.new(:name => 'Marshall Mathers')
22
+ u.new_record? # true
23
+ u.save # true
24
+ u.new_record? # false
25
+
26
+ u.name # 'Marshall Mathers'
27
+ u[:name] # 'Marshall Mathers'
28
+
29
+ u = User.create(:name => 'Eminem')
30
+ u.new_record? # false
31
+
32
+
33
+ ## Configuration
34
+
35
+ ShadyDB.configure do |config|
36
+ config.data_directory = Rails.root.join('db','shadydb')
37
+ config.format = :xml
38
+ end
39
+
40
+ ## TODO
41
+
42
+ * Add an optional encryption layer
43
+ * Add support for collection finders
44
+ * Add support for conditional finders
45
+ * Add simple indexing
46
+ * Add defined fields a la Mongoid
47
+
48
+ ## Note on Patches/Pull Requests
49
+
50
+ * Fork the project.
51
+ * Make your feature addition or bug fix.
52
+ * Add tests for it. This is important so I don't break it in a
53
+ future version unintentionally.
54
+ * Commit, do not mess with rakefile, version, or history.
55
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
56
+ * Send me a pull request. Bonus points for topic branches.
57
+
58
+ ## Copyright
59
+
60
+ Copyright (c) 2010 Jared Pace. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "shadydb"
8
+ gem.summary = %Q{XML/JSON persistence layer that speaks ActiveModel}
9
+ gem.description = %Q{ORM that persists to file system using either XML or JSON with optional encryption layer.}
10
+ gem.email = "jared@codewordstudios.com"
11
+ gem.homepage = "http://github.com/jdpace/shadydb"
12
+ gem.authors = ["jdpace"]
13
+ gem.add_dependency "activemodel", '~> 3.0.0.beta3'
14
+ gem.add_dependency "activesupport", '~> 3.0.0.beta3'
15
+ gem.add_development_dependency "shoulda", ">= 0"
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
22
+
23
+ require 'rake/testtask'
24
+ Rake::TestTask.new(:test) do |test|
25
+ test.libs << 'lib' << 'test'
26
+ test.pattern = 'test/**/*_test.rb'
27
+ test.verbose = true
28
+ end
29
+
30
+ begin
31
+ require 'rcov/rcovtask'
32
+ Rcov::RcovTask.new do |test|
33
+ test.libs << 'test'
34
+ test.pattern = 'test/**/test_*.rb'
35
+ test.verbose = true
36
+ end
37
+ rescue LoadError
38
+ task :rcov do
39
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
40
+ end
41
+ end
42
+
43
+ task :test => :check_dependencies
44
+
45
+ task :default => :test
46
+
47
+ require 'rake/rdoctask'
48
+ Rake::RDocTask.new do |rdoc|
49
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
50
+
51
+ rdoc.rdoc_dir = 'rdoc'
52
+ rdoc.title = "shadydb #{version}"
53
+ rdoc.rdoc_files.include('README*')
54
+ rdoc.rdoc_files.include('lib/**/*.rb')
55
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,34 @@
1
+ module ShadyDB
2
+
3
+ module Attributes
4
+
5
+ def self.included(base)
6
+ base.class_eval do
7
+ attr_accessor :id, :attributes
8
+ end
9
+ end
10
+
11
+ def [](key)
12
+ attributes[key.to_s]
13
+ end
14
+
15
+ def []=(key, value)
16
+ attributes[key.to_s] = value
17
+ end
18
+
19
+ # Used for allowing accessor methods for dynamic attributes.
20
+ # Pulled from Mongoid
21
+ def method_missing(name, *args)
22
+ attr = name.to_s
23
+ return super unless @attributes.has_key?(attr.reader)
24
+ if attr.writer?
25
+ # "args.size > 1" allows to simulate 1.8 behavior of "*args"
26
+ @attributes[attr.reader] = (args.size > 1) ? args : args.first
27
+ else
28
+ @attributes[attr.reader]
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,33 @@
1
+ module ShadyDB
2
+ class Configuration
3
+ attr_accessor :data_directory, :format
4
+
5
+ def initialize
6
+ @data_directory = '/data/db'
7
+ @format = :json
8
+ end
9
+ end
10
+
11
+ class << self
12
+ attr_accessor :configuration
13
+ end
14
+
15
+ # Configure ShadyDB someplace sensible,
16
+ # like config/initializers/shadydb.rb
17
+ #
18
+ # @example
19
+ # ShadyDB.configure do |config|
20
+ # config.data_directory = Rails.root.join('db','shadydb')
21
+ # config.format = :json
22
+ # end
23
+
24
+ def self.configuration
25
+ @configuration ||= Configuration.new
26
+ end
27
+
28
+
29
+ def self.configure
30
+ self.configuration
31
+ yield(configuration)
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ module ShadyDB
2
+
3
+ class Document
4
+ extend ActiveModel::Callbacks
5
+ include ActiveModel::Validations
6
+ include ShadyDB::Attributes
7
+ include ShadyDB::Persistence
8
+ include ShadyDB::Finders
9
+
10
+ before_save :validate
11
+
12
+ def initialize(attribs = {})
13
+ @new_record = true
14
+ @destroyed = false
15
+
16
+ self.attributes = {}
17
+ self.attributes = attribs.stringify_keys if attribs.kind_of?(Hash)
18
+ end
19
+
20
+ def to_model
21
+ self
22
+ end
23
+
24
+ def to_param
25
+ id
26
+ end
27
+
28
+ def to_key
29
+ persisted? ? [id] : nil
30
+ end
31
+
32
+ protected
33
+
34
+ def validate
35
+ valid?
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,21 @@
1
+ module ShadyDB
2
+
3
+ module Extensions
4
+
5
+ module String
6
+
7
+ module Helpers
8
+ def reader
9
+ writer? ? gsub("=", "") : self
10
+ end
11
+
12
+ def writer?
13
+ include?("=")
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,5 @@
1
+ require 'shadydb/extensions/string/helpers'
2
+
3
+ class String
4
+ include ShadyDB::Extensions::String::Helpers
5
+ end
@@ -0,0 +1,27 @@
1
+ module ShadyDB
2
+
3
+ module Finders
4
+
5
+ def self.included(base)
6
+ base.class_eval do
7
+ extend ClassMethods
8
+ end
9
+ end
10
+
11
+ module ClassMethods
12
+ def find(id)
13
+ document = self.new
14
+ document.instance_variable_set('@id', id)
15
+
16
+ return false unless File.exist?(document.path)
17
+ storage = File.read(document.path)
18
+
19
+ document.send(:restore!, storage)
20
+ document.instance_variable_set('@new_record', false)
21
+ document
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,117 @@
1
+ module ShadyDB
2
+
3
+ module Persistence
4
+ extend ActiveSupport::Concern
5
+ include ActiveModel::Serializers::JSON
6
+ include ActiveModel::Serializers::Xml
7
+
8
+ def self.included(base)
9
+ base.class_eval do
10
+ define_model_callbacks :save, :create, :update, :destroy
11
+
12
+ before_create :ensure_data_directory_exists
13
+
14
+ extend ClassMethods
15
+ end
16
+ end
17
+
18
+ module ClassMethods
19
+ def create(attribs = {})
20
+ document = new(attribs)
21
+ document.save && document
22
+ end
23
+
24
+ def data_directory
25
+ File.join(ShadyDB.configuration.data_directory, self.model_name.plural)
26
+ end
27
+ end
28
+
29
+ def save
30
+ _run_save_callbacks do
31
+ create_or_update
32
+ end
33
+ end
34
+
35
+ def update_attributes(attribs)
36
+ @attributes.merge!(attribs.stringify_keys)
37
+ save
38
+ end
39
+
40
+ def destroy
41
+ return false unless persisted?
42
+ begin
43
+ File.delete(path)
44
+ @destroyed = true
45
+ rescue
46
+ false
47
+ end
48
+ end
49
+
50
+ def persisted?
51
+ !(new_record? || destroyed?)
52
+ end
53
+
54
+ def new_record?
55
+ @new_record
56
+ end
57
+
58
+ def destroyed?
59
+ @destroyed
60
+ end
61
+
62
+ def path
63
+ File.join(self.class.data_directory, @id)
64
+ end
65
+
66
+ protected
67
+
68
+ def ensure_data_directory_exists
69
+ self.class.data_directory.split('/').inject do |base, dir_name|
70
+ dir = File.join(base, dir_name)
71
+ Dir.mkdir(dir) unless File.exist?(dir)
72
+ dir
73
+ end
74
+ end
75
+
76
+ def create_or_update
77
+ persisted? ? update : create
78
+ end
79
+
80
+ def create
81
+ _run_create_callbacks do
82
+ @id = generate_id
83
+ persist!
84
+ @new_record = false
85
+
86
+ true
87
+ end
88
+ end
89
+
90
+ def update
91
+ _run_update_callbacks do
92
+ File.open(path,'w') do |storage|
93
+ storage << self.to_xml
94
+ end
95
+
96
+ true
97
+ end
98
+ end
99
+
100
+ def persist!
101
+ File.open(path,'w') do |storage|
102
+ storage << self.send(:"to_#{ShadyDB.configuration.format}")
103
+ end
104
+ end
105
+
106
+ def restore!(xml_or_json)
107
+ send(:"from_#{ShadyDB.configuration.format}" ,xml_or_json)
108
+ end
109
+
110
+ # TODO: should check if ID is already taken
111
+ def generate_id
112
+ ActiveSupport::SecureRandom.hex()
113
+ end
114
+
115
+ end
116
+
117
+ end
data/lib/shadydb.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'active_support'
3
+ require 'active_model'
4
+ require 'shadydb/configuration'
5
+ require 'shadydb/extensions'
6
+ require 'shadydb/attributes'
7
+ require 'shadydb/persistence'
8
+ require 'shadydb/finders'
9
+ require 'shadydb/document'
data/shadydb.gemspec ADDED
@@ -0,0 +1,75 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{shadydb}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["jdpace"]
12
+ s.date = %q{2010-05-17}
13
+ s.description = %q{ORM that persists to file system using either XML or JSON with optional encryption layer.}
14
+ s.email = %q{jared@codewordstudios.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.markdown"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.markdown",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/shadydb.rb",
27
+ "lib/shadydb/attributes.rb",
28
+ "lib/shadydb/configuration.rb",
29
+ "lib/shadydb/document.rb",
30
+ "lib/shadydb/extensions.rb",
31
+ "lib/shadydb/extensions/string/helpers.rb",
32
+ "lib/shadydb/finders.rb",
33
+ "lib/shadydb/persistence.rb",
34
+ "shadydb.gemspec",
35
+ "test/attributes_test.rb",
36
+ "test/configuration_test.rb",
37
+ "test/document_test.rb",
38
+ "test/finders_test.rb",
39
+ "test/helper.rb",
40
+ "test/persistence_test.rb"
41
+ ]
42
+ s.homepage = %q{http://github.com/jdpace/shadydb}
43
+ s.rdoc_options = ["--charset=UTF-8"]
44
+ s.require_paths = ["lib"]
45
+ s.rubygems_version = %q{1.3.6}
46
+ s.summary = %q{XML/JSON persistence layer that speaks ActiveModel}
47
+ s.test_files = [
48
+ "test/attributes_test.rb",
49
+ "test/configuration_test.rb",
50
+ "test/document_test.rb",
51
+ "test/finders_test.rb",
52
+ "test/helper.rb",
53
+ "test/persistence_test.rb"
54
+ ]
55
+
56
+ if s.respond_to? :specification_version then
57
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
58
+ s.specification_version = 3
59
+
60
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
61
+ s.add_runtime_dependency(%q<activemodel>, ["~> 3.0.0.beta3"])
62
+ s.add_runtime_dependency(%q<activesupport>, ["~> 3.0.0.beta3"])
63
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
64
+ else
65
+ s.add_dependency(%q<activemodel>, ["~> 3.0.0.beta3"])
66
+ s.add_dependency(%q<activesupport>, ["~> 3.0.0.beta3"])
67
+ s.add_dependency(%q<shoulda>, [">= 0"])
68
+ end
69
+ else
70
+ s.add_dependency(%q<activemodel>, ["~> 3.0.0.beta3"])
71
+ s.add_dependency(%q<activesupport>, ["~> 3.0.0.beta3"])
72
+ s.add_dependency(%q<shoulda>, [">= 0"])
73
+ end
74
+ end
75
+
@@ -0,0 +1,35 @@
1
+ require 'helper'
2
+
3
+ class AttributesTest < Test::Unit::TestCase
4
+
5
+ subject do
6
+ @subject = ShadyDB::Document.new
7
+ end
8
+
9
+ context "Supporting hash-like interface for attributes" do
10
+ should "allow reading attributes via []" do
11
+ document = ShadyDB::Document.new :first_name => 'John', :last_name => 'Locke'
12
+ assert document[:first_name] == 'John'
13
+ end
14
+
15
+ should "allow setting attribures via []=" do
16
+ document = ShadyDB::Document.new
17
+ document[:name] = 'Jack Shepard'
18
+ assert document.attributes['name'] == 'Jack Shepard'
19
+ end
20
+ end
21
+
22
+ context "Treating attribute keys like top level methods" do
23
+ should "support top level methods for reading attributes" do
24
+ document = ShadyDB::Document.new :first_name => 'John', :last_name => 'Locke'
25
+ assert document.first_name == 'John'
26
+ end
27
+
28
+ should 'support top level methods for setting attributes' do
29
+ document = ShadyDB::Document.new :name => 'Hugo'
30
+ document.name = 'Jack Shepard'
31
+ assert document.attributes['name'] == 'Jack Shepard'
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,31 @@
1
+ require 'helper'
2
+
3
+ class ConfigurationTest < Test::Unit::TestCase
4
+
5
+ context "Configuration" do
6
+ should "have defaults" do
7
+ config = ShadyDB::Configuration.new
8
+ assert config.data_directory
9
+ assert config.format
10
+ end
11
+
12
+ should "be accessible from ShadyDB.configuration" do
13
+ assert ShadyDB.configuration.kind_of?(ShadyDB::Configuration)
14
+ end
15
+
16
+ should "be configurable" do
17
+ original_config = ShadyDB.configuration
18
+ ShadyDB.configuration = ShadyDB::Configuration.new
19
+ ShadyDB.configure do |config|
20
+ config.data_directory = '/shadydb'
21
+ config.format = :xml
22
+ end
23
+
24
+ assert ShadyDB.configuration.data_directory == '/shadydb'
25
+ assert ShadyDB.configuration.format == :xml
26
+
27
+ ShadyDB.configuration = original_config
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,9 @@
1
+ require 'helper'
2
+
3
+ class DocumentTest < Test::Unit::TestCase
4
+ include ActiveModel::Lint::Tests
5
+
6
+ def setup
7
+ @model = ShadyDB::Document.new
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ require 'helper'
2
+
3
+ class FindersTest < Test::Unit::TestCase
4
+
5
+ context "Finding a document by its ID" do
6
+ should "load the document exactly as it was saved" do
7
+ original = ShadyDB::Document.create :name => 'Sawyer'
8
+ found = ShadyDB::Document.find original.id
9
+
10
+ assert found.id == original.id
11
+ assert found.name == original.name
12
+ assert found.attributes == original.attributes
13
+ end
14
+ end
15
+
16
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'shadydb'
8
+
9
+ class Test::Unit::TestCase
10
+
11
+ def teardown
12
+ purge_documents
13
+ end
14
+
15
+ def purge_documents
16
+ FileUtils.rm_rf(File.join(File.expand_path(File.dirname(__FILE__)), 'db'))
17
+ end
18
+
19
+ end
20
+
21
+ ShadyDB.configure do |config|
22
+ config.data_directory = File.join(File.expand_path(File.dirname(__FILE__)), 'db')
23
+ end
@@ -0,0 +1,64 @@
1
+ require 'helper'
2
+
3
+ class PersistenceTest < Test::Unit::TestCase
4
+
5
+ context "Creating a new document" do
6
+ should "Save and return a document" do
7
+ @document = ShadyDB::Document.create :name => 'Dharma Initiative'
8
+ assert @document.persisted?
9
+ assert File.exist?(@document.path)
10
+ end
11
+ end
12
+
13
+ context "Saving a new document" do
14
+ setup do
15
+ @document = ShadyDB::Document.new :name => 'Dharma Initiative'
16
+ end
17
+
18
+ should "save the document to the file system" do
19
+ assert @document.save
20
+ assert File.exist?(@document.path)
21
+ end
22
+ end
23
+
24
+ context "Saving an existing document" do
25
+ setup do
26
+ @document = ShadyDB::Document.create :name => 'Dharma Initiative'
27
+ @before = File.new(@document.path).atime
28
+ end
29
+
30
+ should "update the document on the file system" do
31
+ assert @document.save
32
+ assert File.new(@document.path).atime >= @before
33
+ end
34
+ end
35
+
36
+ context "Updating an existing document" do
37
+ setup do
38
+ @document = ShadyDB::Document.create :name => 'Dharma Initiative'
39
+ @before = File.new(@document.path).atime
40
+ end
41
+
42
+ should "update the attributes" do
43
+ assert @document.update_attributes :location => 'The Island'
44
+ assert @document.location == 'The Island'
45
+ end
46
+
47
+ should "update the document on the file system" do
48
+ assert @document.update_attributes :location => 'The Island'
49
+ assert File.new(@document.path).atime >= @before
50
+ end
51
+ end
52
+
53
+ context "Destroying a document" do
54
+ setup do
55
+ @document = ShadyDB::Document.create :name => 'Dharma Initiative'
56
+ end
57
+
58
+ should "remove the document from the file system" do
59
+ assert @document.destroy
60
+ assert !File.exist?(@document.path)
61
+ end
62
+ end
63
+
64
+ end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shadydb
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - jdpace
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-05-17 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: activemodel
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 3
29
+ - 0
30
+ - 0
31
+ - beta3
32
+ version: 3.0.0.beta3
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: activesupport
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 3
44
+ - 0
45
+ - 0
46
+ - beta3
47
+ version: 3.0.0.beta3
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: shoulda
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ type: :development
61
+ version_requirements: *id003
62
+ description: ORM that persists to file system using either XML or JSON with optional encryption layer.
63
+ email: jared@codewordstudios.com
64
+ executables: []
65
+
66
+ extensions: []
67
+
68
+ extra_rdoc_files:
69
+ - LICENSE
70
+ - README.markdown
71
+ files:
72
+ - .document
73
+ - .gitignore
74
+ - LICENSE
75
+ - README.markdown
76
+ - Rakefile
77
+ - VERSION
78
+ - lib/shadydb.rb
79
+ - lib/shadydb/attributes.rb
80
+ - lib/shadydb/configuration.rb
81
+ - lib/shadydb/document.rb
82
+ - lib/shadydb/extensions.rb
83
+ - lib/shadydb/extensions/string/helpers.rb
84
+ - lib/shadydb/finders.rb
85
+ - lib/shadydb/persistence.rb
86
+ - shadydb.gemspec
87
+ - test/attributes_test.rb
88
+ - test/configuration_test.rb
89
+ - test/document_test.rb
90
+ - test/finders_test.rb
91
+ - test/helper.rb
92
+ - test/persistence_test.rb
93
+ has_rdoc: true
94
+ homepage: http://github.com/jdpace/shadydb
95
+ licenses: []
96
+
97
+ post_install_message:
98
+ rdoc_options:
99
+ - --charset=UTF-8
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ segments:
114
+ - 0
115
+ version: "0"
116
+ requirements: []
117
+
118
+ rubyforge_project:
119
+ rubygems_version: 1.3.6
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: XML/JSON persistence layer that speaks ActiveModel
123
+ test_files:
124
+ - test/attributes_test.rb
125
+ - test/configuration_test.rb
126
+ - test/document_test.rb
127
+ - test/finders_test.rb
128
+ - test/helper.rb
129
+ - test/persistence_test.rb