mfp_fundraising_program 1.0.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.
- checksums.yaml +7 -0
- data/LICENSE +19 -0
- data/README +1 -0
- data/bin/fundraising_program +39 -0
- data/bin/projects.csv +3 -0
- data/bin/under_fundeds_projects.txt +5 -0
- data/lib/fundraising_program/die.rb +13 -0
- data/lib/fundraising_program/fundable.rb +19 -0
- data/lib/fundraising_program/funding_round.rb +29 -0
- data/lib/fundraising_program/fundrequest.rb +102 -0
- data/lib/fundraising_program/grant_project.rb +15 -0
- data/lib/fundraising_program/half_way_project.rb +34 -0
- data/lib/fundraising_program/pledge_pool.rb +20 -0
- data/lib/fundraising_program/project.rb +59 -0
- data/spec/fundraising_program/fundrequest_spec.rb +68 -0
- data/spec/fundraising_program/grant_project_spec.rb +18 -0
- data/spec/fundraising_program/half_way_project_spec.rb +57 -0
- data/spec/fundraising_program/pledge_pool_spec.rb +46 -0
- data/spec/fundraising_program/project_spec.rb +161 -0
- data/spec/fundraising_program/spec_helper.rb +8 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7754ede7efe3f58bbfaa4a3f806c4eb34612798e
|
4
|
+
data.tar.gz: fa0cb7c6042995311db355f46f4e788a66b7cb09
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 10c54d48dbe3329b7bdec55a66dd794fed0148b4f371bdf83a7aff4aae9ce05becc8fc863528ec2e71012157f61489ba337ef65c6ba1227b9de9e8c572140b12
|
7
|
+
data.tar.gz: 5a71564e9eb2cd031217d60df8ffe3e7a1788dffac3ebec28a3b7d49e64daf0e69edab94a79ffe0bf8f7c96e2e03416b5c4d4130fc2ab895aec44056e745129d
|
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Marcos Parreiras
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
This is the project developed following the Pragmatic Studio for Ruby and following the bonus rounds from across exercises.
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/fundraising_program/fundrequest'
|
4
|
+
require_relative '../lib/fundraising_program/grant_project'
|
5
|
+
require_relative '../lib/fundraising_program/half_way_project'
|
6
|
+
|
7
|
+
# Dados baseados em https://wefunder.me/
|
8
|
+
# project1 = Project.new( 'parkav', 669, 700 );
|
9
|
+
# project2 = Project.new( 'plate iq', 654, 700 );
|
10
|
+
# project3 = Project.new( 'bagaveev', 1128, 1600 );
|
11
|
+
# project4 = Project.new( 'flaviar', 2912, 3400 );
|
12
|
+
|
13
|
+
fund_program1 = FundraisingProgram::FundRequest.new("VC-Friendly Start-up Projects.")
|
14
|
+
# fund_program1.load_projects(ARGV.shift || "projects.csv")
|
15
|
+
default_projects_file = File.join(File.dirname(__FILE__), 'projects.csv')
|
16
|
+
fund_program1.load_projects(ARGV.shift || default_projects_file)
|
17
|
+
|
18
|
+
|
19
|
+
grant_project = FundraisingProgram::GrantProject.new("grant", 200, 2030)
|
20
|
+
half_way_project = FundraisingProgram::HalfWayProject.new("half way", 200, 4000)
|
21
|
+
|
22
|
+
|
23
|
+
fund_program1.add_project(grant_project)
|
24
|
+
fund_program1.add_project(half_way_project)
|
25
|
+
|
26
|
+
loop do
|
27
|
+
puts "How many rounds? ('quit' to exit)"
|
28
|
+
answer = STDIN.gets.chomp.downcase
|
29
|
+
case answer
|
30
|
+
when /^\d+$/
|
31
|
+
puts "Enjoy the #{answer} rounds"
|
32
|
+
fund_program1.request_funding(answer.to_i)
|
33
|
+
when 'quit', 'exit'
|
34
|
+
fund_program1.print_stats
|
35
|
+
break
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
fund_program1.save_under_funded_projects("under_fundeds_projects.txt")
|
data/bin/projects.csv
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module FundraisingProgram
|
2
|
+
module Fundable
|
3
|
+
|
4
|
+
def add_fund
|
5
|
+
self.funding += 25
|
6
|
+
puts "O projeto #{self.name.upcase} recebeu mais fundos =D."
|
7
|
+
end
|
8
|
+
|
9
|
+
def remove_fund
|
10
|
+
self.funding -= 15
|
11
|
+
puts "O projeto #{self.name.upcase} perdeu alguns fundos =(."
|
12
|
+
end
|
13
|
+
|
14
|
+
def fully_funded?
|
15
|
+
self.total_funds >= self.target_funding
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative 'project'
|
2
|
+
require_relative 'die'
|
3
|
+
require_relative 'pledge_pool'
|
4
|
+
|
5
|
+
module FundraisingProgram
|
6
|
+
module FundingRound
|
7
|
+
def self.take_turn(project)
|
8
|
+
die = Die.new
|
9
|
+
number_rolled = die.roll
|
10
|
+
case number_rolled
|
11
|
+
when 1..2
|
12
|
+
project.add_fund
|
13
|
+
when 3
|
14
|
+
puts "#{project.name} skipped"
|
15
|
+
when 4..5
|
16
|
+
project.remove_fund
|
17
|
+
end
|
18
|
+
# puts '----------kkkkk'
|
19
|
+
pledge = PledgePool::random
|
20
|
+
# puts "\nProject #{project.name} received #{pledge.name} pledge worth $#{pledge.amount}"
|
21
|
+
|
22
|
+
project.add_pledge(pledge)
|
23
|
+
puts "\nProject #{project.name} received #{pledge.name} pledge worth $#{pledge.amount}"
|
24
|
+
puts "#{project.name}'s pledges: #{project.pledges_accumulated}"
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require_relative 'project'
|
2
|
+
require_relative 'die'
|
3
|
+
require_relative 'funding_round'
|
4
|
+
require_relative 'pledge_pool'
|
5
|
+
|
6
|
+
module FundraisingProgram
|
7
|
+
class FundRequest
|
8
|
+
attr_accessor :name
|
9
|
+
|
10
|
+
def initialize(name)
|
11
|
+
@name = name
|
12
|
+
@projects = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def load_projects(from_file)
|
16
|
+
File.readlines(from_file).each do |line|
|
17
|
+
add_project(Project.from_csv(line))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def save_under_funded_projects(to_file)
|
22
|
+
File.open(to_file, "w") do |file|
|
23
|
+
file.puts "Under funded projecs:"
|
24
|
+
under_funded_projects.each do |project|
|
25
|
+
file.puts print_project_stats(project)
|
26
|
+
# file << print_project_stats(project)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_project(project)
|
32
|
+
@projects << project
|
33
|
+
end
|
34
|
+
|
35
|
+
def request_funding(rounds)
|
36
|
+
pledges = PledgePool::PLEDGES
|
37
|
+
puts "There are #{pledges.size} pledges:"
|
38
|
+
pledges.each do |pledge|
|
39
|
+
puts "\tA #{pledge.name} plage is worth #{pledge.amount}"
|
40
|
+
end
|
41
|
+
|
42
|
+
1.upto(rounds) do |round|
|
43
|
+
puts "\nRequest Funding on Round: #{round}"
|
44
|
+
@projects.each do |project|
|
45
|
+
FundingRound.take_turn(project)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def print_project_stats(project)
|
51
|
+
"#{project.name}".ljust(30, '.') + "#{project.funding}".ljust(9,'.') + "#{project.target_funding}"
|
52
|
+
end
|
53
|
+
|
54
|
+
def print_project_funding_left(project)
|
55
|
+
"#{project.name}".ljust(30, '.') + "#{project.funding_left}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def under_funded_projects
|
59
|
+
under_funded = @projects.reject { |project| project.fully_funded? }
|
60
|
+
end
|
61
|
+
|
62
|
+
def fully_funded_projects
|
63
|
+
@projects.select { |project| project.fully_funded? }
|
64
|
+
end
|
65
|
+
|
66
|
+
def print_stats
|
67
|
+
puts "\nStats for #{@name}"
|
68
|
+
# fully_funded, under_funded = @projects.partition { |project| project.fully_funded? }
|
69
|
+
|
70
|
+
fully_funded = fully_funded_projects
|
71
|
+
under_funded = under_funded_projects
|
72
|
+
|
73
|
+
puts "\nFully funded projecs:"
|
74
|
+
fully_funded.each { |project| puts print_project_stats(project) }
|
75
|
+
|
76
|
+
puts "\nUnder funded projecs:"
|
77
|
+
under_funded.each { |project| puts print_project_stats(project) }
|
78
|
+
|
79
|
+
puts "\nProjects with more fundings left"
|
80
|
+
under_funded.sort.each { |project| puts print_project_funding_left(project) }
|
81
|
+
|
82
|
+
@projects.each do |project|
|
83
|
+
puts "\nProject #{project.name} pledges:"
|
84
|
+
project.each_pledge do |pledge|
|
85
|
+
puts "$#{pledge.amount} in #{pledge.name} pledges"
|
86
|
+
end
|
87
|
+
puts "$#{project.pledges_amount} in total pledges"
|
88
|
+
end
|
89
|
+
|
90
|
+
# @projects.sort.each { |project| puts print_project_funding_left(project) unless project.fully_funded? }
|
91
|
+
end
|
92
|
+
|
93
|
+
# def print_project_stats(project)
|
94
|
+
# puts "#{project.name}".ljust(30,'.') + "#{project.funding_left}"
|
95
|
+
# end
|
96
|
+
|
97
|
+
def total_pledges_amount
|
98
|
+
@projects.each.reduce(0) { |sum, project| sum += project.pledges_amount }
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require_relative 'project'
|
2
|
+
|
3
|
+
module FundraisingProgram
|
4
|
+
class GrantProject < Project
|
5
|
+
|
6
|
+
def remove_fund
|
7
|
+
puts "The project #{@name} is a Grant project and can't have funds removed"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
if __FILE__ == $0
|
13
|
+
grant = GrantProject.new("grant",400,1000)
|
14
|
+
puts grant
|
15
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative 'project'
|
2
|
+
|
3
|
+
module FundraisingProgram
|
4
|
+
class HalfWayProject < Project
|
5
|
+
|
6
|
+
def initialize(name, funding, target_funding, extra_funding=500)
|
7
|
+
super(name,funding,target_funding)
|
8
|
+
@extra_funding = extra_funding
|
9
|
+
end
|
10
|
+
|
11
|
+
def half_way_reached?(funding1, funding2)
|
12
|
+
(funding1 < target_funding / 2) && (funding2 >= target_funding/2)
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_fund
|
16
|
+
funding1 = total_funds
|
17
|
+
super
|
18
|
+
funding2 = total_funds
|
19
|
+
if half_way_reached?(funding1, funding2)
|
20
|
+
@funding += @extra_funding
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_pledge(pledge)
|
25
|
+
funding1 = total_funds
|
26
|
+
super(pledge)
|
27
|
+
funding2 = total_funds
|
28
|
+
if half_way_reached?(funding1, funding2)
|
29
|
+
@funding += @extra_funding
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module FundraisingProgram
|
2
|
+
Pledge = Struct.new(:name, :amount)
|
3
|
+
|
4
|
+
module PledgePool
|
5
|
+
PLEDGES = [
|
6
|
+
Pledge.new(:bronze, 50),
|
7
|
+
Pledge.new(:silver, 75),
|
8
|
+
Pledge.new(:gold, 100),
|
9
|
+
]
|
10
|
+
|
11
|
+
def self.random
|
12
|
+
PLEDGES.sample
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
if __FILE__ == $0
|
18
|
+
# puts TreasureTrove::TREASURES
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative 'pledge_pool'
|
2
|
+
require_relative 'fundable'
|
3
|
+
|
4
|
+
module FundraisingProgram
|
5
|
+
class Project
|
6
|
+
include Fundable
|
7
|
+
|
8
|
+
attr_reader :target_funding, :pledges_accumulated
|
9
|
+
attr_accessor :name, :funding
|
10
|
+
|
11
|
+
def initialize( name, funding = 0, target_funding = 1000 )
|
12
|
+
@name = name.capitalize
|
13
|
+
@funding = funding
|
14
|
+
@target_funding = target_funding
|
15
|
+
@pledges_accumulated = Hash.new(0)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.from_csv(line)
|
19
|
+
name, funding, target_funding = line.split(',')
|
20
|
+
Project.new(name, Integer(funding), Integer(target_funding))
|
21
|
+
end
|
22
|
+
|
23
|
+
def each_pledge
|
24
|
+
@pledges_accumulated.each do |name, amount|
|
25
|
+
pledge = Pledge.new(name,amount)
|
26
|
+
yield pledge
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
"O projeto #{@name.upcase} tem investimento acumulado de R$ #{@funding} de R$ #{@target_funding} desejados. Faltam R$ #{funding_left} para o objetivo ser alcancado!"
|
32
|
+
end
|
33
|
+
|
34
|
+
def funding_left
|
35
|
+
target_funding - total_funds
|
36
|
+
end
|
37
|
+
|
38
|
+
def name=(new_name)
|
39
|
+
@name = new_name.capitalize
|
40
|
+
end
|
41
|
+
|
42
|
+
def <=>(other)
|
43
|
+
other.funding_left <=> funding_left
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_pledge(pledge)
|
47
|
+
@pledges_accumulated[pledge.name] += pledge.amount
|
48
|
+
end
|
49
|
+
|
50
|
+
def total_funds
|
51
|
+
@funding + pledges_amount
|
52
|
+
end
|
53
|
+
|
54
|
+
def pledges_amount
|
55
|
+
@pledges_accumulated.values.reduce(0, :+)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'fundraising_program/fundrequest'
|
3
|
+
require 'fundraising_program/pledge_pool'
|
4
|
+
|
5
|
+
module FundraisingProgram
|
6
|
+
describe FundRequest do
|
7
|
+
$stdout = StringIO.new
|
8
|
+
|
9
|
+
context "Program with only one project" do
|
10
|
+
before do
|
11
|
+
@initial_funding = 100
|
12
|
+
@target_funding = 230
|
13
|
+
@project = Project.new('ABC', @initial_funding, @target_funding)
|
14
|
+
@program = FundRequest.new('Start-ups raising program')
|
15
|
+
@program.add_project(@project)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "increases funding amount when gets a new investiment (low number - roll_number = 1)" do
|
19
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(1)
|
20
|
+
@program.request_funding(1)
|
21
|
+
expect(@project.funding).to eq(@initial_funding+25)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "increases funding amount when gets a new investiment (low number - roll_number = 2)" do
|
25
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(2)
|
26
|
+
@program.request_funding(1)
|
27
|
+
expect(@project.funding).to eq(@initial_funding+25)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "decreases funding amount when loses an investiment (medium number - roll_number = 3)" do
|
31
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(3)
|
32
|
+
@program.request_funding(1)
|
33
|
+
expect(@project.funding).to eq(@initial_funding)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "keeps the funding amount when neither gets nor loses investiment (high number - roll_number = 4)" do
|
37
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(4)
|
38
|
+
@program.request_funding(1)
|
39
|
+
expect(@project.funding).to eq(@initial_funding-15)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "keeps the funding amount when neither gets nor loses investiment (high number - roll_number = 5)" do
|
43
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(5)
|
44
|
+
@program.request_funding(1)
|
45
|
+
expect(@project.funding).to eq(@initial_funding-15)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "computes total points as the sum of all player points" do
|
49
|
+
fund_program = FundRequest.new("VC-Friendly Start-up Projects")
|
50
|
+
project1 = Project.new( 'parkav', 669, 700 );
|
51
|
+
project2 = Project.new( 'plate iq', 654, 700 );
|
52
|
+
project3 = Project.new( 'bagaveev', 1128, 1600 );
|
53
|
+
project4 = Project.new( 'flaviar', 2912, 3400 );
|
54
|
+
|
55
|
+
fund_program.add_project(project1)
|
56
|
+
fund_program.add_project(project2)
|
57
|
+
fund_program.add_project(project3)
|
58
|
+
fund_program.add_project(project4)
|
59
|
+
|
60
|
+
project1.add_pledge(Pledge.new(:bronze, 50))
|
61
|
+
project2.add_pledge(Pledge.new(:bronze, 50))
|
62
|
+
project3.add_pledge(Pledge.new(:bronze, 50))
|
63
|
+
# game.total_points.should == 500
|
64
|
+
expect(fund_program.total_pledges_amount).to eq(150)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'fundraising_program/grant_project'
|
2
|
+
|
3
|
+
module FundraisingProgram
|
4
|
+
describe GrantProject do
|
5
|
+
$stdout = StringIO.new
|
6
|
+
|
7
|
+
before do
|
8
|
+
@initial_funding = 200
|
9
|
+
@project = GrantProject.new("Grant", @initial_funding, 2030)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "doesn't lose funds when there is a remove_fund" do
|
13
|
+
@project.remove_fund
|
14
|
+
expect(@project.funding).to eq(@initial_funding)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'fundraising_program/half_way_project'
|
2
|
+
|
3
|
+
module FundraisingProgram
|
4
|
+
describe HalfWayProject do
|
5
|
+
$stdout = StringIO.new
|
6
|
+
|
7
|
+
context "Reaches half of the target_funding" do
|
8
|
+
|
9
|
+
before do
|
10
|
+
@initial_funding = 400
|
11
|
+
@target_funding = 1000
|
12
|
+
@extra_funding = 500
|
13
|
+
@project = HalfWayProject.new("half way", @initial_funding, @target_funding, @extra_funding)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "recognizes when half targe funding is reached" do
|
17
|
+
funding1 = 400
|
18
|
+
funding2 = 500
|
19
|
+
expect(@project.half_way_reached?(funding1,funding2)).to eq(true)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "doens't reach half of the target_funding" do
|
23
|
+
1.upto(3) { @project.add_fund }
|
24
|
+
expect(@project.total_funds).to eq(@initial_funding + 3*25)
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
it "reaches half of the target_funding after add_fund" do
|
29
|
+
turns = 5
|
30
|
+
1.upto(turns) { @project.add_fund }
|
31
|
+
expect(@project.total_funds).to eq(@initial_funding + turns*25 + @extra_funding)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "doesn't reaches half of the target_funding" do
|
36
|
+
|
37
|
+
before do
|
38
|
+
@initial_funding = 100
|
39
|
+
@target_funding = 1000
|
40
|
+
@extra_funding = 500
|
41
|
+
@project = HalfWayProject.new("half way", @initial_funding, @target_funding, @extra_funding)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "getting insufficient funds" do
|
45
|
+
turns = 4
|
46
|
+
1.upto(turns) { @project.add_fund }
|
47
|
+
expect(@project.total_funds).to eq(@initial_funding + turns*25)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "gettting insufficient pledges" do
|
51
|
+
turns = 3
|
52
|
+
1.upto(turns) { @project.add_pledge(Pledge.new(:bronze,50)) }
|
53
|
+
expect(@project.total_funds).to eq(@initial_funding + turns*50)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'fundraising_program/pledge_pool'
|
2
|
+
# require_relative 'spec_helper'
|
3
|
+
|
4
|
+
module FundraisingProgram
|
5
|
+
describe Pledge do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@pledge = Pledge.new(:bronze, 50)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "has a name attribute" do
|
12
|
+
expect(@pledge.name).to eq(:bronze)
|
13
|
+
# @treasure.name.should == :hammer
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has an amount attribute" do
|
17
|
+
# @treasure.points.should == 50
|
18
|
+
expect(@pledge.amount).to eq(50)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe PledgePool do
|
24
|
+
|
25
|
+
it "has tree levels" do
|
26
|
+
expect(PledgePool::PLEDGES.size).to eq(3)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has a bronze level worth $50" do
|
30
|
+
expect(PledgePool::PLEDGES[0]).to eq(Pledge.new(:bronze, 50))
|
31
|
+
end
|
32
|
+
|
33
|
+
it "has a silver level worth $75" do
|
34
|
+
expect(PledgePool::PLEDGES[1]).to eq(Pledge.new(:silver, 75))
|
35
|
+
end
|
36
|
+
|
37
|
+
it "has a gold level worth $100" do
|
38
|
+
expect(PledgePool::PLEDGES[2]).to eq(Pledge.new(:gold, 100))
|
39
|
+
end
|
40
|
+
|
41
|
+
it "gets a valid pledge ramdomly" do
|
42
|
+
expect(PledgePool::PLEDGES.include?(PledgePool::random)).to eq(true)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'fundraising_program/spec_helper'
|
2
|
+
require 'fundraising_program/project'
|
3
|
+
require 'fundraising_program/pledge_pool'
|
4
|
+
|
5
|
+
module FundraisingProgram
|
6
|
+
describe Project do
|
7
|
+
|
8
|
+
$stdout = StringIO.new # evita que puts seja impresso no terminal ao rodar rspec
|
9
|
+
|
10
|
+
before do
|
11
|
+
@initial_funding = 100
|
12
|
+
@target_funding = 200
|
13
|
+
@project = Project.new('ABC', @initial_funding, @target_funding)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has an initial target funding amount" do
|
17
|
+
expect(@project.target_funding).to eq(200)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "computes the total funding outsdanding as the target funding amount minus the funding amount" do
|
21
|
+
expect(@project.funding_left).to eq(@project.target_funding - @project.funding)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "increases funds by 25 when funds are added" do
|
25
|
+
@project.add_fund
|
26
|
+
expect(@project.funding).to eq(@initial_funding + 25)
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
it "decreases funds by 15 when funds are removed" do
|
31
|
+
@project.remove_fund
|
32
|
+
expect(@project.funding).to eq(@initial_funding - 15)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "calculates left funding corectly" do
|
36
|
+
expect(@project.funding_left).to eq(@project.target_funding - @project.funding)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "is fully funded" do
|
40
|
+
expect(@project).not_to be_fully_funded
|
41
|
+
end
|
42
|
+
|
43
|
+
it "has a pledge_accumulator" do
|
44
|
+
expect(@project.pledges_accumulated.class).to eq(Hash.new.class)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "adds a new pledge" do
|
48
|
+
pledge = PledgePool.random
|
49
|
+
@project.add_pledge(pledge)
|
50
|
+
expect(@project.pledges_accumulated.keys.include?(pledge.name)).to eq(true)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "yields each pledge and its total points" do
|
54
|
+
@project.add_pledge(Pledge.new(:bronze, 50))
|
55
|
+
@project.add_pledge(Pledge.new(:bronze, 50))
|
56
|
+
@project.add_pledge(Pledge.new(:silver, 75))
|
57
|
+
@project.add_pledge(Pledge.new(:silver, 75))
|
58
|
+
@project.add_pledge(Pledge.new(:silver, 75))
|
59
|
+
@project.add_pledge(Pledge.new(:gold, 100))
|
60
|
+
@project.add_pledge(Pledge.new(:gold, 100))
|
61
|
+
yielded = []
|
62
|
+
|
63
|
+
@project.each_pledge do |pledge|
|
64
|
+
yielded << pledge
|
65
|
+
end
|
66
|
+
# yielded.should == [
|
67
|
+
# Treasure.new(:skillet, 200),
|
68
|
+
# Treasure.new(:hammer, 50),
|
69
|
+
# Treasure.new(:bottle, 25)
|
70
|
+
# ]
|
71
|
+
|
72
|
+
expect(yielded).to eq( [
|
73
|
+
Pledge.new(:bronze, 100),
|
74
|
+
Pledge.new(:silver, 225),
|
75
|
+
Pledge.new(:gold, 200)
|
76
|
+
])
|
77
|
+
end
|
78
|
+
|
79
|
+
it "creates a project from a csv line" do
|
80
|
+
line = "Project1,100,0"
|
81
|
+
expect(puts Project.from_csv(line)).to eq(puts Project.new("Project1",100,0))
|
82
|
+
end
|
83
|
+
|
84
|
+
context "which got a bronze and a silver pledge" do
|
85
|
+
|
86
|
+
before do
|
87
|
+
@initial_funding = 100
|
88
|
+
@target_funding = 200
|
89
|
+
@project = Project.new('ABC', @initial_funding, @target_funding)
|
90
|
+
@project.add_pledge(PledgePool::PLEDGES[0])
|
91
|
+
@project.add_pledge(PledgePool::PLEDGES[1])
|
92
|
+
end
|
93
|
+
|
94
|
+
it "has $125 in pladges" do
|
95
|
+
expect(@project.pledges_amount).to eq(PledgePool::PLEDGES[0].amount + PledgePool::PLEDGES[1].amount)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "with initial fund of 100, got a bronze pledge and received $100 in funds" do
|
100
|
+
|
101
|
+
before do
|
102
|
+
@initial_funding = 100
|
103
|
+
@target_funding = 200
|
104
|
+
@project = Project.new('ABC', @initial_funding, @target_funding)
|
105
|
+
@project.add_pledge(PledgePool::PLEDGES[0]) # adds a bronze pledge ($50)
|
106
|
+
@project.add_fund
|
107
|
+
end
|
108
|
+
|
109
|
+
it "has $175 as total funds" do
|
110
|
+
expect(@project.total_funds).to eq(175)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
context "created with default value for amount funding amount and target funding amount" do
|
117
|
+
|
118
|
+
before do
|
119
|
+
@project = Project.new('ABC')
|
120
|
+
end
|
121
|
+
|
122
|
+
it "has a default value of 0 for funding amount" do
|
123
|
+
expect(@project.funding).to eq(0)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "has a default value of 1000 for target funding amount" do
|
127
|
+
expect(@project.target_funding).to eq(1000)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
context "fully funded project" do
|
133
|
+
|
134
|
+
before do
|
135
|
+
@initial_funding = 100
|
136
|
+
@target_funding = 200
|
137
|
+
@project = Project.new('ABC', @initial_funding, @target_funding)
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
it "is fully funded" do
|
142
|
+
expect(@project).not_to be_fully_funded
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context "in a collection of projects" do
|
147
|
+
before do
|
148
|
+
project1 = Project.new( 'parkav', 1000, 100 );
|
149
|
+
project2 = Project.new( 'plate iq', 1500, 100 );
|
150
|
+
project3 = Project.new( 'bagaveev', 2000, 100 );
|
151
|
+
project4 = Project.new( 'flaviar', 3000, 100 );
|
152
|
+
@projects = [@project1, @project2, @project3, @project4]
|
153
|
+
end
|
154
|
+
it "is sorted by decreasing funding_left" do
|
155
|
+
@projects.sort.should == [@project4, @project3, @project2, @project3]
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mfp_fundraising_program
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Marcos Parreiras
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.0.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.0.0
|
27
|
+
description: This is the project developed following the Pragmatic Studio for Ruby
|
28
|
+
and following the bonus rounds from across exercises.
|
29
|
+
email: marcosfparreiras@gmail.com
|
30
|
+
executables:
|
31
|
+
- fundraising_program
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- LICENSE
|
36
|
+
- README
|
37
|
+
- bin/fundraising_program
|
38
|
+
- bin/projects.csv
|
39
|
+
- bin/under_fundeds_projects.txt
|
40
|
+
- lib/fundraising_program/die.rb
|
41
|
+
- lib/fundraising_program/fundable.rb
|
42
|
+
- lib/fundraising_program/funding_round.rb
|
43
|
+
- lib/fundraising_program/fundrequest.rb
|
44
|
+
- lib/fundraising_program/grant_project.rb
|
45
|
+
- lib/fundraising_program/half_way_project.rb
|
46
|
+
- lib/fundraising_program/pledge_pool.rb
|
47
|
+
- lib/fundraising_program/project.rb
|
48
|
+
- spec/fundraising_program/fundrequest_spec.rb
|
49
|
+
- spec/fundraising_program/grant_project_spec.rb
|
50
|
+
- spec/fundraising_program/half_way_project_spec.rb
|
51
|
+
- spec/fundraising_program/pledge_pool_spec.rb
|
52
|
+
- spec/fundraising_program/project_spec.rb
|
53
|
+
- spec/fundraising_program/spec_helper.rb
|
54
|
+
homepage: ''
|
55
|
+
licenses:
|
56
|
+
- MIT
|
57
|
+
metadata: {}
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.9'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 2.4.5
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: fundraising application as a learning ruby program
|
78
|
+
test_files:
|
79
|
+
- spec/fundraising_program/fundrequest_spec.rb
|
80
|
+
- spec/fundraising_program/pledge_pool_spec.rb
|
81
|
+
- spec/fundraising_program/grant_project_spec.rb
|
82
|
+
- spec/fundraising_program/half_way_project_spec.rb
|
83
|
+
- spec/fundraising_program/spec_helper.rb
|
84
|
+
- spec/fundraising_program/project_spec.rb
|