Pratt 1.6.8-x86-linux
Sign up to get free protection for your applications and to get access to all the features.
- data/.exrc +61 -0
- data/.gitignore +6 -0
- data/History.txt +6 -0
- data/Manifest.txt +46 -0
- data/Pratt.gemspec +173 -0
- data/Pratt.mm +1867 -0
- data/README.txt +67 -0
- data/Rakefile +96 -0
- data/TODO +56 -0
- data/VERSION +1 -0
- data/bin/pratt +13 -0
- data/config.rb +19 -0
- data/db/sqlite_databases_go_here +0 -0
- data/db/zips.csv.zip +0 -0
- data/lib/models.rb +8 -0
- data/lib/pratt.rb +308 -0
- data/lib/pratt/core_ext.rb +6 -0
- data/lib/pratt/core_ext/array.rb +20 -0
- data/lib/pratt/core_ext/float.rb +29 -0
- data/lib/pratt/core_ext/nil.rb +5 -0
- data/lib/pratt/core_ext/numeric.rb +9 -0
- data/lib/pratt/core_ext/string.rb +31 -0
- data/lib/pratt/core_ext/time.rb +20 -0
- data/lib/pratt/dialogs.rb +81 -0
- data/lib/pratt/formatting.rb +19 -0
- data/lib/pratt/project_actions.rb +25 -0
- data/lib/pratt/reports.rb +140 -0
- data/models/app.rb +39 -0
- data/models/customer.rb +50 -0
- data/models/invoice.rb +28 -0
- data/models/invoice_whence.rb +18 -0
- data/models/payment.rb +22 -0
- data/models/pratt.rb +15 -0
- data/models/project.rb +89 -0
- data/models/whence.rb +77 -0
- data/models/zip.rb +27 -0
- data/pratt.mm +1875 -0
- data/spec/app_spec.rb +48 -0
- data/spec/array_spec.rb +24 -0
- data/spec/customer_spec.rb +31 -0
- data/spec/fixtures/empty_graph.expectation +8 -0
- data/spec/fixtures/graph.expectation +13 -0
- data/spec/fixtures/proportions.expectation +4 -0
- data/spec/float_spec.rb +24 -0
- data/spec/formatting_spec.rb +7 -0
- data/spec/money_spec.rb +9 -0
- data/spec/nil_class_spec.rb +8 -0
- data/spec/numeric_spec.rb +30 -0
- data/spec/payment_spec.rb +19 -0
- data/spec/pratt_spec.rb +106 -0
- data/spec/project_spec.rb +182 -0
- data/spec/rcov.opts +0 -0
- data/spec/report_action_spec.rb +83 -0
- data/spec/report_spec.rb +205 -0
- data/spec/seed_data.rb +33 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/string_ext_spec.rb +33 -0
- data/spec/whence_spec.rb +54 -0
- data/tasks/pratt.rb +87 -0
- data/templates/model.eruby +12 -0
- data/templates/spec.eruby +8 -0
- data/views/current.eruby +5 -0
- data/views/general-invoice.eruby +538 -0
- data/views/graph.eruby +16 -0
- data/views/invoice.eruby +148 -0
- data/views/main.rb +90 -0
- data/views/pid.eruby +3 -0
- data/views/pop.rb +78 -0
- data/views/proportions.eruby +4 -0
- data/views/raw.eruby +11 -0
- metadata +275 -0
data/spec/rcov.opts
ADDED
File without changes
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pratt'
|
3
|
+
|
4
|
+
describe "Pratt report actions" do
|
5
|
+
include SeedData
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@pratt = Pratt.new
|
9
|
+
@when_to = DateTime.now
|
10
|
+
load_seed_data
|
11
|
+
end
|
12
|
+
|
13
|
+
after :each do
|
14
|
+
Whence.delete_all
|
15
|
+
end
|
16
|
+
|
17
|
+
it "calls project#start! in begin method" do
|
18
|
+
@pratt.project = Project.primary
|
19
|
+
@pratt.when_to = @when_to
|
20
|
+
@pratt.project.expects(:start!).with @when_to
|
21
|
+
@pratt.begin
|
22
|
+
end
|
23
|
+
|
24
|
+
it "calls project#restart! in restart method with defined project" do
|
25
|
+
@next_when_to = @when_to + 7.minutes
|
26
|
+
primary = Project.primary
|
27
|
+
primary.start! @when_to
|
28
|
+
@pratt.project = primary
|
29
|
+
@pratt.when_to = @next_when_to
|
30
|
+
whence = primary.whences.last
|
31
|
+
Whence.expects(:last_unended).never
|
32
|
+
primary.expects(:restart!).with @next_when_to
|
33
|
+
@pratt.restart
|
34
|
+
end
|
35
|
+
|
36
|
+
it "calls last unended project in restart method without defined project" do
|
37
|
+
@next_when_to = @when_to + 7.minutes
|
38
|
+
primary = Project.primary
|
39
|
+
primary.start! @when_to
|
40
|
+
@pratt.when_to = @next_when_to
|
41
|
+
whence = primary.whences.last
|
42
|
+
Whence.expects(:last_unended).returns whence
|
43
|
+
whence.project.expects(:restart!).with @next_when_to
|
44
|
+
@pratt.restart
|
45
|
+
whence.project.should eql(primary)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "stops! defined project in end method" do
|
49
|
+
@pratt.project = Project.primary
|
50
|
+
@pratt.when_to = @when_to
|
51
|
+
@pratt.project.expects(:stop!).with @when_to
|
52
|
+
@pratt.end
|
53
|
+
end
|
54
|
+
|
55
|
+
it "stops! the last unended project in end method without defined project" do
|
56
|
+
primary = Project.primary
|
57
|
+
primary.start! @when_to
|
58
|
+
whence = primary.whences.last
|
59
|
+
Whence.expects(:last_unended).returns whence
|
60
|
+
whence.expects(:stop!).with @when_to
|
61
|
+
@pratt.when_to = @when_to
|
62
|
+
@pratt.end
|
63
|
+
end
|
64
|
+
|
65
|
+
it "changes last project in change method" do
|
66
|
+
primary = Project.primary
|
67
|
+
primary.start! @when_to
|
68
|
+
primary.stop! @when_to+10.minutes
|
69
|
+
other = Project.rest.first
|
70
|
+
whence = primary.whences.last
|
71
|
+
Whence.expects(:last).returns whence
|
72
|
+
whence.expects(:change!).with other.name
|
73
|
+
@pratt.project = other
|
74
|
+
@pratt.change
|
75
|
+
end
|
76
|
+
|
77
|
+
it "destroys defined project in destroy method" do
|
78
|
+
@pratt.project = Project.create :name => "to be destroyed"
|
79
|
+
lambda {
|
80
|
+
@pratt.destroy
|
81
|
+
}.should change(Project, :count).by -1
|
82
|
+
end
|
83
|
+
end
|
data/spec/report_spec.rb
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pratt'
|
3
|
+
|
4
|
+
describe "Pratt report method" do
|
5
|
+
|
6
|
+
describe "#pid" do
|
7
|
+
@pratt = Pratt.new
|
8
|
+
@pratt.expects(:template=).with("pid")
|
9
|
+
@pratt.expects(:process_template!)
|
10
|
+
@pratt.pid
|
11
|
+
end
|
12
|
+
|
13
|
+
# FIXME: Get this working
|
14
|
+
describe "#cpid" #do
|
15
|
+
# @pratt = Pratt.new
|
16
|
+
# ::Kernel.expects(:`)
|
17
|
+
# @pratt.cpid
|
18
|
+
# end
|
19
|
+
|
20
|
+
describe "#graph" do
|
21
|
+
before :each do
|
22
|
+
@pratt = Pratt.new
|
23
|
+
end
|
24
|
+
|
25
|
+
it "with no project uses Project.all to generate output" do
|
26
|
+
@pratt.expects(:template=).with("graph")
|
27
|
+
@pratt.expects(:project?).returns false
|
28
|
+
Project.expects(:all).returns([])
|
29
|
+
@pratt.expects(:process_template!)
|
30
|
+
@pratt.graph
|
31
|
+
end
|
32
|
+
|
33
|
+
it "with project uses defined project to generate output" do
|
34
|
+
@pratt.project = Project.new
|
35
|
+
@pratt.expects(:template=).with("graph")
|
36
|
+
@pratt.expects(:project?).returns true
|
37
|
+
@pratt.expects(:process_template!)
|
38
|
+
@pratt.graph
|
39
|
+
@pratt.instance_variable_get("@projects").should eql([@pratt.project])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "output" do
|
44
|
+
include SeedData
|
45
|
+
|
46
|
+
before :each do
|
47
|
+
@pratt = Pratt.new
|
48
|
+
end
|
49
|
+
before :each do
|
50
|
+
@when_to = Chronic.parse('September 29 2009').beginning_of_week
|
51
|
+
@pratt.scale = 'week'
|
52
|
+
@pratt.when_to = @when_to
|
53
|
+
@customer = Customer.create :name => 'Bob Hope', :address => '123 Where St', :zip => '22222'
|
54
|
+
@tasks = []
|
55
|
+
end
|
56
|
+
|
57
|
+
after :each do
|
58
|
+
Whence.delete_all
|
59
|
+
@customer.destroy
|
60
|
+
@tasks.each(&:destroy)
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_expected_display fixture_name
|
64
|
+
Pratt.root('spec', 'fixtures', "#{fixture_name}.expectation").first.read
|
65
|
+
end
|
66
|
+
|
67
|
+
it "graphs output as expected with no data" do
|
68
|
+
Pratt.color = false
|
69
|
+
Project.stubs(:longest_project_name).returns 12
|
70
|
+
Project.stubs(:all).returns([])
|
71
|
+
$stdout.expects(:puts)
|
72
|
+
@pratt.graph
|
73
|
+
@pratt.send(:output).should eql( get_expected_display("empty_graph") )
|
74
|
+
end
|
75
|
+
|
76
|
+
it "graphs output as expected with data" do
|
77
|
+
populate_with_data
|
78
|
+
Pratt.color = false
|
79
|
+
Project.stubs(:longest_project_name).returns 12
|
80
|
+
$stdout.expects(:puts)
|
81
|
+
|
82
|
+
@pratt.graph
|
83
|
+
@pratt.send(:output).should eql( get_expected_display("graph") )
|
84
|
+
end
|
85
|
+
|
86
|
+
it "generates proportions graphs output as expected with data" do
|
87
|
+
populate_with_data
|
88
|
+
Pratt.color = false
|
89
|
+
Project.stubs(:longest_project_name).returns 12
|
90
|
+
$stdout.expects(:puts)
|
91
|
+
|
92
|
+
@pratt.proportions
|
93
|
+
@pratt.send(:output).should eql( get_expected_display("proportions") )
|
94
|
+
end
|
95
|
+
|
96
|
+
def task name, time_spent
|
97
|
+
task = Project.find_or_create_by_name :name => name, :customer => @customer
|
98
|
+
task.start! @when_to
|
99
|
+
task.stop! @when_to+time_spent
|
100
|
+
@tasks << task
|
101
|
+
end
|
102
|
+
|
103
|
+
def populate_with_data
|
104
|
+
load_seed_data
|
105
|
+
@tasks << Project.primary
|
106
|
+
task 'Lunch/Break', 1.hour+21.minutes+0.seconds
|
107
|
+
task 'Task1', 1.hour+4.minutes+0.seconds
|
108
|
+
task 'Task2', 58.minutes+0.seconds
|
109
|
+
task 'Another Task', 5.minutes+0.seconds
|
110
|
+
task 'Task3', 1.day+17.hours+32.minutes+0.seconds
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "#proportions" do
|
115
|
+
include SeedData
|
116
|
+
|
117
|
+
before :each do
|
118
|
+
@pratt = Pratt.new
|
119
|
+
end
|
120
|
+
before :each do
|
121
|
+
@when_to = Chronic.parse('last week').beginning_of_week
|
122
|
+
@pratt.scale = 'week'
|
123
|
+
@pratt.when_to = @when_to
|
124
|
+
@customer = Customer.create :name => 'Bob Hope', :address => '123 Where St', :zip => '22222'
|
125
|
+
@tasks = []
|
126
|
+
end
|
127
|
+
|
128
|
+
after :each do
|
129
|
+
Whence.delete_all
|
130
|
+
@customer.destroy
|
131
|
+
@tasks.each(&:destroy)
|
132
|
+
end
|
133
|
+
|
134
|
+
def task name, time_spent
|
135
|
+
task = Project.find_or_create_by_name :name => name, :customer => @customer, :weight => -1
|
136
|
+
task.start! @when_to
|
137
|
+
task.stop! @when_to+time_spent
|
138
|
+
@tasks << task
|
139
|
+
end
|
140
|
+
|
141
|
+
def populate_with_data
|
142
|
+
load_seed_data
|
143
|
+
primary = Project.primary
|
144
|
+
primary.start! @when_to
|
145
|
+
primary.stop! @when_to+20.hours
|
146
|
+
@tasks << primary
|
147
|
+
task 'Lunch/Break', 1.hour+21.minutes
|
148
|
+
task 'Task1', 1.hour+4.minutes
|
149
|
+
task 'Task2', 58.minutes
|
150
|
+
task 'Another Task', 5.minutes
|
151
|
+
task 'Task3', 1.day+17.hours+32.minutes
|
152
|
+
end
|
153
|
+
|
154
|
+
it "uses Project.all with data to generate output" do
|
155
|
+
populate_with_data
|
156
|
+
@pratt.expects(:template=).with("proportions")
|
157
|
+
@pratt.expects(:project?).returns false
|
158
|
+
@pratt.expects(:process_template!)
|
159
|
+
@pratt.proportions
|
160
|
+
@pratt.instance_variable_get("@primary").should eql(20.0)
|
161
|
+
@pratt.instance_variable_get("@off_total").should eql(1.35)
|
162
|
+
@pratt.instance_variable_get("@rest_total").should eql(43.65)
|
163
|
+
@pratt.instance_variable_get("@projects").should eql(Project.all)
|
164
|
+
@pratt.instance_variable_get("@scaled_total").should eql(63.65)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "uses defined project with data to generate output" do
|
168
|
+
populate_with_data
|
169
|
+
@pratt.expects(:template=).with("proportions")
|
170
|
+
@pratt.expects(:project?).returns true
|
171
|
+
@pratt.project = Project.named('Task1')
|
172
|
+
@pratt.expects(:process_template!)
|
173
|
+
@pratt.proportions
|
174
|
+
@pratt.instance_variable_get("@primary").should eql(64/60.0)
|
175
|
+
@pratt.instance_variable_get("@off_total").should eql(0.0)
|
176
|
+
@pratt.instance_variable_get("@rest_total").should eql(0.0)
|
177
|
+
@pratt.instance_variable_get("@projects").should eql([@pratt.project])
|
178
|
+
@pratt.instance_variable_get("@scaled_total").should eql(64/60.0)
|
179
|
+
end
|
180
|
+
|
181
|
+
it "uses Project.all with no data to generate output" do
|
182
|
+
@pratt.expects(:template=).with("proportions")
|
183
|
+
@pratt.expects(:project?).returns false
|
184
|
+
Project.expects(:all).returns []
|
185
|
+
@pratt.expects(:process_template!).never
|
186
|
+
$stdout.expects(:puts).with "No data to report"
|
187
|
+
@pratt.proportions
|
188
|
+
end
|
189
|
+
|
190
|
+
it "uses defined project with no with data to generate output" do
|
191
|
+
@pratt.expects(:template=).with("proportions")
|
192
|
+
@pratt.expects(:project?).returns true
|
193
|
+
@pratt.project = Project.new
|
194
|
+
@pratt.project.expects(:time_spent).twice.returns 0.0
|
195
|
+
@pratt.expects(:process_template!).never
|
196
|
+
$stdout.expects(:puts).with "No data to report"
|
197
|
+
@pratt.proportions
|
198
|
+
@pratt.instance_variable_get("@primary").should eql(0.0)
|
199
|
+
@pratt.instance_variable_get("@off_total").should eql(0.0)
|
200
|
+
@pratt.instance_variable_get("@rest_total").should eql(0.0)
|
201
|
+
@pratt.instance_variable_get("@projects").should eql([@pratt.project])
|
202
|
+
@pratt.instance_variable_get("@scaled_total").should eql(0.0)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
data/spec/seed_data.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module SeedData
|
2
|
+
def load_seed_data
|
3
|
+
Customer.delete_all
|
4
|
+
customer = Customer.create(
|
5
|
+
:name => 'Scott Noel-Hemming',
|
6
|
+
:company_name => 'Frogstarr78 Software',
|
7
|
+
:address => '312 NW 7th',
|
8
|
+
:phone => '509.730.5401',
|
9
|
+
:zip => '97862'
|
10
|
+
)
|
11
|
+
|
12
|
+
Project.delete_all
|
13
|
+
Project.create(
|
14
|
+
[
|
15
|
+
{
|
16
|
+
:name => 'Refactor',
|
17
|
+
:weight => 1,
|
18
|
+
:customer => customer
|
19
|
+
},
|
20
|
+
{
|
21
|
+
:name => 'Lunch/Break',
|
22
|
+
:weight => 0,
|
23
|
+
:customer => customer
|
24
|
+
},
|
25
|
+
{
|
26
|
+
:name => 'Other',
|
27
|
+
:weight => -1,
|
28
|
+
:customer => customer
|
29
|
+
}
|
30
|
+
]
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# This file is copied to ~/spec when you run 'ruby script/generate rspec'
|
2
|
+
# from the project root directory.
|
3
|
+
require 'rubygems'
|
4
|
+
require 'spec'
|
5
|
+
require 'mocha'
|
6
|
+
require 'lib/pratt'
|
7
|
+
require 'ruby-debug'
|
8
|
+
require 'seed_data'
|
9
|
+
|
10
|
+
Spec::Runner.configure do |config|
|
11
|
+
# config.mock_with :rspec
|
12
|
+
config.mock_with :mocha
|
13
|
+
|
14
|
+
Pratt.connect! 'test'
|
15
|
+
end
|
16
|
+
|
17
|
+
shared_examples_for "Time spent on a project" do
|
18
|
+
end
|
19
|
+
|
20
|
+
shared_examples_for "being a billable item" do
|
21
|
+
it "responds to amount" do
|
22
|
+
subject.class.new.should respond_to(:amount)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pratt'
|
3
|
+
|
4
|
+
describe String do
|
5
|
+
it { subject.should respond_to(:colorize) }
|
6
|
+
it { subject.should respond_to(:or) }
|
7
|
+
it { subject.should respond_to(:with_label) }
|
8
|
+
|
9
|
+
it "doesn't process alternate format when Pratt.color? == false" do
|
10
|
+
Pratt.color = false
|
11
|
+
"abc".or("xyz").should eql("abc")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "processes alternate format when Pratt.color? == true" do
|
15
|
+
Pratt.color = true
|
16
|
+
"abc".or("xyz").should eql("xyz")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "doesn't colorize when Pratt.color? == false" do
|
20
|
+
Pratt.color = false
|
21
|
+
"abc".blue.should eql("abc")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "colorizes when Pratt.color? == true" do
|
25
|
+
Pratt.color = true
|
26
|
+
"abc".blue.should eql("\e[34mabc\e[0m")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "handles with_label as expected" do
|
30
|
+
Project.expects(:longest_project_name).returns 11
|
31
|
+
"abc".with_label("label").should eql(" label abc")
|
32
|
+
end
|
33
|
+
end
|
data/spec/whence_spec.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Whence do
|
4
|
+
|
5
|
+
context "scopes" do
|
6
|
+
it "last_unended should return nil if there aren't any unended" do
|
7
|
+
Whence.expects(:first).with(:conditions => "end_at IS NULL", :order => "start_at DESC")
|
8
|
+
Whence.last_unended
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "instances" do
|
13
|
+
before :each do
|
14
|
+
@whence = Whence.new
|
15
|
+
end
|
16
|
+
|
17
|
+
it "parse a string argument to stop!" do
|
18
|
+
when_to = 'yesterday'
|
19
|
+
when_to = '2009-10-06 13:48:58'
|
20
|
+
expectation = Chronic.parse when_to
|
21
|
+
|
22
|
+
@whence.expects(:save!)
|
23
|
+
@whence.expects(:reload)
|
24
|
+
# don't work I'm not sure why
|
25
|
+
# @whence.expects(:end_at).with expectation
|
26
|
+
# Chronic.expects(:parse).with when_to
|
27
|
+
|
28
|
+
@whence.stop! when_to
|
29
|
+
@whence.end_at.should == expectation
|
30
|
+
end
|
31
|
+
|
32
|
+
it "doesn't parse a non-string thing on stop!" do
|
33
|
+
when_to = Chronic.parse 'last week'
|
34
|
+
Chronic.expects(:parse).never
|
35
|
+
@whence.expects(:save!)
|
36
|
+
@whence.expects(:reload)
|
37
|
+
@whence.stop! when_to
|
38
|
+
@whence.end_at.should == when_to
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should change! to project correctly" do
|
42
|
+
project_name = 'proj'
|
43
|
+
@whence.expects(:save!)
|
44
|
+
@whence.expects(:reload)
|
45
|
+
@whence.change! project_name
|
46
|
+
@whence.project.name.should == project_name
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should have a special output for start_at.to_s" do
|
50
|
+
@whence.start_at = Time.parse('Wed Oct 7 10:57:21 PDT 2009')
|
51
|
+
@whence.start_at.to_s.should eql('Wed 07 Oct 2009 10:57:21')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/tasks/pratt.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
namespace :pratt do
|
4
|
+
|
5
|
+
task :establish_connection do
|
6
|
+
Pratt.connect!( ENV['PRATT_ENV'] || 'development' )
|
7
|
+
Pratt.root 'models', '*.rb' do |model|
|
8
|
+
require model
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "DB Quick access"
|
13
|
+
namespace :db do
|
14
|
+
|
15
|
+
desc "Show App detail."
|
16
|
+
task :app => :establish_connection do
|
17
|
+
puts App.last.inspect
|
18
|
+
end
|
19
|
+
|
20
|
+
namespace :schema do
|
21
|
+
desc "Run schema file"
|
22
|
+
task :run, :file, :needs => :establish_connection do |t, args|
|
23
|
+
puts args.inspect
|
24
|
+
puts args.file.nil?
|
25
|
+
puts args.file.empty?
|
26
|
+
raise "Missing required file argument" if args.file.nil? or ( not args.file.nil? and args.file.empty? )
|
27
|
+
schema_change = File.open( args.file ).read
|
28
|
+
|
29
|
+
ActiveRecord::Schema.define do
|
30
|
+
ActiveRecord::Base.transaction do
|
31
|
+
begin
|
32
|
+
eval schema_change
|
33
|
+
rescue Exception => e
|
34
|
+
puts "There was an error:
|
35
|
+
#{e.inspect}.
|
36
|
+
Rolling back!"
|
37
|
+
raise ActiveRecord::Rollback
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
namespace :generate do
|
46
|
+
desc "Genarate model"
|
47
|
+
task :model do
|
48
|
+
raise "Missing required klass parameter" unless ENV.include? 'klass'
|
49
|
+
klass = ENV['klass'].downcase.singularize
|
50
|
+
outfile = File.join(Pratt.root('models'), "#{klass}.rb")
|
51
|
+
template = ''
|
52
|
+
Pratt.root('templates', 'model.eruby') {|model_gen| template = File.read(model_gen) }
|
53
|
+
|
54
|
+
eruby = Erubis::Eruby.new(template)
|
55
|
+
unless File.exists? outfile
|
56
|
+
File.open(outfile, 'w') {|file| file.write eruby.result(:klass => klass) }
|
57
|
+
else
|
58
|
+
puts "Model '#{klass}' already exists"
|
59
|
+
end
|
60
|
+
|
61
|
+
Rake::Task["generate:spec"].execute
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Generate spec test"
|
65
|
+
task :spec do
|
66
|
+
klass = ENV['klass'].downcase.singularize
|
67
|
+
raise "Missing required klass parameter" unless ENV.include? 'klass'
|
68
|
+
|
69
|
+
outpath = File.join(Pratt.root('spec'), "#{klass}_spec.rb")
|
70
|
+
inpath = File.join(Pratt.root('templates'), "spec.eruby")
|
71
|
+
|
72
|
+
if File.exists? outpath
|
73
|
+
puts "Spec '#{klass}' already exists"
|
74
|
+
else
|
75
|
+
File.open outpath, 'w' do |outfile|
|
76
|
+
File.open inpath do |infile|
|
77
|
+
eruby = Erubis::Eruby.new( infile.read )
|
78
|
+
outfile.write eruby.result( :klass => klass )
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
# vim: syntax=Ruby
|