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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
@@ -0,0 +1 @@
1
+ 1.9.2-p290
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in acorn.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -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
@@ -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
@@ -0,0 +1,12 @@
1
+ module Acorn
2
+ class Data
3
+ attr_accessor :dir_name, :seed_names, :attr_names, :ar_class
4
+ def initialize
5
+ self.seed_names = []
6
+ self.attr_names = []
7
+ end
8
+ def process
9
+ DataProcessor.new(self).process
10
+ end
11
+ end
12
+ end
@@ -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
@@ -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
@@ -0,0 +1,3 @@
1
+ module Acorn
2
+ VERSION = "0.1.0"
3
+ end
@@ -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