my-crowdfund 1.0.1
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/LICENCE +0 -0
- data/README +0 -0
- data/bin/Croudfund stats.txt +5 -0
- data/bin/crowdfund +45 -0
- data/bin/crowdfund.rb +43 -0
- data/bin/projects.csv +3 -0
- data/bin/schoolfund.rb +8 -0
- data/lib/crowdfund/die.rb +14 -0
- data/lib/crowdfund/fundable.rb +28 -0
- data/lib/crowdfund/funding_round.rb +25 -0
- data/lib/crowdfund/fundrequest.rb +96 -0
- data/lib/crowdfund/funds.rb +67 -0
- data/lib/crowdfund/grant_project.rb +30 -0
- data/lib/crowdfund/pledge.rb +15 -0
- data/lib/crowdfund/project.rb +69 -0
- data/lib/crowdfund/projects.rb +41 -0
- data/lib/crowdfund/school_project.rb +18 -0
- data/lib/crowdfund/startups.rb +65 -0
- data/spec/crowdfund/fundrequest_spec.rb +51 -0
- data/spec/crowdfund/pledge_spec.rb +37 -0
- data/spec/crowdfund/project_spec.rb +95 -0
- metadata +82 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a50a83a58519a738dd1861b3dba3df55f21d650a
|
4
|
+
data.tar.gz: da08ca649f69d82eb1059f3d84c2d67489a4a876
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: aad08076e73bad494c811fdaaf78bf3f15adc93000c14541669d1ec1b3960b4a5de673212d094593467e8df072ef6e9ed75ee3b48c67086cc363995dea6a238c
|
7
|
+
data.tar.gz: f68de3e2d502a114803e537a4344b834cf4ee82cca5438e34b2fddf0ad86d02ba083920e31655f8228e3379e42b7076b067ab93daf06214d9ff927c7f16b9483
|
data/LICENCE
ADDED
File without changes
|
data/README
ADDED
File without changes
|
data/bin/crowdfund
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/crowdfund/project'
|
4
|
+
require_relative '../lib/crowdfund/fundrequest'
|
5
|
+
require_relative '../lib/crowdfund/grant_project'
|
6
|
+
|
7
|
+
# project1 = Project.new('LMN', 500, 3000)
|
8
|
+
# project2 = Project.new('XYZ', 25, 75)
|
9
|
+
# project3 = Project.new('FGH', 300, 700)
|
10
|
+
# project4 = Project.new('MNO', 200, 1100)
|
11
|
+
|
12
|
+
holding = CrowdFund::FundRequest.new('VC-Friendly Start-up Projects')
|
13
|
+
|
14
|
+
# holding.add_project(project1)
|
15
|
+
# holding.add_project(project2)
|
16
|
+
# holding.add_project(project3)
|
17
|
+
# holding.add_project(project4)
|
18
|
+
# holding.request_funding(100) do
|
19
|
+
# holding.total_rewards >= 10000 # the only returned value => will be yielded to the method request funding
|
20
|
+
# end
|
21
|
+
# holding.print_stats
|
22
|
+
|
23
|
+
# holding.load_project(ARGV.shift || 'projects.csv')
|
24
|
+
|
25
|
+
default_player_file = File.join(File.dirname(__FILE__), 'projects.csv')
|
26
|
+
holding.load_project(ARGV.shift || default_player_file)
|
27
|
+
|
28
|
+
grant_pr = CrowdFund::GrantProject.new('grt', 700, 4000, 0.6)
|
29
|
+
holding.add_project(grant_pr)
|
30
|
+
|
31
|
+
loop do
|
32
|
+
puts "\nHow many croudfund weeks? (type 'quit' to exit)"
|
33
|
+
answer = gets.chomp.downcase
|
34
|
+
case answer
|
35
|
+
when /^\d+$/
|
36
|
+
holding.request_funding(Integer(answer))
|
37
|
+
when 'quit', 'exit'
|
38
|
+
holding.print_stats
|
39
|
+
break
|
40
|
+
else
|
41
|
+
puts "Please enter a valid number or 'quit'"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
holding.save_fund_stats('Croudfund stats.txt')
|
data/bin/crowdfund.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative '../lib/crowdfund/project'
|
2
|
+
require_relative '../lib/crowdfund/fundrequest'
|
3
|
+
require_relative '../lib/crowdfund/grant_project'
|
4
|
+
|
5
|
+
# project1 = Project.new('LMN', 500, 3000)
|
6
|
+
# project2 = Project.new('XYZ', 25, 75)
|
7
|
+
# project3 = Project.new('FGH', 300, 700)
|
8
|
+
# project4 = Project.new('MNO', 200, 1100)
|
9
|
+
|
10
|
+
holding = CrowdFund::FundRequest.new('VC-Friendly Start-up Projects')
|
11
|
+
|
12
|
+
# holding.add_project(project1)
|
13
|
+
# holding.add_project(project2)
|
14
|
+
# holding.add_project(project3)
|
15
|
+
# holding.add_project(project4)
|
16
|
+
# holding.request_funding(100) do
|
17
|
+
# holding.total_rewards >= 10000 # the only returned value => will be yielded to the method request funding
|
18
|
+
# end
|
19
|
+
# holding.print_stats
|
20
|
+
|
21
|
+
# holding.load_project(ARGV.shift || 'projects.csv')
|
22
|
+
|
23
|
+
default_player_file = File.join(File.dirname(__FILE__), 'projects.csv')
|
24
|
+
holding.load_project(ARGV.shift || default_player_file)
|
25
|
+
|
26
|
+
grant_pr = CrowdFund::GrantProject.new('grt', 700, 4000, 0.6)
|
27
|
+
holding.add_project(grant_pr)
|
28
|
+
|
29
|
+
loop do
|
30
|
+
puts "\nHow many croudfund weeks? (type 'quit' to exit)"
|
31
|
+
answer = gets.chomp.downcase
|
32
|
+
case answer
|
33
|
+
when /^\d+$/
|
34
|
+
holding.request_funding(Integer(answer))
|
35
|
+
when 'quit', 'exit'
|
36
|
+
holding.print_stats
|
37
|
+
break
|
38
|
+
else
|
39
|
+
puts "Please enter a valid number or 'quit'"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
holding.save_fund_stats('Croudfund stats.txt')
|
data/bin/projects.csv
ADDED
data/bin/schoolfund.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module CrowdFund
|
2
|
+
|
3
|
+
module Fundable
|
4
|
+
|
5
|
+
def gained
|
6
|
+
self.fund += 25
|
7
|
+
puts "Project #{name} got more funds!"
|
8
|
+
end
|
9
|
+
|
10
|
+
def lost
|
11
|
+
self.fund -= 15
|
12
|
+
puts "Project #{name} lost some funds!"
|
13
|
+
end
|
14
|
+
|
15
|
+
def need
|
16
|
+
goal - fund
|
17
|
+
end
|
18
|
+
|
19
|
+
def funded?
|
20
|
+
fund >= goal
|
21
|
+
end
|
22
|
+
|
23
|
+
def <=>(other)
|
24
|
+
other.need <=> need
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'crowdfund/pledge'
|
2
|
+
require 'crowdfund/die'
|
3
|
+
require 'crowdfund/project'
|
4
|
+
|
5
|
+
module CrowdFund
|
6
|
+
|
7
|
+
module FundingRound
|
8
|
+
|
9
|
+
def self.take_fund(project)
|
10
|
+
die = Die.new
|
11
|
+
number_rolled = die.roll
|
12
|
+
|
13
|
+
if number_rolled.even?
|
14
|
+
project.gained
|
15
|
+
else
|
16
|
+
project.lost
|
17
|
+
end
|
18
|
+
|
19
|
+
pledge_recieved = PledgePool.random
|
20
|
+
project.earn_pledge(pledge_recieved)
|
21
|
+
#puts "Project #{project.name} recieve a #{pledge_recieved.name} pledge worth $#{pledge_recieved.amount}"
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'crowdfund/project'
|
2
|
+
require 'crowdfund/die'
|
3
|
+
require 'crowdfund/funding_round'
|
4
|
+
require 'crowdfund/pledge'
|
5
|
+
require 'csv'
|
6
|
+
|
7
|
+
module CrowdFund
|
8
|
+
|
9
|
+
class FundRequest
|
10
|
+
def initialize(name)
|
11
|
+
@name = name.upcase
|
12
|
+
@projects = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_project(project)
|
16
|
+
@projects << project
|
17
|
+
end
|
18
|
+
|
19
|
+
def load_project(from_file)
|
20
|
+
CSV.foreach(from_file) do |line|
|
21
|
+
project = Project.new(line[0], Integer(line[1]), Integer(line[2]))
|
22
|
+
add_project(project)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def save_fund_stats(to_file='fund_stats.txt')
|
27
|
+
File.open(to_file, 'w') do |file|
|
28
|
+
file.puts "#{@name} Croudfund Stats :"
|
29
|
+
@projects.sort.each do |project|
|
30
|
+
file.puts project_and_fund(project)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def total_rewards
|
36
|
+
@projects.reduce(0) { |sum, project| sum + project.rewards }
|
37
|
+
end
|
38
|
+
|
39
|
+
def request_funding(weeks)
|
40
|
+
puts "The current projects are :"
|
41
|
+
@projects.each do |project|
|
42
|
+
puts project
|
43
|
+
end
|
44
|
+
pledges = PledgePool::PLEDGES
|
45
|
+
puts "\nThere are #{pledges.size} possible pledge amounts:"
|
46
|
+
pledges.each { |pledge| puts "A #{pledge.name} pledge is worth $#{pledge.amount}"}
|
47
|
+
1.upto(weeks) do |week|
|
48
|
+
|
49
|
+
if block_given?
|
50
|
+
break if yield
|
51
|
+
end
|
52
|
+
|
53
|
+
puts "\nFund raising week #{week}:"
|
54
|
+
@projects.each do |project|
|
55
|
+
FundingRound.take_fund(project)
|
56
|
+
puts project
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def print_stats
|
62
|
+
fully_funded_projects, under_funded_projects = @projects.partition { |project| project.funded? }
|
63
|
+
puts "\nFully funded projects (funds):"
|
64
|
+
fully_funded_projects.each { |project| puts project_and_fund(project) }
|
65
|
+
puts "\nUnder funded projects (funds):"
|
66
|
+
under_funded_projects.each { |project| puts project_and_fund(project) }
|
67
|
+
puts "\nStill needing funds projects (needs):"
|
68
|
+
under_funded_projects.sort.each { |project| puts "#{project.name.ljust(30, '_')}#{project.need}" }
|
69
|
+
|
70
|
+
puts "\nThe projects have collected a total amouts of $#{total_rewards} from pledges:"
|
71
|
+
|
72
|
+
@projects.each do |project|
|
73
|
+
puts "\n#{project.name}'s total rewards:"
|
74
|
+
project.each_earned_pledge do |pledge|
|
75
|
+
puts "$#{pledge.amount} total #{pledge.name} amount"
|
76
|
+
end
|
77
|
+
puts "$#{project.rewards} grand total pledges"
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
def project_and_fund(project)
|
83
|
+
"#{project.name.ljust(30, '_')}#{project.fund}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
if __FILE__ == $PROGRAM_NAME
|
88
|
+
project1 = Project.new('myproject1', 500, 3000)
|
89
|
+
project2 = Project.new('myproject1', 250, 750)
|
90
|
+
|
91
|
+
myrequest = FundRequest.new('my fund equest')
|
92
|
+
myrequest.add_project(project1)
|
93
|
+
myrequest.add_project(project2)
|
94
|
+
myrequest.request_funding
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module CrowdFund
|
2
|
+
class Project
|
3
|
+
attr_accessor :name
|
4
|
+
attr_reader :fund, :goal
|
5
|
+
|
6
|
+
def initialize(name, fund, goal)
|
7
|
+
@name = name
|
8
|
+
@fund = fund
|
9
|
+
@goal = goal
|
10
|
+
end
|
11
|
+
|
12
|
+
def gained
|
13
|
+
@fund += 25
|
14
|
+
puts "Project #{@name} got more funds!"
|
15
|
+
end
|
16
|
+
|
17
|
+
def lost
|
18
|
+
@fund -= 15
|
19
|
+
puts "Project #{@name} lost some funds!"
|
20
|
+
end
|
21
|
+
|
22
|
+
def need
|
23
|
+
@goal - @fund
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
"Project #{@name} has $#{@fund} in fundinfg towards a goal of $#{@goal} => still need $#{need}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
project1 = Project.new('LMN', 500, 3000)
|
33
|
+
project2 = Project.new('XYZ', 25, 75)
|
34
|
+
# project1.lost
|
35
|
+
# project2.gained
|
36
|
+
# puts project1
|
37
|
+
# puts project2
|
38
|
+
|
39
|
+
# project1.name = 'the new LMN'
|
40
|
+
# puts project1.name
|
41
|
+
# puts project1.fund
|
42
|
+
# puts project1.goal
|
43
|
+
# puts project1.need
|
44
|
+
|
45
|
+
# Arrays
|
46
|
+
project3 = Project.new('FGH', 300, 700)
|
47
|
+
project4 = Project.new('MNO', 200, 1100)
|
48
|
+
|
49
|
+
projects = [project1, project2, project3]
|
50
|
+
|
51
|
+
projects.each do |project|
|
52
|
+
puts "#{project.name.ljust(20,'.')}>#{project.goal}"
|
53
|
+
end
|
54
|
+
|
55
|
+
projects.pop
|
56
|
+
projects.push(project4)
|
57
|
+
|
58
|
+
projects.each do |project|
|
59
|
+
puts project
|
60
|
+
end
|
61
|
+
|
62
|
+
projects.each do |project|
|
63
|
+
project.lost
|
64
|
+
project.lost
|
65
|
+
project.gained
|
66
|
+
puts project
|
67
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'crowdfund/project'
|
2
|
+
|
3
|
+
module CrowdFund
|
4
|
+
class GrantProject < Project
|
5
|
+
|
6
|
+
def initialize(name, fund, goal, charity_ratio=0.5)
|
7
|
+
super(name, fund, goal)
|
8
|
+
@charity_ratio = charity_ratio
|
9
|
+
end
|
10
|
+
|
11
|
+
def secured?
|
12
|
+
# project is secured when it has accumulated more thant half of its goal
|
13
|
+
@fund > (goal / 2)
|
14
|
+
end
|
15
|
+
|
16
|
+
def lost
|
17
|
+
puts "#{@name} is a Grant Poject : funds cannot be removed!"
|
18
|
+
end
|
19
|
+
|
20
|
+
def earn_pledge(pledge)
|
21
|
+
if secured?
|
22
|
+
puts "#{@name} is secured and gives #{@charity_ratio} of #{pledge.name} to charity."
|
23
|
+
shared_amount = pledge.amount * @charity_ratio
|
24
|
+
pledge = Pledge.new(pledge.name, shared_amount)
|
25
|
+
end
|
26
|
+
super(pledge)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'crowdfund/pledge'
|
2
|
+
require 'crowdfund/fundable'
|
3
|
+
|
4
|
+
module CrowdFund
|
5
|
+
|
6
|
+
class Project
|
7
|
+
include Fundable
|
8
|
+
|
9
|
+
attr_accessor :name, :fund
|
10
|
+
attr_reader :goal
|
11
|
+
|
12
|
+
def initialize(name, fund, goal)
|
13
|
+
@name = name.upcase
|
14
|
+
@fund = fund
|
15
|
+
@goal = goal
|
16
|
+
@earned_pledges = Hash.new(0)
|
17
|
+
end
|
18
|
+
|
19
|
+
def earn_pledge(pledge)
|
20
|
+
@earned_pledges[pledge.name] += pledge.amount
|
21
|
+
@fund += pledge.amount
|
22
|
+
puts "#{@name} earned a #{pledge.name} pledge worth $#{pledge.amount}"
|
23
|
+
puts "#{@name}'s pledges: #{@earned_pledges}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def each_earned_pledge
|
27
|
+
@earned_pledges.each do |name, amount|
|
28
|
+
yield Pledge.new(name, amount)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def rewards
|
33
|
+
@earned_pledges.values.reduce(0, :+)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Moved to fundable
|
37
|
+
# def gained
|
38
|
+
# @fund += 25
|
39
|
+
# puts "Project #{@name} got more funds!"
|
40
|
+
# end
|
41
|
+
# def lost
|
42
|
+
# @fund -= 15
|
43
|
+
# puts "Project #{@name} lost some funds!"
|
44
|
+
# end
|
45
|
+
# def need
|
46
|
+
# @goal - @fund
|
47
|
+
# end
|
48
|
+
# def funded?
|
49
|
+
# @fund >= @goal
|
50
|
+
# end
|
51
|
+
# def <=>(other_project)
|
52
|
+
# other_project.need <=> need
|
53
|
+
# end
|
54
|
+
|
55
|
+
def to_s
|
56
|
+
"Project #{@name} has $#{@fund} in fundinfg towards a goal of $#{@goal} => still need $#{need}"
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
if __FILE__ == $PROGRAM_NAME
|
64
|
+
project1 = Project.new('project1', 100, 500)
|
65
|
+
puts project1
|
66
|
+
project1.gained
|
67
|
+
project1.lost
|
68
|
+
puts project1
|
69
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Project funding program
|
2
|
+
|
3
|
+
# fund = 1000
|
4
|
+
# project = "ABC"
|
5
|
+
|
6
|
+
# puts "Project #{project} has $#{fund} in funding."
|
7
|
+
|
8
|
+
# project1 = 'ABC'
|
9
|
+
# project2 = 'DEF'
|
10
|
+
# project3 = 'GHI'
|
11
|
+
# puts "Projects : \n\t#{project1}\n\t#{project2}\n\t#{project3}"
|
12
|
+
|
13
|
+
# fund1 = 2000
|
14
|
+
# fund2 = 1500
|
15
|
+
# fund3 = 3500
|
16
|
+
|
17
|
+
# puts "#{project1.upcase} has a fund of #{fund1}.".center(50,'-')
|
18
|
+
|
19
|
+
# puts "#{project2.capitalize.ljust(20,'_')} #{fund2} fund"
|
20
|
+
|
21
|
+
# puts "#{project3.center(8,'$')} has a fund of #{fund3}."
|
22
|
+
|
23
|
+
def now
|
24
|
+
Time.new.strftime('%A %y-%m-%d at %H.%M.%S')
|
25
|
+
end
|
26
|
+
|
27
|
+
def presentation(project,fund = 1500)
|
28
|
+
"#{now} : #{project.capitalize.ljust(20,'.')} #{fund} fund."
|
29
|
+
end
|
30
|
+
|
31
|
+
project1 = 'kids charity'
|
32
|
+
project2 = 'moon visit'
|
33
|
+
project3 = 'clean planet'
|
34
|
+
|
35
|
+
fund1 = 2000
|
36
|
+
fund2 = 1500
|
37
|
+
fund3 = 3500
|
38
|
+
|
39
|
+
puts presentation(project1, fund1)
|
40
|
+
puts presentation(project2)
|
41
|
+
puts presentation(project3, fund3)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'crowdfund/fundable'
|
2
|
+
|
3
|
+
module CrowdFund
|
4
|
+
class SchoolProject
|
5
|
+
|
6
|
+
include Fundable
|
7
|
+
|
8
|
+
attr_accessor :name, :fund
|
9
|
+
attr_reader :goal
|
10
|
+
|
11
|
+
def initialize(name, fund=0, goal=100)
|
12
|
+
@name = name
|
13
|
+
@fund = fund
|
14
|
+
@goal = goal
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module CrowdFund
|
2
|
+
class Project
|
3
|
+
attr_accessor :name
|
4
|
+
attr_reader :fund, :goal
|
5
|
+
|
6
|
+
def initialize(name, fund, goal)
|
7
|
+
@name = name
|
8
|
+
@fund = fund
|
9
|
+
@goal = goal
|
10
|
+
end
|
11
|
+
|
12
|
+
def gained
|
13
|
+
@fund += 25
|
14
|
+
puts "Project #{@name} got more funds!"
|
15
|
+
end
|
16
|
+
|
17
|
+
def lost
|
18
|
+
@fund -= 15
|
19
|
+
puts "Project #{@name} lost some funds!"
|
20
|
+
end
|
21
|
+
|
22
|
+
def need
|
23
|
+
@goal - @fund
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
"Project #{@name} has $#{@fund} in fundinfg towards a goal of $#{@goal} => still need $#{need}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class Community
|
32
|
+
def initialize(name)
|
33
|
+
@name = name.upcase
|
34
|
+
@projects = []
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_project(project)
|
38
|
+
@projects << project
|
39
|
+
end
|
40
|
+
|
41
|
+
def request_funding
|
42
|
+
puts "The current projects are :"
|
43
|
+
@projects.each do |project|
|
44
|
+
puts project
|
45
|
+
end
|
46
|
+
@projects.each do |project|
|
47
|
+
project.lost
|
48
|
+
project.gained
|
49
|
+
puts project
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
project1 = Project.new('LMN', 500, 3000)
|
56
|
+
project2 = Project.new('XYZ', 25, 75)
|
57
|
+
project3 = Project.new('FGH', 300, 700)
|
58
|
+
project4 = Project.new('MNO', 200, 1100)
|
59
|
+
|
60
|
+
holding = Community.new('VC-Friendly Start-up Projects')
|
61
|
+
holding.add_project(project1)
|
62
|
+
holding.add_project(project2)
|
63
|
+
holding.add_project(project3)
|
64
|
+
holding.add_project(project4)
|
65
|
+
holding.request_funding
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'crowdfund/fundrequest'
|
2
|
+
require 'crowdfund/pledge'
|
3
|
+
|
4
|
+
module CrowdFund
|
5
|
+
|
6
|
+
describe FundRequest do
|
7
|
+
|
8
|
+
before do
|
9
|
+
@fundrequest = FundRequest.new('contest')
|
10
|
+
@fund = 50
|
11
|
+
@goal = 100
|
12
|
+
@project = Project.new('abc', @fund, @goal)
|
13
|
+
@fundrequest.add_project(@project)
|
14
|
+
$stdout = StringIO.new
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'raises funds if an even number is rolled' do
|
18
|
+
Die.any_instance.stub(:roll).and_return(2)
|
19
|
+
@fundrequest.request_funding(3)
|
20
|
+
@project.fund.should == @fund + @project.rewards + ( 25 * 3 )
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'loses funds if an odd number is rolled' do
|
24
|
+
Die.any_instance.stub(:roll).and_return(1)
|
25
|
+
@fundrequest.request_funding(3)
|
26
|
+
@project.fund.should == @fund + @project.rewards - (15 * 3)
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'calculate total rewards' do
|
30
|
+
|
31
|
+
before do
|
32
|
+
@contest = FundRequest.new('competition')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'initial total rewards is zero' do
|
36
|
+
@contest.total_rewards.should == 0
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'calculates to total amount of pledges' do
|
40
|
+
@project1 = Project.new('abc', 100, 1000)
|
41
|
+
@project2 = Project.new('def', 200, 1500)
|
42
|
+
@project1.earn_pledge(Pledge.new(:gold, 100))
|
43
|
+
@project1.earn_pledge(Pledge.new(:bronze, 25))
|
44
|
+
@contest.add_project(@project1)
|
45
|
+
@contest.add_project(@project2)
|
46
|
+
|
47
|
+
@contest.total_rewards.should == 125
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'crowdfund/pledge'
|
2
|
+
|
3
|
+
module CrowdFund
|
4
|
+
describe Pledge do
|
5
|
+
before do
|
6
|
+
@pledge = Pledge.new(:metal, 40)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'has a name attribute' do
|
10
|
+
@pledge.name.should == :metal
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'has an amount attribute' do
|
14
|
+
@pledge.amount.should == 40
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe PledgePool do
|
19
|
+
|
20
|
+
it 'has 3 pledges' do
|
21
|
+
PledgePool::PLEDGES.size.should == 3
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'has a bronze pledge' do
|
25
|
+
PledgePool::PLEDGES[0].should == Pledge.new(:bronze, 50)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'has a silver pledge' do
|
29
|
+
PledgePool::PLEDGES[1].should == Pledge.new(:silver, 75)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'has a gold pledge' do
|
33
|
+
PledgePool::PLEDGES[2].should == Pledge.new(:gold, 100)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'crowdfund/project'
|
2
|
+
|
3
|
+
module CrowdFund
|
4
|
+
|
5
|
+
describe Project do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@initial_fund = 100
|
9
|
+
@goal = 500
|
10
|
+
@project = Project.new("abc", @initial_fund, @goal)
|
11
|
+
$stdout = StringIO.new #changed gloabal variable stdout to a new one in this script, to avoit puts commands
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'has an upcase name' do
|
15
|
+
@project.name.should == 'ABC'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'has an initial fund' do
|
19
|
+
@project.fund.should == 100
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'has a string representation' do
|
23
|
+
@project.to_s.should == 'Project ABC has $100 in fundinfg towards a goal of $500 => still need $400'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'computes a score as the sum of its health and length of name' do
|
27
|
+
@project.need.should == (500 - 100)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'increases fund by 25 when gained' do
|
31
|
+
@project.gained
|
32
|
+
@project.fund.should == @initial_fund + 25
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'decreases fund by 15 when lost' do
|
36
|
+
@project.lost
|
37
|
+
@project.fund.should == @initial_fund - 15
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'has enough funds' do
|
41
|
+
before do
|
42
|
+
@project = Project.new('abc', 100, 100)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'is funded' do
|
46
|
+
@project.should be_funded
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'has not enough funds' do
|
51
|
+
before do
|
52
|
+
@project = Project.new('abc', 50, 100)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'is not funded' do
|
56
|
+
@project.should_not be_funded
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it "calculate the amount of pledges" do
|
61
|
+
@project.rewards.should == 0
|
62
|
+
@project.earn_pledge(Pledge.new(:bronze, 50))
|
63
|
+
@project.rewards.should == 50
|
64
|
+
@project.earn_pledge(Pledge.new(:silver, 75))
|
65
|
+
@project.rewards.should == 125
|
66
|
+
@project.earn_pledge(Pledge.new(:gold, 100))
|
67
|
+
@project.rewards.should == 225
|
68
|
+
end
|
69
|
+
|
70
|
+
it "yields each earned pledge and its total amount" do
|
71
|
+
@project.earn_pledge(Pledge.new(:bronze, 50))
|
72
|
+
@project.earn_pledge(Pledge.new(:bronze, 50))
|
73
|
+
@project.earn_pledge(Pledge.new(:bronze, 50))
|
74
|
+
@project.earn_pledge(Pledge.new(:silver, 75))
|
75
|
+
@project.earn_pledge(Pledge.new(:gold, 100))
|
76
|
+
@project.earn_pledge(Pledge.new(:gold, 100))
|
77
|
+
@project.earn_pledge(Pledge.new(:gold, 100))
|
78
|
+
@project.earn_pledge(Pledge.new(:gold, 100))
|
79
|
+
|
80
|
+
|
81
|
+
yielded = []
|
82
|
+
@project.each_earned_pledge do |pledge|
|
83
|
+
yielded << pledge
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
yielded.should == [
|
88
|
+
Pledge.new(:bronze, 150),
|
89
|
+
Pledge.new(:silver, 75),
|
90
|
+
Pledge.new(:gold, 400)
|
91
|
+
]
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: my-crowdfund
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Aymen Chetoui
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-15 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: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: ''
|
28
|
+
email: aymen.chetoui@gmail.com
|
29
|
+
executables:
|
30
|
+
- crowdfund
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- bin/Croudfund stats.txt
|
35
|
+
- bin/crowdfund
|
36
|
+
- bin/crowdfund.rb
|
37
|
+
- bin/projects.csv
|
38
|
+
- bin/schoolfund.rb
|
39
|
+
- lib/crowdfund/die.rb
|
40
|
+
- lib/crowdfund/fundable.rb
|
41
|
+
- lib/crowdfund/funding_round.rb
|
42
|
+
- lib/crowdfund/fundrequest.rb
|
43
|
+
- lib/crowdfund/funds.rb
|
44
|
+
- lib/crowdfund/grant_project.rb
|
45
|
+
- lib/crowdfund/pledge.rb
|
46
|
+
- lib/crowdfund/project.rb
|
47
|
+
- lib/crowdfund/projects.rb
|
48
|
+
- lib/crowdfund/school_project.rb
|
49
|
+
- lib/crowdfund/startups.rb
|
50
|
+
- spec/crowdfund/fundrequest_spec.rb
|
51
|
+
- spec/crowdfund/pledge_spec.rb
|
52
|
+
- spec/crowdfund/project_spec.rb
|
53
|
+
- LICENCE
|
54
|
+
- README
|
55
|
+
homepage: ''
|
56
|
+
licenses:
|
57
|
+
- MIT
|
58
|
+
metadata: {}
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '1.9'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 2.0.14
|
76
|
+
signing_key:
|
77
|
+
specification_version: 4
|
78
|
+
summary: Fund projects contest
|
79
|
+
test_files:
|
80
|
+
- spec/crowdfund/fundrequest_spec.rb
|
81
|
+
- spec/crowdfund/pledge_spec.rb
|
82
|
+
- spec/crowdfund/project_spec.rb
|