deposit 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/Gemfile +2 -0
- data/README.md +39 -0
- data/Rakefile +14 -0
- data/deposit.gemspec +26 -0
- data/lib/deposit.rb +44 -0
- data/lib/generators/deposit_migration/USAGE +2 -0
- data/lib/generators/deposit_migration/deposit_migration_generator.rb +18 -0
- data/lib/generators/deposit_migration/templates/migration.rb +15 -0
- data/spec/database.yml +19 -0
- data/spec/deposit/deposit_migration_spec.rb +24 -0
- data/spec/deposit/deposit_spec.rb +17 -0
- data/spec/models.rb +3 -0
- data/spec/spec_helper.rb +88 -0
- metadata +186 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Deposit
|
2
|
+
=================================
|
3
|
+
|
4
|
+
Rails plugin for saving additional data for model.
|
5
|
+
|
6
|
+
Requirements
|
7
|
+
---------------------------------
|
8
|
+
This gem is for Rails 3 with ActiveRecord and later versions only.
|
9
|
+
|
10
|
+
Install
|
11
|
+
---------------------------------
|
12
|
+
Add this to your Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'deposit'
|
16
|
+
```
|
17
|
+
|
18
|
+
run `bundle install`,
|
19
|
+
|
20
|
+
And then `rails g deposit_migration`, It will create table `deposits` for you.
|
21
|
+
|
22
|
+
Usage
|
23
|
+
---------------------------------
|
24
|
+
Simply add `as_depositable` to your model:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
class Product < ActiveRecord::Base
|
28
|
+
as_depositable
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
you can load and save deposit like this:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
p = Product.last
|
36
|
+
p.save_deposit :transition, {id: 123, date: Time.now}
|
37
|
+
p.load_deposit :transition # => return saved data
|
38
|
+
```
|
39
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.setup :default, :development
|
4
|
+
|
5
|
+
Dir['lib/tasks/*.rake'].each { |rake| load rake }
|
6
|
+
|
7
|
+
task default: :spec
|
8
|
+
|
9
|
+
require 'rspec/core/rake_task'
|
10
|
+
RSpec::Core::RakeTask.new do |t|
|
11
|
+
t.pattern = "spec/**/*_spec.rb"
|
12
|
+
end
|
13
|
+
|
14
|
+
Bundler::GemHelper.install_tasks
|
data/deposit.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
$:.push File.dirname(__FILE__) + '/lib'
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.name = "deposit"
|
5
|
+
gem.authors = ["linjunhalida"]
|
6
|
+
gem.date = '2012-09-28'
|
7
|
+
gem.description = "Rails plugin for saving additional data for model."
|
8
|
+
gem.summary = "Saving additional data for rails model."
|
9
|
+
gem.email = "linjunhalida@gmail.com"
|
10
|
+
gem.homepage = 'https://github.com/halida/deposit'
|
11
|
+
|
12
|
+
gem.add_runtime_dependency 'rails', '~> 3.0'
|
13
|
+
gem.add_development_dependency 'rspec', '~> 2.6'
|
14
|
+
gem.add_development_dependency 'ammeter', '~> 0.2.8'
|
15
|
+
gem.add_development_dependency 'sqlite3'
|
16
|
+
gem.add_development_dependency 'mysql2', '~> 0.3.7'
|
17
|
+
gem.add_development_dependency 'pg'
|
18
|
+
gem.add_development_dependency 'guard'
|
19
|
+
gem.add_development_dependency 'guard-rspec'
|
20
|
+
|
21
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
|
+
gem.files = `git ls-files`.split("\n")
|
23
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
|
+
gem.require_paths = ['lib']
|
25
|
+
gem.version = '0.0.2'
|
26
|
+
end
|
data/lib/deposit.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require "active_record"
|
2
|
+
|
3
|
+
module Deposit
|
4
|
+
module Depositable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def acts_as_depositable
|
9
|
+
include AsDepositable
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module AsDepositable
|
15
|
+
extend ActiveSupport::Concern
|
16
|
+
|
17
|
+
included do
|
18
|
+
has_many :deposit_slots, class_name: "Deposit::DepositSlot", as: :item, dependent: :destroy
|
19
|
+
end
|
20
|
+
|
21
|
+
def save_deposit key, value
|
22
|
+
d = self.deposit_slots.find_or_create_by_key key
|
23
|
+
d.data = value
|
24
|
+
d.save
|
25
|
+
end
|
26
|
+
|
27
|
+
def load_deposit key
|
28
|
+
d = self.deposit_slots.where(key: key).first
|
29
|
+
return nil unless d
|
30
|
+
return d.data
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
class DepositSlot < ActiveRecord::Base
|
36
|
+
belongs_to :item, polymorphic: true
|
37
|
+
serialize :data
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
if defined?(ActiveRecord::Base)
|
43
|
+
ActiveRecord::Base.send(:include, Deposit::Depositable)
|
44
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class DepositMigrationGenerator < Rails::Generators::Base
|
2
|
+
include Rails::Generators::Migration
|
3
|
+
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
# Complete wtf that this isn't provided elsewhere.
|
7
|
+
def self.next_migration_number(dirname)
|
8
|
+
if ActiveRecord::Base.timestamped_migrations
|
9
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
10
|
+
else
|
11
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def manifest
|
16
|
+
migration_template 'migration.rb', 'db/migrate/deposit_migration'
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class DepositMigration < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :deposit_slots do |t|
|
4
|
+
t.integer :item_id
|
5
|
+
t.string :item_type
|
6
|
+
|
7
|
+
t.string :key
|
8
|
+
t.text :data
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
|
13
|
+
add_index :deposit_slots, [:item_id, :item_type, :key]
|
14
|
+
end
|
15
|
+
end
|
data/spec/database.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
sqlite3:
|
2
|
+
adapter: sqlite3
|
3
|
+
database: deposit.sqlite3
|
4
|
+
|
5
|
+
mysql:
|
6
|
+
adapter: mysql2
|
7
|
+
hostname: localhost
|
8
|
+
username: root
|
9
|
+
password:
|
10
|
+
database: deposit
|
11
|
+
charset: utf8
|
12
|
+
|
13
|
+
postgresql:
|
14
|
+
adapter: postgresql
|
15
|
+
hostname: localhost
|
16
|
+
username: postgres
|
17
|
+
password:
|
18
|
+
database: deposit
|
19
|
+
encoding: utf8
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Generators are not automatically loaded by Rails
|
4
|
+
require File.expand_path('../../../lib/generators/deposit_migration/deposit_migration_generator', __FILE__)
|
5
|
+
|
6
|
+
describe DepositMigrationGenerator do
|
7
|
+
# TODO: undefined method `destination'?
|
8
|
+
|
9
|
+
# # Tell the generator where to put its output (what it thinks of as Rails.root)
|
10
|
+
# destination File.expand_path("../../../../../tmp", __FILE__)
|
11
|
+
|
12
|
+
# before do
|
13
|
+
# prepare_destination
|
14
|
+
# end
|
15
|
+
|
16
|
+
# describe 'no arguments' do
|
17
|
+
# before { run_generator }
|
18
|
+
|
19
|
+
# describe 'db/migrate/acts_as_taggable_on_migration.rb' do
|
20
|
+
# subject { file('db/migrate/acts_as_taggable_on_migration.rb') }
|
21
|
+
# it { should be_a_migration }
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe :Deposit do
|
4
|
+
before do
|
5
|
+
@e = DepositableModel.create
|
6
|
+
end
|
7
|
+
|
8
|
+
specify do
|
9
|
+
@e.load_deposit(:empty).should == nil
|
10
|
+
|
11
|
+
@e.save_deposit(:array, [1,2,3]) == true
|
12
|
+
@e.load_deposit(:array).should == [1,2,3]
|
13
|
+
|
14
|
+
@e.save_deposit(:hash, {a: 12}).should == true
|
15
|
+
@e.load_deposit(:hash).should == {a: 12}
|
16
|
+
end
|
17
|
+
end
|
data/spec/models.rb
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
$LOAD_PATH << "." unless $LOAD_PATH.include?(".")
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require "rubygems"
|
6
|
+
require "bundler"
|
7
|
+
|
8
|
+
# Set up load paths for all bundled gems
|
9
|
+
Bundler.setup
|
10
|
+
rescue Bundler::GemNotFound
|
11
|
+
raise RuntimeError, "Bundler couldn't find some gems." +
|
12
|
+
"Did you run \`bundlee install\`?"
|
13
|
+
end
|
14
|
+
|
15
|
+
Bundler.require
|
16
|
+
require File.expand_path('../../lib/deposit', __FILE__)
|
17
|
+
require 'deposit'
|
18
|
+
|
19
|
+
require 'ammeter/init'
|
20
|
+
|
21
|
+
# set adapter to use, default is sqlite3
|
22
|
+
# to use an alternative adapter run => rake spec DB='postgresql'
|
23
|
+
db_name = ENV['DB'] || 'sqlite3'
|
24
|
+
database_yml = File.expand_path('../database.yml', __FILE__)
|
25
|
+
|
26
|
+
if File.exists?(database_yml)
|
27
|
+
active_record_configuration = YAML.load_file(database_yml)
|
28
|
+
|
29
|
+
ActiveRecord::Base.configurations = active_record_configuration
|
30
|
+
config = ActiveRecord::Base.configurations[db_name]
|
31
|
+
|
32
|
+
begin
|
33
|
+
ActiveRecord::Base.establish_connection(db_name)
|
34
|
+
ActiveRecord::Base.connection
|
35
|
+
rescue
|
36
|
+
case db_name
|
37
|
+
when /mysql/
|
38
|
+
ActiveRecord::Base.establish_connection(config.merge('database' => nil))
|
39
|
+
ActiveRecord::Base.connection.create_database(config['database'], {:charset => 'utf8', :collation => 'utf8_unicode_ci'})
|
40
|
+
when 'postgresql'
|
41
|
+
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
42
|
+
ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => 'utf8'))
|
43
|
+
end
|
44
|
+
|
45
|
+
ActiveRecord::Base.establish_connection(config)
|
46
|
+
end
|
47
|
+
|
48
|
+
ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
|
49
|
+
ActiveRecord::Base.default_timezone = :utc
|
50
|
+
|
51
|
+
ActiveRecord::Base.silence do
|
52
|
+
ActiveRecord::Migration.verbose = false
|
53
|
+
|
54
|
+
ActiveRecord::Schema.define version: 0 do
|
55
|
+
create_table :depositable_models, force: true do |t|
|
56
|
+
t.column :name, :string
|
57
|
+
end
|
58
|
+
|
59
|
+
create_table :deposit_slots, force: true do |t|
|
60
|
+
t.integer :item_id
|
61
|
+
t.string :item_type
|
62
|
+
|
63
|
+
t.string :key
|
64
|
+
t.text :data
|
65
|
+
|
66
|
+
t.timestamps
|
67
|
+
end
|
68
|
+
|
69
|
+
add_index :deposit_slots, [:item_id, :item_type, :key]
|
70
|
+
end
|
71
|
+
|
72
|
+
class DepositableModel < ActiveRecord::Base
|
73
|
+
acts_as_depositable
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
else
|
78
|
+
raise "Please create #{database_yml} first to configure your database. Take a look at: #{database_yml}.sample"
|
79
|
+
end
|
80
|
+
|
81
|
+
def clean_database!
|
82
|
+
models = [DepositableModel, Deposit::DepositSlot]
|
83
|
+
models.each do |model|
|
84
|
+
ActiveRecord::Base.connection.execute "DELETE FROM #{model.table_name}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
clean_database!
|
metadata
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: deposit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- linjunhalida
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-09-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
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: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '2.6'
|
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: '2.6'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: ammeter
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.2.8
|
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: 0.2.8
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: sqlite3
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
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'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: mysql2
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.3.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.3.7
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: pg
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
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'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: guard
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
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'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: guard-rspec
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
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: '0'
|
142
|
+
description: Rails plugin for saving additional data for model.
|
143
|
+
email: linjunhalida@gmail.com
|
144
|
+
executables: []
|
145
|
+
extensions: []
|
146
|
+
extra_rdoc_files: []
|
147
|
+
files:
|
148
|
+
- .gitignore
|
149
|
+
- Gemfile
|
150
|
+
- README.md
|
151
|
+
- Rakefile
|
152
|
+
- deposit.gemspec
|
153
|
+
- lib/deposit.rb
|
154
|
+
- lib/generators/deposit_migration/USAGE
|
155
|
+
- lib/generators/deposit_migration/deposit_migration_generator.rb
|
156
|
+
- lib/generators/deposit_migration/templates/migration.rb
|
157
|
+
- spec/database.yml
|
158
|
+
- spec/deposit/deposit_migration_spec.rb
|
159
|
+
- spec/deposit/deposit_spec.rb
|
160
|
+
- spec/models.rb
|
161
|
+
- spec/spec_helper.rb
|
162
|
+
homepage: https://github.com/halida/deposit
|
163
|
+
licenses: []
|
164
|
+
post_install_message:
|
165
|
+
rdoc_options: []
|
166
|
+
require_paths:
|
167
|
+
- lib
|
168
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
|
+
none: false
|
176
|
+
requirements:
|
177
|
+
- - ! '>='
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
requirements: []
|
181
|
+
rubyforge_project:
|
182
|
+
rubygems_version: 1.8.21
|
183
|
+
signing_key:
|
184
|
+
specification_version: 3
|
185
|
+
summary: Saving additional data for rails model.
|
186
|
+
test_files: []
|