depot 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/.gitignore +4 -0
- data/Gemfile +2 -0
- data/Guardfile +6 -0
- data/README.rdoc +3 -0
- data/Rakefile +3 -0
- data/depot.gemspec +27 -0
- data/lib/depot.rb +11 -0
- data/lib/depot/base.rb +46 -0
- data/lib/depot/context.rb +37 -0
- data/lib/depot/version.rb +3 -0
- data/spec/depot/base_spec.rb +53 -0
- data/spec/depot/context_spec.rb +44 -0
- data/spec/depot/version_spec.rb +11 -0
- data/spec/spec_helper.rb +15 -0
- metadata +124 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/README.rdoc
ADDED
data/Rakefile
ADDED
data/depot.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "depot/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "depot"
|
7
|
+
s.version = Depot::VERSION
|
8
|
+
s.authors = ["Rainer Borene"]
|
9
|
+
s.email = ["me@rainerborene.com"]
|
10
|
+
s.homepage = "https://github.com/rainerborene/depot"
|
11
|
+
s.summary = %q{Populate your database in an elegant way}
|
12
|
+
s.description = %q{A simple DSL for defining database seeds in Rails.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "depot"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_runtime_dependency "active_support" , ">= 3.0.0"
|
22
|
+
|
23
|
+
s.add_development_dependency "rake" , "~> 0.9"
|
24
|
+
s.add_development_dependency "rspec" , "~> 2.8"
|
25
|
+
s.add_development_dependency "pry" , "~> 0.9"
|
26
|
+
s.add_development_dependency "guard-rspec" , "~> 0.6"
|
27
|
+
end
|
data/lib/depot.rb
ADDED
data/lib/depot/base.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require "set"
|
2
|
+
require "logger"
|
3
|
+
|
4
|
+
module Depot
|
5
|
+
class Base
|
6
|
+
attr_reader :entries, :models
|
7
|
+
attr_accessor :logging
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@entries = {}
|
11
|
+
@logging = false
|
12
|
+
@models = Set.new
|
13
|
+
|
14
|
+
if defined?(ActiveRecord)
|
15
|
+
subclasses = ActiveRecord::Base.send(:subclasses).map do |m|
|
16
|
+
m.name.downcase.pluralize.gsub(/::/, "_").to_sym
|
17
|
+
end
|
18
|
+
@models.merge(subclasses)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def logging(value = true)
|
23
|
+
@logging = value
|
24
|
+
|
25
|
+
if defined?(ActiveRecord)
|
26
|
+
@buffered ||= ActiveRecord::Base.logger
|
27
|
+
ActiveRecord::Base.logger = @logging ? Logger.new(STDOUT) : @buffered
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def inject(*args)
|
32
|
+
@models.merge args.map(&:to_sym)
|
33
|
+
end
|
34
|
+
|
35
|
+
def method_missing(name, &block)
|
36
|
+
if @models.include? name and block_given?
|
37
|
+
klass = name.to_s.gsub("_", "::").singularize.classify.constantize
|
38
|
+
Context.new(klass, self).instance_eval(&block)
|
39
|
+
elsif entries.has_key? name
|
40
|
+
@entries[name]
|
41
|
+
else
|
42
|
+
super
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "active_support/core_ext/hash"
|
2
|
+
|
3
|
+
module Depot
|
4
|
+
class Context
|
5
|
+
attr_reader :klass, :base
|
6
|
+
|
7
|
+
def initialize(klass, base)
|
8
|
+
@klass = klass
|
9
|
+
@base = base
|
10
|
+
end
|
11
|
+
|
12
|
+
def finder(criteria)
|
13
|
+
@finder = criteria
|
14
|
+
end
|
15
|
+
|
16
|
+
def create(attributes = {})
|
17
|
+
# remove method reference symbol
|
18
|
+
key = attributes[:as]
|
19
|
+
attributes.except! :as
|
20
|
+
|
21
|
+
# alternate syntax to define attributes
|
22
|
+
if block_given?
|
23
|
+
klass_instance = @klass.new
|
24
|
+
yield klass_instance
|
25
|
+
attributes = klass_instance.attributes
|
26
|
+
end
|
27
|
+
|
28
|
+
# finder criteria
|
29
|
+
criteria = @finder || attributes.keys.first
|
30
|
+
|
31
|
+
# okey, let's do it
|
32
|
+
entry = @klass.send("find_or_create_by_#{criteria}", attributes)
|
33
|
+
@base.entries[key] = entry if key
|
34
|
+
entry
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Depot::Base do
|
4
|
+
|
5
|
+
subject { described_class.new }
|
6
|
+
|
7
|
+
before do
|
8
|
+
User.stub!(:find_or_create_by_name)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#initialize" do
|
12
|
+
it "should initialize entries hash" do
|
13
|
+
subject.entries.should be_empty
|
14
|
+
subject.entries.should be_instance_of Hash
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should disable logging by default" do
|
18
|
+
subject.instance_variable_get(:@logging).should be_false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#inject" do
|
23
|
+
it "should append a new symbol to the models set" do
|
24
|
+
subject.inject :jobs
|
25
|
+
subject.models.should include :jobs
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#method_missing" do
|
30
|
+
before { subject.inject :users }
|
31
|
+
|
32
|
+
it "should listen to model names" do
|
33
|
+
lambda {
|
34
|
+
subject.users do
|
35
|
+
# something
|
36
|
+
end
|
37
|
+
}.should_not raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should listen to entries key name" do
|
41
|
+
subject.users do
|
42
|
+
create({ name: "Jonh Doe", email: "jonh@doe.com", as: :jonh })
|
43
|
+
end
|
44
|
+
subject.entries.should have_key :jonh
|
45
|
+
lambda { subject.jonh }.should_not raise_error
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should fallback to the default behavior" do
|
49
|
+
lambda { subject.say_hello }.should raise_error
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Depot::Context do
|
4
|
+
|
5
|
+
before do
|
6
|
+
User.stub!(:find_or_create_by_name)
|
7
|
+
@base = Depot::Base.new
|
8
|
+
end
|
9
|
+
|
10
|
+
subject { described_class.new(User, @base) }
|
11
|
+
|
12
|
+
describe "#initialize" do
|
13
|
+
its(:klass) { should eql User }
|
14
|
+
its(:base) { should eql @base }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#finder" do
|
18
|
+
it "should change the finder criteria" do
|
19
|
+
attributes = { email: "jonh@doe.com" }
|
20
|
+
User.should_receive(:find_or_create_by_email).with(attributes)
|
21
|
+
subject.finder(:email)
|
22
|
+
subject.create(attributes)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#create" do
|
27
|
+
it "should create a new entry given a hash" do
|
28
|
+
subject.create({ name: "Jonh Doe", email: "jonh@doe.com", :as => :jonh_doe })
|
29
|
+
@base.entries.should_not be_empty
|
30
|
+
@base.entries.should have_key :jonh_doe
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should create a new entry given a block" do
|
34
|
+
subject.create :as => :jonh_doe do |p|
|
35
|
+
p.name = "Jonh Doe"
|
36
|
+
p.email = "jonh@doe.com"
|
37
|
+
end
|
38
|
+
|
39
|
+
@base.entries.should_not be_empty
|
40
|
+
@base.entries.should have_key :jonh_doe
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "bundler"
|
2
|
+
Bundler.setup(:default, :development)
|
3
|
+
Bundler.require
|
4
|
+
|
5
|
+
require "depot"
|
6
|
+
|
7
|
+
class User
|
8
|
+
attr_accessor :name, :email
|
9
|
+
|
10
|
+
def attributes
|
11
|
+
{ :name => name, :email => email }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir["spec/support/**/*.rb"].each {|file| require file}
|
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: depot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rainer Borene
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-28 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: active_support
|
16
|
+
requirement: &2154230020 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2154230020
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &2154229220 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0.9'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2154229220
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &2154222220 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '2.8'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *2154222220
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: pry
|
49
|
+
requirement: &2154221660 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.9'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *2154221660
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: guard-rspec
|
60
|
+
requirement: &2154221140 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0.6'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *2154221140
|
69
|
+
description: A simple DSL for defining database seeds in Rails.
|
70
|
+
email:
|
71
|
+
- me@rainerborene.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- .gitignore
|
77
|
+
- Gemfile
|
78
|
+
- Guardfile
|
79
|
+
- README.rdoc
|
80
|
+
- Rakefile
|
81
|
+
- depot.gemspec
|
82
|
+
- lib/depot.rb
|
83
|
+
- lib/depot/base.rb
|
84
|
+
- lib/depot/context.rb
|
85
|
+
- lib/depot/version.rb
|
86
|
+
- spec/depot/base_spec.rb
|
87
|
+
- spec/depot/context_spec.rb
|
88
|
+
- spec/depot/version_spec.rb
|
89
|
+
- spec/spec_helper.rb
|
90
|
+
homepage: https://github.com/rainerborene/depot
|
91
|
+
licenses: []
|
92
|
+
post_install_message:
|
93
|
+
rdoc_options: []
|
94
|
+
require_paths:
|
95
|
+
- lib
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
hash: 3417339911530143929
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
segments:
|
112
|
+
- 0
|
113
|
+
hash: 3417339911530143929
|
114
|
+
requirements: []
|
115
|
+
rubyforge_project: depot
|
116
|
+
rubygems_version: 1.8.10
|
117
|
+
signing_key:
|
118
|
+
specification_version: 3
|
119
|
+
summary: Populate your database in an elegant way
|
120
|
+
test_files:
|
121
|
+
- spec/depot/base_spec.rb
|
122
|
+
- spec/depot/context_spec.rb
|
123
|
+
- spec/depot/version_spec.rb
|
124
|
+
- spec/spec_helper.rb
|