dynabix 0.3.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/.gemfiles +23 -0
- data/.gitattributes +1 -0
- data/.gitignore +7 -0
- data/.rspec +3 -0
- data/.yardopts +9 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +87 -0
- data/Guardfile +17 -0
- data/HISTORY.markdown +12 -0
- data/LICENSE +20 -0
- data/README.markdown +154 -0
- data/Rakefile +72 -0
- data/VERSION +1 -0
- data/dynabix.gemspec +61 -0
- data/lib/dynabix.rb +27 -0
- data/lib/dynabix/metadata.rb +147 -0
- data/spec/aruba_helper.rb +25 -0
- data/spec/basic_gem/aruba_helper_spec.rb +33 -0
- data/spec/basic_gem/basic_gem_spec.rb +84 -0
- data/spec/basic_gem/gemspec_spec.rb +68 -0
- data/spec/dynabix/metadata_spec.rb +137 -0
- data/spec/schema.rb +27 -0
- data/spec/spec_helper.rb +16 -0
- metadata +239 -0
data/.gemfiles
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
.gemfiles
|
|
2
|
+
.gitattributes
|
|
3
|
+
.gitignore
|
|
4
|
+
.rspec
|
|
5
|
+
.yardopts
|
|
6
|
+
Gemfile
|
|
7
|
+
Gemfile.lock
|
|
8
|
+
Guardfile
|
|
9
|
+
HISTORY.markdown
|
|
10
|
+
LICENSE
|
|
11
|
+
README.markdown
|
|
12
|
+
Rakefile
|
|
13
|
+
VERSION
|
|
14
|
+
dynabix.gemspec
|
|
15
|
+
lib/dynabix.rb
|
|
16
|
+
lib/dynabix/metadata.rb
|
|
17
|
+
spec/aruba_helper.rb
|
|
18
|
+
spec/basic_gem/aruba_helper_spec.rb
|
|
19
|
+
spec/basic_gem/basic_gem_spec.rb
|
|
20
|
+
spec/basic_gem/gemspec_spec.rb
|
|
21
|
+
spec/dynabix/metadata_spec.rb
|
|
22
|
+
spec/schema.rb
|
|
23
|
+
spec/spec_helper.rb
|
data/.gitattributes
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*.rb diff=ruby
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.yardopts
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
dynabix (0.3.0)
|
|
5
|
+
activerecord (~> 3.0)
|
|
6
|
+
|
|
7
|
+
GEM
|
|
8
|
+
remote: http://rubygems.org/
|
|
9
|
+
specs:
|
|
10
|
+
activemodel (3.2.3)
|
|
11
|
+
activesupport (= 3.2.3)
|
|
12
|
+
builder (~> 3.0.0)
|
|
13
|
+
activerecord (3.2.3)
|
|
14
|
+
activemodel (= 3.2.3)
|
|
15
|
+
activesupport (= 3.2.3)
|
|
16
|
+
arel (~> 3.0.2)
|
|
17
|
+
tzinfo (~> 0.3.29)
|
|
18
|
+
activesupport (3.2.3)
|
|
19
|
+
i18n (~> 0.6)
|
|
20
|
+
multi_json (~> 1.0)
|
|
21
|
+
arel (3.0.2)
|
|
22
|
+
aruba (0.4.5)
|
|
23
|
+
bcat (>= 0.6.1)
|
|
24
|
+
childprocess (>= 0.1.9)
|
|
25
|
+
cucumber (>= 0.10.7)
|
|
26
|
+
rdiscount (>= 1.6.8)
|
|
27
|
+
rspec (>= 2.6.0)
|
|
28
|
+
bcat (0.6.2)
|
|
29
|
+
rack (~> 1.0)
|
|
30
|
+
builder (3.0.0)
|
|
31
|
+
childprocess (0.3.1)
|
|
32
|
+
ffi (~> 1.0.6)
|
|
33
|
+
cucumber (1.1.9)
|
|
34
|
+
builder (>= 2.1.2)
|
|
35
|
+
diff-lcs (>= 1.1.2)
|
|
36
|
+
gherkin (~> 2.9.0)
|
|
37
|
+
json (>= 1.4.6)
|
|
38
|
+
term-ansicolor (>= 1.0.6)
|
|
39
|
+
diff-lcs (1.1.3)
|
|
40
|
+
ffi (1.0.11)
|
|
41
|
+
gherkin (2.9.0)
|
|
42
|
+
json (>= 1.4.6)
|
|
43
|
+
guard (1.0.1)
|
|
44
|
+
ffi (>= 0.5.0)
|
|
45
|
+
thor (~> 0.14.6)
|
|
46
|
+
guard-rspec (0.7.0)
|
|
47
|
+
guard (>= 0.10.0)
|
|
48
|
+
i18n (0.6.0)
|
|
49
|
+
json (1.6.6)
|
|
50
|
+
libnotify (0.7.2)
|
|
51
|
+
ffi (~> 1.0.0)
|
|
52
|
+
multi_json (1.3.4)
|
|
53
|
+
rack (1.4.1)
|
|
54
|
+
rake (0.9.2.2)
|
|
55
|
+
rdiscount (1.6.8)
|
|
56
|
+
redcarpet (2.1.0)
|
|
57
|
+
rspec (2.9.0)
|
|
58
|
+
rspec-core (~> 2.9.0)
|
|
59
|
+
rspec-expectations (~> 2.9.0)
|
|
60
|
+
rspec-mocks (~> 2.9.0)
|
|
61
|
+
rspec-core (2.9.0)
|
|
62
|
+
rspec-expectations (2.9.1)
|
|
63
|
+
diff-lcs (~> 1.1.3)
|
|
64
|
+
rspec-mocks (2.9.0)
|
|
65
|
+
sqlite3 (1.3.5)
|
|
66
|
+
sqlite3-ruby (1.3.3)
|
|
67
|
+
sqlite3 (>= 1.3.3)
|
|
68
|
+
term-ansicolor (1.0.7)
|
|
69
|
+
thor (0.14.6)
|
|
70
|
+
tzinfo (0.3.33)
|
|
71
|
+
yard (0.7.5)
|
|
72
|
+
|
|
73
|
+
PLATFORMS
|
|
74
|
+
ruby
|
|
75
|
+
|
|
76
|
+
DEPENDENCIES
|
|
77
|
+
aruba (= 0.4.5)
|
|
78
|
+
bundler (>= 1.0.14)
|
|
79
|
+
dynabix!
|
|
80
|
+
guard (~> 1.0)
|
|
81
|
+
guard-rspec (~> 0.6)
|
|
82
|
+
libnotify
|
|
83
|
+
rake (>= 0.8.7)
|
|
84
|
+
redcarpet (>= 1.17.2)
|
|
85
|
+
rspec (>= 2.6.0)
|
|
86
|
+
sqlite3-ruby (>= 0.8.7)
|
|
87
|
+
yard (>= 0.7.4)
|
data/Guardfile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
group :specs do
|
|
2
|
+
guard 'rspec',
|
|
3
|
+
:all_after_pass => false,
|
|
4
|
+
:all_on_start => false,
|
|
5
|
+
:cli => '--color --format nested --fail-fast',
|
|
6
|
+
:version => 2 do
|
|
7
|
+
|
|
8
|
+
watch(%r{^spec/.+_spec\.rb$})
|
|
9
|
+
watch('spec/spec_helper.rb') { "spec" }
|
|
10
|
+
|
|
11
|
+
# ex: lib/app_name/views.rb -> spec/app_name/views_spec.rb
|
|
12
|
+
watch(%r{^lib/(.+)/(.+)\.rb$}) { |m| "spec/#{m[1]}/#{m[2]}_spec.rb" }
|
|
13
|
+
|
|
14
|
+
# ex: lib/app_name/views/view_helper.rb -> spec/app_name/views/view_helper_spec.rb
|
|
15
|
+
watch(%r{^lib/(.+)/(.+)/(.+)\.rb$}) { |m| "spec/#{m[1]}/#{m[2]}/#{m[3]}_spec.rb" }
|
|
16
|
+
end
|
|
17
|
+
end
|
data/HISTORY.markdown
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2012 GearheadForHire, LLC
|
|
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,154 @@
|
|
|
1
|
+
Dynabix
|
|
2
|
+
========
|
|
3
|
+
|
|
4
|
+
An ActiveRecord 3.x Ruby gem for attribute serialization.
|
|
5
|
+
|
|
6
|
+
"Dy-na-bix, tasty serialization attribute accessors for ActiveRecord"
|
|
7
|
+
|
|
8
|
+
Overview
|
|
9
|
+
--------
|
|
10
|
+
|
|
11
|
+
Dynabix dynamically creates read/write accessors on ActiveRecord models for
|
|
12
|
+
storing attributes in a serialized Hash.
|
|
13
|
+
|
|
14
|
+
Installation
|
|
15
|
+
------------
|
|
16
|
+
|
|
17
|
+
Add to your Gemfile
|
|
18
|
+
|
|
19
|
+
gem "dynabix"
|
|
20
|
+
|
|
21
|
+
Install the gem
|
|
22
|
+
|
|
23
|
+
bundle install
|
|
24
|
+
|
|
25
|
+
Development
|
|
26
|
+
-----------
|
|
27
|
+
|
|
28
|
+
Get the source
|
|
29
|
+
|
|
30
|
+
cd workspace
|
|
31
|
+
|
|
32
|
+
git clone https://github.com/robertwahler/dynabix.git
|
|
33
|
+
|
|
34
|
+
cd dynabix
|
|
35
|
+
|
|
36
|
+
Install the dependencies
|
|
37
|
+
|
|
38
|
+
bundle install
|
|
39
|
+
|
|
40
|
+
Run the specs
|
|
41
|
+
|
|
42
|
+
bundle exec rake spec
|
|
43
|
+
|
|
44
|
+
Autotest with Guard
|
|
45
|
+
|
|
46
|
+
bundle exec guard
|
|
47
|
+
|
|
48
|
+
Usage Examples
|
|
49
|
+
--------------
|
|
50
|
+
|
|
51
|
+
### Ruby 1.8
|
|
52
|
+
|
|
53
|
+
Add a text column "metadata" to your model migration
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class AddMetadataToThings < ActiveRecord::Migration
|
|
57
|
+
|
|
58
|
+
def change
|
|
59
|
+
add_column :things, :metadata, :text
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
Add accessors to your model using the default column name ":metadata", specify
|
|
65
|
+
the attributes in a separate step.
|
|
66
|
+
|
|
67
|
+
class Thing < ActiveRecord::Base
|
|
68
|
+
has_metadata
|
|
69
|
+
|
|
70
|
+
# full accessors
|
|
71
|
+
metadata_accessor :breakfast_food, :wheat_products, :needs_milk
|
|
72
|
+
|
|
73
|
+
# read-only
|
|
74
|
+
metadata_reader :friends_with_spoons
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
Specifying attributes for full attributes accessors in one step
|
|
78
|
+
|
|
79
|
+
class Thing < ActiveRecord::Base
|
|
80
|
+
has_metadata :metadata, :breakfast_food, :wheat_products, :needs_milk
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
Using the new accessors
|
|
84
|
+
|
|
85
|
+
thing = Thing.new
|
|
86
|
+
|
|
87
|
+
thing.breakfast_food = 'a wheat like cereal"
|
|
88
|
+
|
|
89
|
+
# same thing, but not using the hash directly
|
|
90
|
+
thing.metadata[:breakfast_food] = 'a wheat like cereal"
|
|
91
|
+
|
|
92
|
+
### Ruby 1.9+
|
|
93
|
+
|
|
94
|
+
Dynabix under Ruby 1.9+ enables specifying multiple metadata columns on a model.
|
|
95
|
+
|
|
96
|
+
Add text columns "cows" and "chickens" to your model migration
|
|
97
|
+
|
|
98
|
+
class AddMetadataToThings < ActiveRecord::Migration
|
|
99
|
+
|
|
100
|
+
def change
|
|
101
|
+
add_column :things, :cows, :text
|
|
102
|
+
add_column :things, :chickens, :text
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
Specifying multiple metadata serializers (Ruby 1.9 only)
|
|
108
|
+
|
|
109
|
+
class Thing < ActiveRecord::Base
|
|
110
|
+
has_metadata :cows
|
|
111
|
+
has_metadata :chickens, :tasty, :feather_count
|
|
112
|
+
|
|
113
|
+
# read-only
|
|
114
|
+
cow_reader :likes_milk, :hates_eggs
|
|
115
|
+
|
|
116
|
+
# write-only
|
|
117
|
+
cow_writer :no_wheat_products
|
|
118
|
+
|
|
119
|
+
# extra full accessors for chickens
|
|
120
|
+
chicken_accessor :color, :likes_eggs
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
Runtime dependencies
|
|
124
|
+
--------------------
|
|
125
|
+
|
|
126
|
+
* Activerecord 3.x
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
Development dependencies
|
|
130
|
+
---------------------
|
|
131
|
+
|
|
132
|
+
* Bundler for dependency management <http://github.com/carlhuda/bundler>
|
|
133
|
+
* Rspec for unit testing <http://github.com/rspec/rspec>
|
|
134
|
+
* Yard for documentation generation <http://github.com/lsegal/yard>
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
Rake tasks
|
|
138
|
+
----------
|
|
139
|
+
|
|
140
|
+
bundle exec rake -T
|
|
141
|
+
|
|
142
|
+
rake build # Build dynabix-0.0.2.gem into the pkg directory
|
|
143
|
+
rake doc:clean # Remove generated documenation
|
|
144
|
+
rake doc:generate # Generate YARD Documentation
|
|
145
|
+
rake doc:undocumented # List undocumented objects
|
|
146
|
+
rake gemfiles # Generate .gemfiles via 'git ls-files'
|
|
147
|
+
rake install # Build and install dynabix-0.0.2.gem into system gems
|
|
148
|
+
rake release # Create tag v0.0.2 and build and push dynabix-0.0.2.gem to Rubygems
|
|
149
|
+
rake spec # Run RSpec
|
|
150
|
+
|
|
151
|
+
Copyright
|
|
152
|
+
---------
|
|
153
|
+
|
|
154
|
+
Copyright (c) 2012 GearheadForHire, LLC. See [LICENSE](LICENSE) for details.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
# Bundler is managing $LOAD_PATH, any gem needed by this Rakefile must be
|
|
4
|
+
# listed as a development dependency in the gemspec
|
|
5
|
+
require 'bundler/setup'
|
|
6
|
+
require 'bundler/gem_tasks'
|
|
7
|
+
|
|
8
|
+
require 'rspec/core/rake_task'
|
|
9
|
+
desc "Run RSpec"
|
|
10
|
+
RSpec::Core::RakeTask.new do |spec|
|
|
11
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
task :default => :spec
|
|
15
|
+
|
|
16
|
+
namespace :doc do
|
|
17
|
+
|
|
18
|
+
doc_version = File.open(File.join(File.dirname(__FILE__), 'VERSION'), "r") { |f| f.read }
|
|
19
|
+
project_root = File.expand_path(File.dirname(__FILE__))
|
|
20
|
+
doc_destination = File.join(project_root, 'rdoc')
|
|
21
|
+
|
|
22
|
+
require 'yard'
|
|
23
|
+
|
|
24
|
+
YARD::Rake::YardocTask.new(:generate) do |yt|
|
|
25
|
+
yt.options = ['--output-dir', doc_destination,
|
|
26
|
+
'--title', "Dynabix #{doc_version} Documentation",
|
|
27
|
+
'--main', "README.markdown"
|
|
28
|
+
]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
desc "Remove generated documenation"
|
|
32
|
+
task :clean do
|
|
33
|
+
rm_r doc_destination if File.exists?(doc_destination)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
desc "List undocumented objects"
|
|
37
|
+
task :undocumented do
|
|
38
|
+
system('yard stats --list-undoc')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# put the gemfiles task in the bundler dependency chain
|
|
44
|
+
task :build => [:gemfiles]
|
|
45
|
+
task :install => [:gemfiles]
|
|
46
|
+
task :release => [:gemfiles]
|
|
47
|
+
|
|
48
|
+
desc "Generate .gemfiles via 'git ls-files'"
|
|
49
|
+
task :gemfiles do
|
|
50
|
+
files = `git ls-files`
|
|
51
|
+
|
|
52
|
+
filename = File.join(File.dirname(__FILE__), '.gemfiles')
|
|
53
|
+
cached_files = nil
|
|
54
|
+
if File.exists?(filename)
|
|
55
|
+
puts ".gemfiles exists, reading..."
|
|
56
|
+
cached_files = File.open(filename, "rb") {|f| f.read}
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
if cached_files && cached_files.match("\r\n")
|
|
60
|
+
puts ".gemfiles using DOS EOL"
|
|
61
|
+
files.gsub!(/\n/, "\r\n")
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if cached_files != files
|
|
65
|
+
puts ".gemfiles updating"
|
|
66
|
+
File.open(filename, 'wb') {|f| f.write(files)}
|
|
67
|
+
else
|
|
68
|
+
puts ".gemfiles update not required"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
raise "unable to process .gemfiles" unless files
|
|
72
|
+
end
|
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.3.0
|
data/dynabix.gemspec
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#
|
|
4
|
+
Gem::Specification.new do |s|
|
|
5
|
+
|
|
6
|
+
# avoid shelling out to run git every time the gemspec is evaluated
|
|
7
|
+
#
|
|
8
|
+
# @see spec/gemspec_spec.rb
|
|
9
|
+
#
|
|
10
|
+
gemfiles_cache = File.join(File.dirname(__FILE__), '.gemfiles')
|
|
11
|
+
if File.exists?(gemfiles_cache)
|
|
12
|
+
gemfiles = File.open(gemfiles_cache, "r") {|f| f.read}
|
|
13
|
+
# normalize EOL
|
|
14
|
+
gemfiles.gsub!(/\r\n/, "\n")
|
|
15
|
+
else
|
|
16
|
+
# .gemfiles missing, run 'rake gemfiles' to create it
|
|
17
|
+
# falling back to 'git ls-files'"
|
|
18
|
+
gemfiles = `git ls-files`
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
s.name = "dynabix"
|
|
22
|
+
s.version = File.open(File.join(File.dirname(__FILE__), 'VERSION'), "r") { |f| f.read }
|
|
23
|
+
s.platform = Gem::Platform::RUBY
|
|
24
|
+
s.authors = ["Robert Wahler"]
|
|
25
|
+
s.email = ["robert@gearheadforhire.com"]
|
|
26
|
+
s.homepage = "http://rubygems.org/gems/dynabix"
|
|
27
|
+
s.summary = "An ActiveRecord 3.x Ruby gem for attribute serialization"
|
|
28
|
+
s.description = "Dynabix dynamically creates read/write accessors on ActiveRecord models for storing attributes in a serialized Hash"
|
|
29
|
+
|
|
30
|
+
s.required_rubygems_version = ">= 1.3.6"
|
|
31
|
+
s.rubyforge_project = "dynabix"
|
|
32
|
+
|
|
33
|
+
s.add_dependency "activerecord", "~> 3.0"
|
|
34
|
+
|
|
35
|
+
s.add_development_dependency "bundler", ">= 1.0.14"
|
|
36
|
+
s.add_development_dependency "rspec", ">= 2.6.0"
|
|
37
|
+
s.add_development_dependency "aruba", "= 0.4.5"
|
|
38
|
+
s.add_development_dependency "rake", ">= 0.8.7"
|
|
39
|
+
s.add_development_dependency "sqlite3-ruby", ">= 0.8.7"
|
|
40
|
+
|
|
41
|
+
# doc generation
|
|
42
|
+
s.add_development_dependency "yard", ">= 0.7.4"
|
|
43
|
+
s.add_development_dependency "redcarpet", ">= 1.17.2"
|
|
44
|
+
|
|
45
|
+
# guard, watches files and runs specs and features
|
|
46
|
+
#
|
|
47
|
+
# @see Gemfile for platform specific dependencies
|
|
48
|
+
s.add_development_dependency "guard", "~> 1.0"
|
|
49
|
+
s.add_development_dependency "guard-rspec", "~> 0.6"
|
|
50
|
+
|
|
51
|
+
s.files = gemfiles.split("\n")
|
|
52
|
+
s.executables = gemfiles.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
|
53
|
+
s.require_paths = ["lib"]
|
|
54
|
+
|
|
55
|
+
s.rdoc_options = [
|
|
56
|
+
'--title', 'Dynabix Documentation',
|
|
57
|
+
'--main', 'README.markdown',
|
|
58
|
+
'--line-numbers',
|
|
59
|
+
'--inline-source'
|
|
60
|
+
]
|
|
61
|
+
end
|
data/lib/dynabix.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# require all files here
|
|
2
|
+
require 'rbconfig'
|
|
3
|
+
require 'dynabix/metadata'
|
|
4
|
+
|
|
5
|
+
# Master namespace
|
|
6
|
+
module Dynabix
|
|
7
|
+
|
|
8
|
+
# Contents of the VERSION file
|
|
9
|
+
#
|
|
10
|
+
# Example format: 0.0.1
|
|
11
|
+
#
|
|
12
|
+
# @return [String] the contents of the version file in #.#.# format
|
|
13
|
+
def self.version
|
|
14
|
+
version_info_file = File.join(File.dirname(__FILE__), *%w[.. VERSION])
|
|
15
|
+
File.open(version_info_file, "r") do |f|
|
|
16
|
+
f.read.strip
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Platform constants
|
|
21
|
+
unless defined?(Dynabix::WINDOWS)
|
|
22
|
+
WINDOWS = RbConfig::CONFIG['host_os'] =~ /mswin|mingw/i
|
|
23
|
+
CYGWIN = RbConfig::CONFIG['host_os'] =~ /cygwin/i
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
require 'active_record'
|
|
2
|
+
|
|
3
|
+
# An ActiveRecord 3.x Ruby gem for attribute serialization.
|
|
4
|
+
module Dynabix
|
|
5
|
+
|
|
6
|
+
# Extending ActiveRecord with dynamic accessors for serialization
|
|
7
|
+
module Metadata
|
|
8
|
+
|
|
9
|
+
# Set up the model for serialization to a HashWithIndifferentAccess.
|
|
10
|
+
#
|
|
11
|
+
# @example Using the default column name ":metadata", specify the attributes in a separate step
|
|
12
|
+
#
|
|
13
|
+
# class Thing < ActiveRecord::Base
|
|
14
|
+
# has_metadata
|
|
15
|
+
#
|
|
16
|
+
# # full accessors
|
|
17
|
+
# metadata_accessor :breakfast_food, :wheat_products, :needs_milk
|
|
18
|
+
#
|
|
19
|
+
# # read-only
|
|
20
|
+
# metadata_reader :friends_with_spoons
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# @example Specifying attributes for full attributes accessors in one step
|
|
24
|
+
#
|
|
25
|
+
# class Thing < ActiveRecord::Base
|
|
26
|
+
# has_metadata :metadata, :breakfast_food, :wheat_products, :needs_milk
|
|
27
|
+
# end
|
|
28
|
+
#
|
|
29
|
+
# @example Specifying multiple metadata serializers (Ruby 1.9 only)
|
|
30
|
+
#
|
|
31
|
+
# class Thing < ActiveRecord::Base
|
|
32
|
+
# has_metadata :cows
|
|
33
|
+
# has_metadata :chickens, :tasty, :feather_count
|
|
34
|
+
#
|
|
35
|
+
# # read-only
|
|
36
|
+
# cow_reader :likes_milk, :hates_eggs
|
|
37
|
+
#
|
|
38
|
+
# # write-only
|
|
39
|
+
# cow_writer :no_wheat_products
|
|
40
|
+
#
|
|
41
|
+
# # extra full accessors for chickens
|
|
42
|
+
# chicken_accessor :color, :likes_eggs
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
# @param [Symbol] serializer, the symbolized name (:metadata) of the database text column used for serialization
|
|
46
|
+
# @param [Array<Symbol>] optional list of attribute names to add to the model as full accessors
|
|
47
|
+
#
|
|
48
|
+
# @return [void]
|
|
49
|
+
def has_metadata(serializer=:metadata, *attributes)
|
|
50
|
+
serialize(serializer, HashWithIndifferentAccess)
|
|
51
|
+
|
|
52
|
+
if RUBY_VERSION < '1.9'
|
|
53
|
+
raise "has_metadata serializer must be named ':metadata', this restriction is lifted in Ruby 1.9+" unless serializer == :metadata
|
|
54
|
+
else
|
|
55
|
+
# we can safely define additional accessors, Ruby 1.8 will only
|
|
56
|
+
# be able to use the statically defined :metadata_accessor
|
|
57
|
+
if serializer != :metadata
|
|
58
|
+
|
|
59
|
+
# define the class accessor
|
|
60
|
+
define_singleton_method "#{serializer}_accessor" do |*attrs|
|
|
61
|
+
attrs.each do |attr|
|
|
62
|
+
create_reader(serializer, attr)
|
|
63
|
+
create_writer(serializer, attr)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# define the class read accessor
|
|
68
|
+
define_singleton_method "#{serializer}_reader" do |*attrs|
|
|
69
|
+
attrs.each do |attr|
|
|
70
|
+
create_reader(serializer, attr)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# define the class write accessor
|
|
75
|
+
define_singleton_method "#{serializer}_writer" do |*attrs|
|
|
76
|
+
attrs.each do |attr|
|
|
77
|
+
create_writer(serializer, attr)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Define each of the attributes for this serializer
|
|
85
|
+
attributes.each do |attr|
|
|
86
|
+
create_reader(serializer, attr)
|
|
87
|
+
create_writer(serializer, attr)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Default read/write accessor, user defined accessors are available under Ruby 1.9+
|
|
92
|
+
#
|
|
93
|
+
# @param [Array<Symbol>] attributes
|
|
94
|
+
#
|
|
95
|
+
# @return [void]
|
|
96
|
+
def metadata_accessor(*attrs)
|
|
97
|
+
attrs.each do |attr|
|
|
98
|
+
create_reader(:metadata, attr)
|
|
99
|
+
create_writer(:metadata, attr)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Default read accessor (getter), user defined accessors are available under Ruby 1.9+
|
|
104
|
+
#
|
|
105
|
+
# @param [Array<Symbol>] attributes
|
|
106
|
+
#
|
|
107
|
+
# @return [void]
|
|
108
|
+
def metadata_reader(*attrs)
|
|
109
|
+
attrs.each do |attr|
|
|
110
|
+
create_reader(:metadata, attr)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Default write accessor (setter), user defined accessors are available under Ruby 1.9+
|
|
115
|
+
#
|
|
116
|
+
# @param [Array<Symbol>] attributes
|
|
117
|
+
#
|
|
118
|
+
# @return [void]
|
|
119
|
+
def metadata_writer(*attrs)
|
|
120
|
+
attrs.each do |attr|
|
|
121
|
+
create_writer(:metadata, attr)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
private
|
|
126
|
+
|
|
127
|
+
def create_accessor(serializer, attr)
|
|
128
|
+
create_reader(serializer, attr)
|
|
129
|
+
create_writer(serializer, attr)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def create_reader(serializer, attr)
|
|
133
|
+
define_method("#{attr}".to_sym) do
|
|
134
|
+
self[serializer][attr.to_sym]
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def create_writer(serializer, attr)
|
|
139
|
+
define_method("#{attr}=".to_sym) do |value|
|
|
140
|
+
self[serializer][attr.to_sym] = value
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
ActiveRecord::Base.extend Dynabix::Metadata
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Aruba
|
|
2
|
+
module Api
|
|
3
|
+
|
|
4
|
+
# @return full path to files in the aruba tmp folder
|
|
5
|
+
def fullpath(filename)
|
|
6
|
+
path = File.expand_path(File.join(current_dir, filename))
|
|
7
|
+
if path.match(/^\/cygdrive/)
|
|
8
|
+
# match /cygdrive/c/path/to and return c:\\path\\to
|
|
9
|
+
path = `cygpath -w #{path}`.chomp
|
|
10
|
+
elsif path.match(/.\:/)
|
|
11
|
+
# match c:/path/to and return c:\\path\\to
|
|
12
|
+
path = path.gsub(/\//, '\\')
|
|
13
|
+
end
|
|
14
|
+
path
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @return the contents of "filename" in the aruba tmp folder
|
|
18
|
+
def get_file_contents(filename)
|
|
19
|
+
in_current_dir do
|
|
20
|
+
IO.read(filename)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Dynabix do
|
|
4
|
+
|
|
5
|
+
before(:each) do
|
|
6
|
+
@filename = 'input.txt'
|
|
7
|
+
write_file(@filename, "the quick brown fox")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe 'Aruba::API.current_dir' do
|
|
11
|
+
|
|
12
|
+
it "should return the current dir as 'tmp/aruba'" do
|
|
13
|
+
current_dir.should match(/^tmp\/aruba$/)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "aruba_helper fullpath('input.txt')" do
|
|
18
|
+
|
|
19
|
+
it "should return a valid expanded path to 'input.txt'" do
|
|
20
|
+
path = fullpath('input.txt')
|
|
21
|
+
path.should match(/tmp..*aruba/)
|
|
22
|
+
File.exists?(path).should == true
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "aruba_helper get_file_contents('input.txt')" do
|
|
27
|
+
|
|
28
|
+
it "should return the contents of 'input.txt' as a String" do
|
|
29
|
+
get_file_contents('input.txt').should == 'the quick brown fox'
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Dynabix do
|
|
4
|
+
|
|
5
|
+
describe 'version' do
|
|
6
|
+
|
|
7
|
+
it "should return a string formatted '#.#.#'" do
|
|
8
|
+
Dynabix::version.should match(/(^[\d]+\.[\d]+\.[\d]+$)/)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# VIM autocmd to remove trailing whitespace
|
|
14
|
+
# autocmd BufWritePre * :%s/\s\+$//e
|
|
15
|
+
#
|
|
16
|
+
describe "code" do
|
|
17
|
+
|
|
18
|
+
before(:each) do
|
|
19
|
+
@gemfiles_filename = File.expand_path(File.dirname(__FILE__) + '/../../.gemfiles')
|
|
20
|
+
raise ".gemfiles not found. Please run 'rake gemfiles'" unless File.exists?(@gemfiles_filename)
|
|
21
|
+
@gemfiles = File.open(@gemfiles_filename, "rb") {|f| f.read}
|
|
22
|
+
@eol = @gemfiles.match("\r\n") ? "\r\n" : "\n"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def binary?(filename)
|
|
26
|
+
open filename do |f|
|
|
27
|
+
f.each_byte { |x|
|
|
28
|
+
x.nonzero? or return true
|
|
29
|
+
}
|
|
30
|
+
end
|
|
31
|
+
false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def check_for_tab_characters(filename)
|
|
35
|
+
failing_lines = []
|
|
36
|
+
File.readlines(filename).each_with_index do |line,number|
|
|
37
|
+
failing_lines << number + 1 if line =~ /\t/
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
unless failing_lines.empty?
|
|
41
|
+
"#{filename} has tab characters on lines #{failing_lines.join(', ')}"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def check_for_extra_spaces(filename)
|
|
46
|
+
failing_lines = []
|
|
47
|
+
File.readlines(filename).each_with_index do |line,number|
|
|
48
|
+
next if line =~ /^\s+#.*\s+#{@eol}$/
|
|
49
|
+
failing_lines << number + 1 if line =~ /\s+#{@eol}$/
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
unless failing_lines.empty?
|
|
53
|
+
"#{filename} has spaces on the EOL on lines #{failing_lines.join(', ')}"
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
RSpec::Matchers.define :be_well_formed do
|
|
58
|
+
failure_message_for_should do |actual|
|
|
59
|
+
actual.join("\n")
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
match do |actual|
|
|
63
|
+
actual.empty?
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "has no malformed whitespace" do
|
|
68
|
+
error_messages = []
|
|
69
|
+
@gemfiles.split(@eol).each do |filename|
|
|
70
|
+
filename = File.expand_path(File.join(File.dirname(__FILE__), ["..", "..", filename]))
|
|
71
|
+
unless File.exists?(filename)
|
|
72
|
+
puts "WARNING: .gemfiles out-of-date, #{filename} not found. Edit .gemfiles or run 'rake gemfiles' after committing changes."
|
|
73
|
+
next
|
|
74
|
+
end
|
|
75
|
+
next if filename =~ /\.gitmodules/
|
|
76
|
+
next if binary?(filename)
|
|
77
|
+
error_messages << check_for_tab_characters(filename)
|
|
78
|
+
error_messages << check_for_extra_spaces(filename)
|
|
79
|
+
end
|
|
80
|
+
error_messages.compact.should be_well_formed
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Dynabix do
|
|
4
|
+
|
|
5
|
+
def load_gemspec
|
|
6
|
+
filename = File.expand_path('../../../dynabix.gemspec', __FILE__)
|
|
7
|
+
eval(File.read(filename), nil, filename)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe 'gemspec' do
|
|
11
|
+
|
|
12
|
+
it "should return the gem VERSION" do
|
|
13
|
+
@gemspec = load_gemspec
|
|
14
|
+
Dynabix::version.should_not be_nil
|
|
15
|
+
@gemspec.version.to_s.should == Dynabix::version
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe 'files' do
|
|
19
|
+
|
|
20
|
+
it "should return 'files' array" do
|
|
21
|
+
@gemspec = load_gemspec
|
|
22
|
+
@gemspec.files.is_a?(Array).should == true
|
|
23
|
+
@gemspec.files.include?('VERSION').should == true
|
|
24
|
+
end
|
|
25
|
+
it "should return 'executables' array" do
|
|
26
|
+
@gemspec = load_gemspec
|
|
27
|
+
@gemspec.executables.is_a?(Array).should == true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe 'without .gemfiles cache' do
|
|
31
|
+
before(:each) do
|
|
32
|
+
File.stub!('exists?').and_return false
|
|
33
|
+
@gemspec = load_gemspec
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should return 'files' from using 'git ls-files" do
|
|
37
|
+
File.exists?(File.expand_path('../../../.gemfiles', __FILE__)).should == false
|
|
38
|
+
@gemspec.files.is_a?(Array).should == true
|
|
39
|
+
@gemspec.files.include?('VERSION').should == true
|
|
40
|
+
end
|
|
41
|
+
it "should return 'executables' from 'git ls-files" do
|
|
42
|
+
File.exists?(File.expand_path('../../../.gemfiles', __FILE__)).should == false
|
|
43
|
+
@gemspec.executables.is_a?(Array).should == true
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe 'without git binary' do
|
|
48
|
+
|
|
49
|
+
before(:each) do
|
|
50
|
+
stub!(:system).and_return false
|
|
51
|
+
@gemspec = load_gemspec
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should return 'files' from cache" do
|
|
55
|
+
system('git --version').should == false
|
|
56
|
+
@gemspec.files.is_a?(Array).should == true
|
|
57
|
+
@gemspec.files.include?('VERSION').should == true
|
|
58
|
+
end
|
|
59
|
+
it "should return 'executables' from cache" do
|
|
60
|
+
system('git --version').should == false
|
|
61
|
+
@gemspec.executables.is_a?(Array).should == true
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
class Thing < ActiveRecord::Base
|
|
4
|
+
has_metadata
|
|
5
|
+
|
|
6
|
+
metadata_accessor :rv_doors, :rv_windows
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe Dynabix::Metadata do
|
|
10
|
+
|
|
11
|
+
describe "has_metadata" do
|
|
12
|
+
|
|
13
|
+
it "should be a class method" do
|
|
14
|
+
defined?(Thing.has_metadata).should be_true
|
|
15
|
+
defined?(Thing.create_accessor).should be_false
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "creating a serializer" do
|
|
21
|
+
|
|
22
|
+
context "has_metadata with no params, Ruby 1.8+" do
|
|
23
|
+
|
|
24
|
+
it "should create a default instance serializer accessor called 'metadata'" do
|
|
25
|
+
defined?(Thing.metadata).should be_false
|
|
26
|
+
thing = Thing.new
|
|
27
|
+
thing.should be_valid
|
|
28
|
+
defined?(thing.metadata).should be_true
|
|
29
|
+
thing.metadata.should == {}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "should create a default class level accessor called 'metadata_accessor'" do
|
|
33
|
+
defined?(Thing.metadata_accessor).should be_true
|
|
34
|
+
defined?(Thing.rv_windows).should be_false
|
|
35
|
+
|
|
36
|
+
thing = Thing.new
|
|
37
|
+
defined?(thing.rv_windows).should be_true
|
|
38
|
+
thing.metadata[:rv_windows].should be_nil
|
|
39
|
+
thing.metadata[:rv_windows] = 1
|
|
40
|
+
thing.metadata[:rv_windows].should == 1
|
|
41
|
+
thing.rv_windows = 2
|
|
42
|
+
thing.rv_windows.should == 2
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "has_metadata with attribute params, Ruby 1.8+" do
|
|
48
|
+
|
|
49
|
+
class Foo < ActiveRecord::Base
|
|
50
|
+
has_metadata :metadata, :bar1, :bar2
|
|
51
|
+
|
|
52
|
+
metadata_reader :frog
|
|
53
|
+
metadata_writer :duck
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should create a default instance serializer accessor called 'metadata'" do
|
|
57
|
+
foo = Foo.new
|
|
58
|
+
foo.metadata.should == {}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should create a default class level accessor called 'metadata_accessor'" do
|
|
62
|
+
foo = Foo.new
|
|
63
|
+
defined?(foo.bar1).should be_true
|
|
64
|
+
defined?(foo.bar2).should be_true
|
|
65
|
+
foo.metadata[:bar1].should be_nil
|
|
66
|
+
foo.metadata[:bar1] = 1
|
|
67
|
+
foo.metadata[:bar1].should == 1
|
|
68
|
+
foo.bar1 = 2
|
|
69
|
+
foo.bar1.should == 2
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "should create a default class level write accessor called 'metadata_writer'" do
|
|
73
|
+
foo = Foo.new
|
|
74
|
+
foo.duck = 2
|
|
75
|
+
foo.metadata[:duck].should == 2
|
|
76
|
+
lambda { foo.duck }.should raise_exception(NoMethodError)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should create a default class level read accessor called 'metadata_reader'" do
|
|
80
|
+
foo = Foo.new
|
|
81
|
+
foo.metadata[:frog] = 4
|
|
82
|
+
foo.frog.should == 4
|
|
83
|
+
lambda { foo.frog = 5 }.should raise_exception(NoMethodError)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
unless RUBY_VERSION < '1.9'
|
|
88
|
+
|
|
89
|
+
class Bar < ActiveRecord::Base
|
|
90
|
+
has_metadata :bardata
|
|
91
|
+
|
|
92
|
+
bardata_accessor :foo
|
|
93
|
+
bardata_reader :frog
|
|
94
|
+
bardata_writer :duck
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "has_metadata with user defined name of metadata database field 'bardata', Ruby 1.9+" do
|
|
98
|
+
|
|
99
|
+
it "should create a default instance serializer accessor called 'bardata'" do
|
|
100
|
+
defined?(Bar.bardata).should be_false
|
|
101
|
+
thing = Bar.new
|
|
102
|
+
thing.should be_valid
|
|
103
|
+
defined?(thing.bardata).should be_true
|
|
104
|
+
thing.bardata.should == {}
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "should create a default class level accessor called 'bardata_accessor'" do
|
|
108
|
+
defined?(Bar.bardata_accessor).should be_true
|
|
109
|
+
defined?(Bar.foo).should be_false
|
|
110
|
+
|
|
111
|
+
thing = Bar.new
|
|
112
|
+
defined?(thing.foo).should be_true
|
|
113
|
+
thing.bardata[:foo].should be_nil
|
|
114
|
+
thing.bardata[:foo] = 1
|
|
115
|
+
thing.bardata[:foo].should == 1
|
|
116
|
+
thing.foo = 2
|
|
117
|
+
thing.foo.should == 2
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "should create a default class level write accessor called 'bardata_writer'" do
|
|
121
|
+
bar = Bar.new
|
|
122
|
+
bar.duck = 2
|
|
123
|
+
bar.bardata[:duck].should == 2
|
|
124
|
+
lambda { bar.duck }.should raise_exception(NoMethodError)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "should create a default class level read accessor called 'bardata_reader'" do
|
|
128
|
+
bar = Bar.new
|
|
129
|
+
bar.bardata[:frog] = 4
|
|
130
|
+
bar.frog.should == 4
|
|
131
|
+
lambda { bar.frog = 5 }.should raise_exception(NoMethodError)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
end
|
data/spec/schema.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
ActiveRecord::Schema.define(:version => 0) do
|
|
2
|
+
|
|
3
|
+
create_table :things, :force => true do |t|
|
|
4
|
+
t.string :description
|
|
5
|
+
t.text :notes
|
|
6
|
+
t.text :metadata
|
|
7
|
+
|
|
8
|
+
t.timestamps
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
create_table :bars, :force => true do |t|
|
|
12
|
+
t.string :description
|
|
13
|
+
t.text :notes
|
|
14
|
+
t.text :bardata
|
|
15
|
+
|
|
16
|
+
t.timestamps
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
create_table :foos, :force => true do |t|
|
|
20
|
+
t.string :description
|
|
21
|
+
t.text :notes
|
|
22
|
+
t.text :metadata
|
|
23
|
+
|
|
24
|
+
t.timestamps
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'dynabix'
|
|
2
|
+
require 'rspec/core'
|
|
3
|
+
require 'aruba/api'
|
|
4
|
+
require 'aruba_helper'
|
|
5
|
+
require 'active_record'
|
|
6
|
+
|
|
7
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
|
8
|
+
ActiveRecord::Migration.verbose = false
|
|
9
|
+
load "schema.rb"
|
|
10
|
+
|
|
11
|
+
RSpec.configure do |config|
|
|
12
|
+
config.include Aruba::Api
|
|
13
|
+
config.filter_run :focus => true
|
|
14
|
+
config.run_all_when_everything_filtered = true
|
|
15
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
|
16
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dynabix
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.3.0
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Robert Wahler
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2012-05-04 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: activerecord
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
none: false
|
|
18
|
+
requirements:
|
|
19
|
+
- - ~>
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '3.0'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ~>
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '3.0'
|
|
30
|
+
- !ruby/object:Gem::Dependency
|
|
31
|
+
name: bundler
|
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
|
33
|
+
none: false
|
|
34
|
+
requirements:
|
|
35
|
+
- - ! '>='
|
|
36
|
+
- !ruby/object:Gem::Version
|
|
37
|
+
version: 1.0.14
|
|
38
|
+
type: :development
|
|
39
|
+
prerelease: false
|
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ! '>='
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: 1.0.14
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: rspec
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
none: false
|
|
50
|
+
requirements:
|
|
51
|
+
- - ! '>='
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 2.6.0
|
|
54
|
+
type: :development
|
|
55
|
+
prerelease: false
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
none: false
|
|
58
|
+
requirements:
|
|
59
|
+
- - ! '>='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 2.6.0
|
|
62
|
+
- !ruby/object:Gem::Dependency
|
|
63
|
+
name: aruba
|
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
|
65
|
+
none: false
|
|
66
|
+
requirements:
|
|
67
|
+
- - '='
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: 0.4.5
|
|
70
|
+
type: :development
|
|
71
|
+
prerelease: false
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
none: false
|
|
74
|
+
requirements:
|
|
75
|
+
- - '='
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: 0.4.5
|
|
78
|
+
- !ruby/object:Gem::Dependency
|
|
79
|
+
name: rake
|
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
|
81
|
+
none: false
|
|
82
|
+
requirements:
|
|
83
|
+
- - ! '>='
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: 0.8.7
|
|
86
|
+
type: :development
|
|
87
|
+
prerelease: false
|
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
+
none: false
|
|
90
|
+
requirements:
|
|
91
|
+
- - ! '>='
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: 0.8.7
|
|
94
|
+
- !ruby/object:Gem::Dependency
|
|
95
|
+
name: sqlite3-ruby
|
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
|
97
|
+
none: false
|
|
98
|
+
requirements:
|
|
99
|
+
- - ! '>='
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
version: 0.8.7
|
|
102
|
+
type: :development
|
|
103
|
+
prerelease: false
|
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
105
|
+
none: false
|
|
106
|
+
requirements:
|
|
107
|
+
- - ! '>='
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: 0.8.7
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: yard
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
113
|
+
none: false
|
|
114
|
+
requirements:
|
|
115
|
+
- - ! '>='
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: 0.7.4
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
none: false
|
|
122
|
+
requirements:
|
|
123
|
+
- - ! '>='
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: 0.7.4
|
|
126
|
+
- !ruby/object:Gem::Dependency
|
|
127
|
+
name: redcarpet
|
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
|
129
|
+
none: false
|
|
130
|
+
requirements:
|
|
131
|
+
- - ! '>='
|
|
132
|
+
- !ruby/object:Gem::Version
|
|
133
|
+
version: 1.17.2
|
|
134
|
+
type: :development
|
|
135
|
+
prerelease: false
|
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
137
|
+
none: false
|
|
138
|
+
requirements:
|
|
139
|
+
- - ! '>='
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: 1.17.2
|
|
142
|
+
- !ruby/object:Gem::Dependency
|
|
143
|
+
name: guard
|
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
|
145
|
+
none: false
|
|
146
|
+
requirements:
|
|
147
|
+
- - ~>
|
|
148
|
+
- !ruby/object:Gem::Version
|
|
149
|
+
version: '1.0'
|
|
150
|
+
type: :development
|
|
151
|
+
prerelease: false
|
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
153
|
+
none: false
|
|
154
|
+
requirements:
|
|
155
|
+
- - ~>
|
|
156
|
+
- !ruby/object:Gem::Version
|
|
157
|
+
version: '1.0'
|
|
158
|
+
- !ruby/object:Gem::Dependency
|
|
159
|
+
name: guard-rspec
|
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
|
161
|
+
none: false
|
|
162
|
+
requirements:
|
|
163
|
+
- - ~>
|
|
164
|
+
- !ruby/object:Gem::Version
|
|
165
|
+
version: '0.6'
|
|
166
|
+
type: :development
|
|
167
|
+
prerelease: false
|
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
+
none: false
|
|
170
|
+
requirements:
|
|
171
|
+
- - ~>
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: '0.6'
|
|
174
|
+
description: Dynabix dynamically creates read/write accessors on ActiveRecord models
|
|
175
|
+
for storing attributes in a serialized Hash
|
|
176
|
+
email:
|
|
177
|
+
- robert@gearheadforhire.com
|
|
178
|
+
executables: []
|
|
179
|
+
extensions: []
|
|
180
|
+
extra_rdoc_files: []
|
|
181
|
+
files:
|
|
182
|
+
- .gemfiles
|
|
183
|
+
- .gitattributes
|
|
184
|
+
- .gitignore
|
|
185
|
+
- .rspec
|
|
186
|
+
- .yardopts
|
|
187
|
+
- Gemfile
|
|
188
|
+
- Gemfile.lock
|
|
189
|
+
- Guardfile
|
|
190
|
+
- HISTORY.markdown
|
|
191
|
+
- LICENSE
|
|
192
|
+
- README.markdown
|
|
193
|
+
- Rakefile
|
|
194
|
+
- VERSION
|
|
195
|
+
- dynabix.gemspec
|
|
196
|
+
- lib/dynabix.rb
|
|
197
|
+
- lib/dynabix/metadata.rb
|
|
198
|
+
- spec/aruba_helper.rb
|
|
199
|
+
- spec/basic_gem/aruba_helper_spec.rb
|
|
200
|
+
- spec/basic_gem/basic_gem_spec.rb
|
|
201
|
+
- spec/basic_gem/gemspec_spec.rb
|
|
202
|
+
- spec/dynabix/metadata_spec.rb
|
|
203
|
+
- spec/schema.rb
|
|
204
|
+
- spec/spec_helper.rb
|
|
205
|
+
homepage: http://rubygems.org/gems/dynabix
|
|
206
|
+
licenses: []
|
|
207
|
+
post_install_message:
|
|
208
|
+
rdoc_options:
|
|
209
|
+
- --title
|
|
210
|
+
- Dynabix Documentation
|
|
211
|
+
- --main
|
|
212
|
+
- README.markdown
|
|
213
|
+
- --line-numbers
|
|
214
|
+
- --inline-source
|
|
215
|
+
require_paths:
|
|
216
|
+
- lib
|
|
217
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
218
|
+
none: false
|
|
219
|
+
requirements:
|
|
220
|
+
- - ! '>='
|
|
221
|
+
- !ruby/object:Gem::Version
|
|
222
|
+
version: '0'
|
|
223
|
+
segments:
|
|
224
|
+
- 0
|
|
225
|
+
hash: 575564662145783656
|
|
226
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
|
+
none: false
|
|
228
|
+
requirements:
|
|
229
|
+
- - ! '>='
|
|
230
|
+
- !ruby/object:Gem::Version
|
|
231
|
+
version: 1.3.6
|
|
232
|
+
requirements: []
|
|
233
|
+
rubyforge_project: dynabix
|
|
234
|
+
rubygems_version: 1.8.21
|
|
235
|
+
signing_key:
|
|
236
|
+
specification_version: 3
|
|
237
|
+
summary: An ActiveRecord 3.x Ruby gem for attribute serialization
|
|
238
|
+
test_files: []
|
|
239
|
+
has_rdoc:
|