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 ADDED
@@ -0,0 +1,5 @@
1
+ Gemfile.lock
2
+ *~
3
+ *.gem
4
+ *.sqlite3
5
+ *.log
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'http://rubygems.org'
2
+ gemspec
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,2 @@
1
+ Description:
2
+ run rails generate deposit_migration
@@ -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
@@ -0,0 +1,3 @@
1
+ class DepositableModel < ActiveRecord::Base
2
+ acts_as_depositable
3
+ end
@@ -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: []