acorn 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/.rbenv-version +1 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/acorn.gemspec +27 -0
- data/lib/acorn.rb +22 -0
- data/lib/acorn/ar_friendly.rb +25 -0
- data/lib/acorn/data.rb +12 -0
- data/lib/acorn/data_processor.rb +26 -0
- data/lib/acorn/data_validator.rb +13 -0
- data/lib/acorn/dsl.rb +54 -0
- data/lib/acorn/seed_grabber.rb +16 -0
- data/lib/acorn/version.rb +3 -0
- data/spec/acorn_spec.rb +111 -0
- data/spec/test_data/colors.json +1 -0
- data/spec/test_data/genders.json +1 -0
- data/spec/test_data/sexual_preferences.json +1 -0
- data/spec/test_data/short_colors.json +1 -0
- metadata +134 -0
data/.gitignore
ADDED
data/.rbenv-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.2-p290
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/acorn.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "acorn/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "acorn"
|
7
|
+
s.version = Acorn::VERSION
|
8
|
+
s.authors = ["me"]
|
9
|
+
s.email = ["me@stuffihavemade.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{A DSL for seed.rb}
|
12
|
+
s.description = %q{A DSL for seed.rb}
|
13
|
+
|
14
|
+
s.rubyforge_project = "acorn"
|
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_development_dependency 'sqlite3'
|
22
|
+
s.add_development_dependency 'rspec'
|
23
|
+
s.add_development_dependency 'ruby-debug19'
|
24
|
+
s.add_development_dependency 'rake'
|
25
|
+
s.add_runtime_dependency 'activerecord'
|
26
|
+
s.add_runtime_dependency 'json'
|
27
|
+
end
|
data/lib/acorn.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
require 'acorn/ar_friendly'
|
5
|
+
require 'acorn/data'
|
6
|
+
require 'acorn/data_processor'
|
7
|
+
require 'acorn/data_validator'
|
8
|
+
require 'acorn/dsl'
|
9
|
+
require 'acorn/seed_grabber'
|
10
|
+
require 'acorn/version'
|
11
|
+
|
12
|
+
module Acorn
|
13
|
+
def self.use_seed_directory dir_name
|
14
|
+
First.new dir_name
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.Use_seed_directory dir_name
|
18
|
+
use_seed_directory dir_name
|
19
|
+
end
|
20
|
+
|
21
|
+
# end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Acorn
|
2
|
+
class ARFriendly
|
3
|
+
attr_accessor :column_names, :seeds
|
4
|
+
#takes something like [:col1, :col2] [[:a,:b],[:c,:d]]
|
5
|
+
#to [{:col1 => :a, :col2 => :c}, {:col1 => :b, :col2 => :d}]
|
6
|
+
def initialize column_names, seeds
|
7
|
+
self.column_names = column_names
|
8
|
+
self.seeds = seeds
|
9
|
+
end
|
10
|
+
def to_friendly
|
11
|
+
#seeds is like [[:a,:b,:c],[:d,:e,:f]]
|
12
|
+
first = self.seeds[0]
|
13
|
+
rest = self.seeds.drop 1
|
14
|
+
#zipped is like [[:a,:d],[:b,:e],[:c,:f]]
|
15
|
+
zipped = first.zip(*rest)
|
16
|
+
zipped.map do |z|
|
17
|
+
hash = {}
|
18
|
+
self.column_names.zip(z).each do |zz|
|
19
|
+
hash[zz[0].to_sym] = zz[1]
|
20
|
+
end
|
21
|
+
hash
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/acorn/data.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Acorn
|
2
|
+
class DataProcessor
|
3
|
+
attr_accessor :data
|
4
|
+
def initialize data
|
5
|
+
self.data = data
|
6
|
+
self.data.attr_names.map! {|x| x.to_s}
|
7
|
+
self.data.seed_names.map! {|x| x.to_s}
|
8
|
+
end
|
9
|
+
def process
|
10
|
+
data = self.data
|
11
|
+
DataValidator.new(data).validate!
|
12
|
+
|
13
|
+
seed_grabber = SeedGrabber.new data.dir_name, data.seed_names
|
14
|
+
seeds = seed_grabber.grab
|
15
|
+
|
16
|
+
friendly = ARFriendly.new(data.attr_names, seeds).to_friendly
|
17
|
+
friendly.each do |f|
|
18
|
+
obj = data.ar_class.new
|
19
|
+
f.each do |k,v|
|
20
|
+
obj.send k.to_s + '=', v
|
21
|
+
end
|
22
|
+
obj.save!
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Acorn
|
2
|
+
class DataValidator
|
3
|
+
attr_accessor :data
|
4
|
+
def initialize data
|
5
|
+
self.data = data
|
6
|
+
end
|
7
|
+
def validate!
|
8
|
+
if data.seed_names.length != data.attr_names.length
|
9
|
+
raise 'There must be an equal number of seed names and column names defined.'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/acorn/dsl.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
module Acorn
|
2
|
+
class First
|
3
|
+
attr_accessor :data
|
4
|
+
def initialize dir_name
|
5
|
+
self.data = Data.new
|
6
|
+
self.data.dir_name = dir_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def insert seed_name
|
10
|
+
self.data.seed_names << seed_name
|
11
|
+
Second.new self.data
|
12
|
+
end
|
13
|
+
def Insert seed_name
|
14
|
+
insert seed_name
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Second
|
19
|
+
attr_accessor :data
|
20
|
+
|
21
|
+
def initialize data
|
22
|
+
self.data = data
|
23
|
+
end
|
24
|
+
|
25
|
+
def and seed_name
|
26
|
+
self.data.seed_names << seed_name
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def into_attr attr_name
|
31
|
+
self.data.attr_names << attr_name
|
32
|
+
Third.new self.data
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Third
|
37
|
+
attr_accessor :data
|
38
|
+
|
39
|
+
def initialize data
|
40
|
+
self.data = data
|
41
|
+
end
|
42
|
+
|
43
|
+
def and_attr attr_name
|
44
|
+
self.data.attr_names << attr_name
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def of_AR_class ar_class
|
49
|
+
self.data.ar_class = ar_class
|
50
|
+
self.data.process
|
51
|
+
First.new self.data.dir_name
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Acorn
|
2
|
+
class SeedGrabber
|
3
|
+
attr_accessor :dir_name, :seed_names
|
4
|
+
def initialize dir_name, seed_names
|
5
|
+
self.dir_name = dir_name
|
6
|
+
self.seed_names = seed_names
|
7
|
+
end
|
8
|
+
|
9
|
+
def grab
|
10
|
+
seed_names.map do |seed_name|
|
11
|
+
file_name = dir_name + seed_name.to_s + '.json'
|
12
|
+
JSON.load open file_name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/spec/acorn_spec.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
require 'acorn'
|
3
|
+
require 'ruby-debug'
|
4
|
+
|
5
|
+
def reconnect
|
6
|
+
ActiveRecord::Base.establish_connection(
|
7
|
+
:adapter => 'sqlite3',
|
8
|
+
:database => ':memory:',
|
9
|
+
:pool => 5,
|
10
|
+
:timeout => 5000)
|
11
|
+
ActiveRecord::Schema.define do
|
12
|
+
create_table :genders do |t|
|
13
|
+
t.string :gender_column
|
14
|
+
end
|
15
|
+
end
|
16
|
+
ActiveRecord::Schema.define do
|
17
|
+
create_table :colors do |t|
|
18
|
+
t.string :color
|
19
|
+
t.string :short_color
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Gender < ActiveRecord::Base
|
25
|
+
end
|
26
|
+
|
27
|
+
class Color < ActiveRecord::Base
|
28
|
+
end
|
29
|
+
|
30
|
+
DirName = File.join(File.dirname(__FILE__), 'test_data/')
|
31
|
+
|
32
|
+
describe 'DataValidator' do
|
33
|
+
it 'raises an error if the number of columns and seeds is not equal' do
|
34
|
+
data = Acorn::Data.new
|
35
|
+
data.attr_names = [1,2]
|
36
|
+
data.seed_names = [1]
|
37
|
+
lambda {DataValidator.new(data).validate!}.should raise_error
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'SeedGrabber' do
|
42
|
+
it 'deserialzes json files into json data' do
|
43
|
+
seed_grabber = Acorn::SeedGrabber.new DirName, [:genders, :sexual_preferences]
|
44
|
+
genders = ['male', 'female']
|
45
|
+
sexual_prefs = ['likes guys', 'likes girls', 'likes guys and girls']
|
46
|
+
seed_grabber.grab.should eql [genders, sexual_prefs]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'ARFriendly' do
|
51
|
+
it 'converts the incoming data into a form more suitable for active record' do
|
52
|
+
colors = ['red', 'green', 'blue']
|
53
|
+
short_colors = ['r', 'g', 'b']
|
54
|
+
seeds = [colors, short_colors]
|
55
|
+
|
56
|
+
attr_names = [:color_names, :short_color_names]
|
57
|
+
ar_friendly = Acorn::ARFriendly.new attr_names, seeds
|
58
|
+
expect = []
|
59
|
+
expect << {:color_names => 'red', :short_color_names => 'r'}
|
60
|
+
expect << {:color_names => 'green', :short_color_names => 'g'}
|
61
|
+
expect << {:color_names => 'blue', :short_color_names => 'b'}
|
62
|
+
ar_friendly.to_friendly.should eql expect
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'DataProcessor' do
|
67
|
+
before :each do
|
68
|
+
reconnect
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'can process one seed collection and one column' do
|
72
|
+
data = Acorn::Data.new
|
73
|
+
data.dir_name = DirName
|
74
|
+
data.seed_names = [:genders]
|
75
|
+
data.attr_names = [:gender_column]
|
76
|
+
data.ar_class = Gender
|
77
|
+
|
78
|
+
data_processor = Acorn::DataProcessor.new data
|
79
|
+
data_processor.process
|
80
|
+
|
81
|
+
Gender.all.collect{|g| g.gender_column}.should eql ['male', 'female']
|
82
|
+
end
|
83
|
+
it 'can process two seed collections and two columns' do
|
84
|
+
data = Acorn::Data.new
|
85
|
+
data.dir_name = DirName
|
86
|
+
data.seed_names = [:colors, :short_colors]
|
87
|
+
data.attr_names = [:color, :short_color]
|
88
|
+
data.ar_class = Color
|
89
|
+
|
90
|
+
data_processor = Acorn::DataProcessor.new data
|
91
|
+
data_processor.process
|
92
|
+
|
93
|
+
Color.all.collect{|c| c.color}.should eql ['red', 'green', 'blue']
|
94
|
+
Color.all.collect{|c| c.short_color}.should eql ['r', 'g', 'b']
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe 'DSL' do
|
99
|
+
before :each do
|
100
|
+
reconnect
|
101
|
+
end
|
102
|
+
it 'works' do
|
103
|
+
Acorn::Use_seed_directory(DirName).
|
104
|
+
Insert('genders').into_attr(:gender_column).of_AR_class(Gender).
|
105
|
+
Insert('colors').and('short_colors').into_attr(:color).and_attr(:short_color).of_AR_class(Color)
|
106
|
+
|
107
|
+
Gender.all.collect{|g| g.gender_column}.should eql ['male', 'female']
|
108
|
+
Color.all.collect{|c| c.color}.should eql ['red', 'green', 'blue']
|
109
|
+
Color.all.collect{|c| c.short_color}.should eql ['r', 'g', 'b']
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
["red", "green", "blue"]
|
@@ -0,0 +1 @@
|
|
1
|
+
["male","female"]
|
@@ -0,0 +1 @@
|
|
1
|
+
["likes guys","likes girls", "likes guys and girls"]
|
@@ -0,0 +1 @@
|
|
1
|
+
["r", "g", "b"]
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: acorn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- me
|
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: sqlite3
|
16
|
+
requirement: &19198580 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *19198580
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &19197740 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *19197740
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: ruby-debug19
|
38
|
+
requirement: &19197120 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *19197120
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: &19196420 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *19196420
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: activerecord
|
60
|
+
requirement: &19195420 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *19195420
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: json
|
71
|
+
requirement: &19146660 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *19146660
|
80
|
+
description: A DSL for seed.rb
|
81
|
+
email:
|
82
|
+
- me@stuffihavemade.com
|
83
|
+
executables: []
|
84
|
+
extensions: []
|
85
|
+
extra_rdoc_files: []
|
86
|
+
files:
|
87
|
+
- .gitignore
|
88
|
+
- .rbenv-version
|
89
|
+
- Gemfile
|
90
|
+
- Rakefile
|
91
|
+
- acorn.gemspec
|
92
|
+
- lib/acorn.rb
|
93
|
+
- lib/acorn/ar_friendly.rb
|
94
|
+
- lib/acorn/data.rb
|
95
|
+
- lib/acorn/data_processor.rb
|
96
|
+
- lib/acorn/data_validator.rb
|
97
|
+
- lib/acorn/dsl.rb
|
98
|
+
- lib/acorn/seed_grabber.rb
|
99
|
+
- lib/acorn/version.rb
|
100
|
+
- spec/acorn_spec.rb
|
101
|
+
- spec/test_data/colors.json
|
102
|
+
- spec/test_data/genders.json
|
103
|
+
- spec/test_data/sexual_preferences.json
|
104
|
+
- spec/test_data/short_colors.json
|
105
|
+
homepage: ''
|
106
|
+
licenses: []
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
require_paths:
|
110
|
+
- lib
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ! '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
119
|
+
requirements:
|
120
|
+
- - ! '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
requirements: []
|
124
|
+
rubyforge_project: acorn
|
125
|
+
rubygems_version: 1.8.10
|
126
|
+
signing_key:
|
127
|
+
specification_version: 3
|
128
|
+
summary: A DSL for seed.rb
|
129
|
+
test_files:
|
130
|
+
- spec/acorn_spec.rb
|
131
|
+
- spec/test_data/colors.json
|
132
|
+
- spec/test_data/genders.json
|
133
|
+
- spec/test_data/sexual_preferences.json
|
134
|
+
- spec/test_data/short_colors.json
|