fund_raise_abr 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ module FundRaise
2
+
3
+ require_relative 'fund_request'
4
+ require_relative 'die'
5
+ require_relative 'project'
6
+ require_relative 'pledge_pool'
7
+
8
+ module FundingRound
9
+
10
+ def self.one_round(project)
11
+ die_r = Die.new()
12
+ number = die_r.number
13
+ if number.odd?
14
+ project.remove_funds
15
+ else
16
+ project.add_funds
17
+ end
18
+ project.pledge_received(PledgePool.random)
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,21 @@
1
+ module FundRaise
2
+
3
+ require_relative 'project'
4
+
5
+ class ProjectGrant < Project
6
+
7
+ def initialize (name, target=1000, grant=0)
8
+ super(name, target, grant)
9
+ end
10
+
11
+ def remove_funds(remove_funding=15)
12
+ puts "#{name} is a grant. Funds can not be removed."
13
+ end
14
+
15
+ end
16
+
17
+ if __FILE__ == $0
18
+ new_grant = ProjectGrant.new("", 50)
19
+ puts new_grant.remove_funds
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ module FundRaise
2
+
3
+ require_relative 'project'
4
+
5
+ class ProjectMatch < Project
6
+
7
+ def initialize (name, target=1000, funding=0)
8
+ super(name, target, funding)
9
+ @halfway_funded = target / 2
10
+ end
11
+
12
+ def add_funds(add_funding=25, pledge=false)
13
+ if match_funds?
14
+ super(add_funding * 2)
15
+ else
16
+ if (@current_funding = add_funding) >= (@target_funding / 2)
17
+ difference = (@current_funding + add_funding) - @halfway_funded
18
+ super(difference * 2)
19
+ end
20
+ end
21
+ end
22
+
23
+ def match_funds?
24
+ @current_funding >= @target_funding/2
25
+ end
26
+
27
+ end
28
+
29
+ if __FILE__ == $0
30
+ new_match = ProjectMatch.new("Park Fund Matchings", 6000, 2000)
31
+ puts new_match.add_funds(4000)
32
+ end
33
+ end
data/lib/project.rb~ ADDED
@@ -0,0 +1,100 @@
1
+ module FundRaise
2
+
3
+ require_relative 'pledge_pool'
4
+ require_relative 'fundable'
5
+
6
+ class Project
7
+ include Fundable
8
+
9
+ attr_accessor :name
10
+ attr_reader :current_funding, :target_funding
11
+
12
+ def initialize (name, target= 1000, funding=0)
13
+ @name = name
14
+ @current_funding = funding
15
+ @target_funding = target
16
+ @pledges_received = Hash.new(0)
17
+ end
18
+
19
+ def pledge_received(pledge)
20
+ @pledges_received[pledge.name] += pledge.value
21
+ add_funds(pledge.value)
22
+ puts "#{@name} received a #{pledge.name} pledge worth $#{pledge.value}."
23
+ puts "#{@name}'s pledges: #{@pledges_received}"
24
+ end
25
+
26
+ def each_given_pledge
27
+ @pledges_received.each do |name, value|
28
+ pledge = Pledge.new(name, value)
29
+ yield pledge
30
+ end
31
+ end
32
+
33
+ def needed_funding
34
+ @target_funding - @current_funding
35
+ end
36
+
37
+ def self.from_csv(string)
38
+ name, target, funding = string.split(',')
39
+ player = Project.new(name, Integer(target), Integer(funding))
40
+ end
41
+
42
+ def to_csv
43
+ "#{@name}, #{@target_funding}, #{@current_funding}"
44
+ end
45
+
46
+ def pledge_money
47
+ @pledges_received.values.reduce(0, :+)
48
+ end
49
+
50
+ def total_funding
51
+ @current_funding + pledge_money
52
+ end
53
+
54
+ def time
55
+ current_time = Time.new
56
+ current_time.strftime("%A, %B, %d, %Y")
57
+ end
58
+
59
+ def <=>(other_project)
60
+ needed_funding <=> other_project.needed_funding
61
+ end
62
+
63
+ def to_s
64
+ "#{@name} has $#{@current_funding} in funding towards a goal of $#{@target_funding}"
65
+ end
66
+ end
67
+
68
+ if __FILE__ == $0
69
+ project1 = Project.new("Project ABC", 3000, 500)
70
+ project2 = Project.new("Project LMN", 225, 25)
71
+ project3 = Project.new("Project XYZ", 100, 110)
72
+
73
+ projects_ar = [project1, project2]
74
+
75
+ puts "There are #{projects_ar.size} projects in the array:"
76
+ projects_ar.each do |project|
77
+ puts project
78
+ end
79
+ puts project1.remove_funds
80
+ puts project2.add_funds
81
+
82
+ projects_ar.each do |project|
83
+ puts project
84
+ end
85
+
86
+ projects_ar.each do |project|
87
+ if project.current_funding < 90
88
+ puts "DELETE #{project.name}"
89
+ projects_ar.delete(project)
90
+ end
91
+ end
92
+ projects_ar.push(project3)
93
+
94
+ puts "\nThere are #{projects_ar.size} projects in the array."
95
+ projects_ar.each do |project|
96
+ puts project
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,38 @@
1
+ module FundRaise
2
+
3
+ require_relative '../../lib/fund_raise/project'
4
+ require_relative '../../lib/fund_raise/fund_request'
5
+ require_relative '../../lib/fund_raise/die'
6
+
7
+ describe FundRequest do
8
+
9
+ before do
10
+ $stdout = StringIO.new
11
+ @fundrequest = FundRequest.new("My Friendly Start-up Projects")
12
+ @initial_funding = 150
13
+ @target = 3000
14
+ @project = Project.new("Project LMN", @target, @initial_funding)
15
+ @fundrequest.add_project(@project)
16
+ end
17
+
18
+ context "rolled die" do
19
+ it "rolled an even number" do
20
+ allow_any_instance_of(Die).to receive(:number).and_return(2)
21
+ #Die.any_instance.stub(:roll).and_return(2)
22
+ @fundrequest = FundRequest.new("My Friendly Start-up Projects")
23
+ @fundrequest.add_project(@project)
24
+ @fundrequest.request_funding(1)
25
+ expect(@project.current_funding).to eq(@initial_funding + 25)
26
+ end
27
+
28
+ it "rolled an odd number" do
29
+ allow_any_instance_of(Die).to receive(:number).and_return(3)
30
+ #Die.any_instance.stub(:roll).and_return(3)
31
+ @fundrequest = FundRequest.new("My Friendly Start-up Projects")
32
+ @fundrequest.add_project(@project)
33
+ @fundrequest.request_funding(1)
34
+ expect(@project.current_funding).to eq(@initial_funding - 15)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ module FundRaise
2
+
3
+ require_relative '../lib/fund_raise/project'
4
+ require_relative '../lib/fund_raise/fund_request'
5
+ require_relative '../lib/fund_raise/die'
6
+
7
+ describe FundRequest do
8
+
9
+ before do
10
+ $stdout = StringIO.new
11
+ @fundrequest = FundRequest.new("My Friendly Start-up Projects")
12
+ @initial_funding = 150
13
+ @target = 3000
14
+ @project = Project.new("Project LMN", @target, @initial_funding)
15
+ @fundrequest.add_project(@project)
16
+ end
17
+
18
+ context "rolled die" do
19
+ it "rolled an even number" do
20
+ allow_any_instance_of(Die).to receive(:number).and_return(2)
21
+ #Die.any_instance.stub(:roll).and_return(2)
22
+ @fundrequest = FundRequest.new("My Friendly Start-up Projects")
23
+ @fundrequest.add_project(@project)
24
+ @fundrequest.request_funding(1)
25
+ expect(@project.current_funding).to eq(@initial_funding + 25)
26
+ end
27
+
28
+ it "rolled an odd number" do
29
+ allow_any_instance_of(Die).to receive(:number).and_return(3)
30
+ #Die.any_instance.stub(:roll).and_return(3)
31
+ @fundrequest = FundRequest.new("My Friendly Start-up Projects")
32
+ @fundrequest.add_project(@project)
33
+ @fundrequest.request_funding(1)
34
+ expect(@project.current_funding).to eq(@initial_funding - 15)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,51 @@
1
+ module FundRaise
2
+
3
+ require_relative '../../lib/fund_raise/project'
4
+
5
+ describe Project do
6
+
7
+ before do
8
+ $stdout = StringIO.new
9
+ @initial_funding = 150
10
+ @target = 3000
11
+ @project = Project.new("Project LMN", @target, @initial_funding)
12
+ end
13
+
14
+ it "has an initial default funding of 0" do
15
+ @project = Project.new("Project LMN", @target)
16
+ expect(@project.current_funding).to eq(0)
17
+ end
18
+
19
+ it "increased funds by 25 when funds are added" do
20
+ @project.add_funds
21
+ expect(@project.current_funding).to eq(@initial_funding + 25)
22
+ end
23
+
24
+ it "decreased funds by 15 when funds are removed" do
25
+ @project.remove_funds
26
+ expect(@project.current_funding).to eq(@initial_funding - 15)
27
+ end
28
+
29
+ it "shows funding outstanding" do
30
+ @project.add_funds(50)
31
+ expect(@project.needed_funding).to eq(@target - @initial_funding - 50)
32
+ end
33
+
34
+ it "has an initial target amount" do
35
+ @project = Project.new("Project LMN")
36
+ expect(@project.target_funding).should_not eq(0)
37
+ end
38
+
39
+ it "project is fully funded" do
40
+ @project.remove_funds(@initial_funding)
41
+ @project.add_funds(@target)
42
+ expect(@project.fully_funded?).to eq(true)
43
+ end
44
+
45
+ it "project is not fully funded" do
46
+ @project.remove_funds(@initial_funding)
47
+ @project.add_funds(@target-1)
48
+ expect(@project.fully_funded?).to eq(false)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,51 @@
1
+ module FundRaise
2
+
3
+ require_relative '../lib/fund_raise/project'
4
+
5
+ describe Project do
6
+
7
+ before do
8
+ $stdout = StringIO.new
9
+ @initial_funding = 150
10
+ @target = 3000
11
+ @project = Project.new("Project LMN", @target, @initial_funding)
12
+ end
13
+
14
+ it "has an initial default funding of 0" do
15
+ @project = Project.new("Project LMN", @target)
16
+ expect(@project.current_funding).to eq(0)
17
+ end
18
+
19
+ it "increased funds by 25 when funds are added" do
20
+ @project.add_funds
21
+ expect(@project.current_funding).to eq(@initial_funding + 25)
22
+ end
23
+
24
+ it "decreased funds by 15 when funds are removed" do
25
+ @project.remove_funds
26
+ expect(@project.current_funding).to eq(@initial_funding - 15)
27
+ end
28
+
29
+ it "shows funding outstanding" do
30
+ @project.add_funds(50)
31
+ expect(@project.needed_funding).to eq(@target - @initial_funding - 50)
32
+ end
33
+
34
+ it "has an initial target amount" do
35
+ @project = Project.new("Project LMN")
36
+ expect(@project.target_funding).should_not eq(0)
37
+ end
38
+
39
+ it "project is fully funded" do
40
+ @project.remove_funds(@initial_funding)
41
+ @project.add_funds(@target)
42
+ expect(@project.fully_funded?).to eq(true)
43
+ end
44
+
45
+ it "project is not fully funded" do
46
+ @project.remove_funds(@initial_funding)
47
+ @project.add_funds(@target-1)
48
+ expect(@project.fully_funded?).to eq(false)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,38 @@
1
+ module FundRaise
2
+
3
+ require_relative 'project'
4
+ require_relative 'fund_request'
5
+ require_relative 'die'
6
+
7
+ describe FundRequest do
8
+
9
+ before do
10
+ $stdout = StringIO.new
11
+ @fundrequest = FundRequest.new("My Friendly Start-up Projects")
12
+ @initial_funding = 150
13
+ @target = 3000
14
+ @project = Project.new("Project LMN", @target, @initial_funding)
15
+ @fundrequest.add_project(@project)
16
+ end
17
+
18
+ context "rolled die" do
19
+ it "rolled an even number" do
20
+ allow_any_instance_of(Die).to receive(:number).and_return(2)
21
+ #Die.any_instance.stub(:roll).and_return(2)
22
+ @fundrequest = FundRequest.new("My Friendly Start-up Projects")
23
+ @fundrequest.add_project(@project)
24
+ @fundrequest.request_funding(1)
25
+ expect(@project.current_funding).to eq(@initial_funding + 25)
26
+ end
27
+
28
+ it "rolled an odd number" do
29
+ allow_any_instance_of(Die).to receive(:number).and_return(3)
30
+ #Die.any_instance.stub(:roll).and_return(3)
31
+ @fundrequest = FundRequest.new("My Friendly Start-up Projects")
32
+ @fundrequest.add_project(@project)
33
+ @fundrequest.request_funding(1)
34
+ expect(@project.current_funding).to eq(@initial_funding - 15)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,51 @@
1
+ module FundRaise
2
+
3
+ require_relative 'project'
4
+
5
+ describe Project do
6
+
7
+ before do
8
+ $stdout = StringIO.new
9
+ @initial_funding = 150
10
+ @target = 3000
11
+ @project = Project.new("Project LMN", @target, @initial_funding)
12
+ end
13
+
14
+ it "has an initial default funding of 0" do
15
+ @project = Project.new("Project LMN", @target)
16
+ expect(@project.current_funding).to eq(0)
17
+ end
18
+
19
+ it "increased funds by 25 when funds are added" do
20
+ @project.add_funds
21
+ expect(@project.current_funding).to eq(@initial_funding + 25)
22
+ end
23
+
24
+ it "decreased funds by 15 when funds are removed" do
25
+ @project.remove_funds
26
+ expect(@project.current_funding).to eq(@initial_funding - 15)
27
+ end
28
+
29
+ it "shows funding outstanding" do
30
+ @project.add_funds(50)
31
+ expect(@project.needed_funding).to eq(@target - @initial_funding - 50)
32
+ end
33
+
34
+ it "has an initial target amount" do
35
+ @project = Project.new("Project LMN")
36
+ expect(@project.target_funding).should_not eq(0)
37
+ end
38
+
39
+ it "project is fully funded" do
40
+ @project.remove_funds(@initial_funding)
41
+ @project.add_funds(@target)
42
+ expect(@project.fully_funded?).to eq(true)
43
+ end
44
+
45
+ it "project is not fully funded" do
46
+ @project.remove_funds(@initial_funding)
47
+ @project.add_funds(@target-1)
48
+ expect(@project.fully_funded?).to eq(false)
49
+ end
50
+ end
51
+ end