owemegod 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rbx/*
6
+ coverage
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use --create 1.9.3@owemegod
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in owemegod.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem 'growl'
8
+ gem 'guard'
9
+ gem 'guard-minitest', :git => 'git://github.com/aspiers/guard-minitest.git'
10
+ gem 'guard-spinach'
11
+ gem 'simplecov'
12
+ end
data/Guardfile ADDED
@@ -0,0 +1,12 @@
1
+ guard 'minitest' do
2
+ watch(%r|^spec/(.*)_spec\.rb|)
3
+ watch(%r|^lib/(.*)\.rb|) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch(%r|^spec/spec_helper\.rb|) { "spec" }
5
+ end
6
+
7
+ guard 'spinach' do
8
+ watch(%r|^features/(.*)\.feature|)
9
+ watch(%r|^features/steps/(.*)([^/]+)\.rb|) do |m|
10
+ "features/#{m[1]}#{m[2]}.feature"
11
+ end
12
+ end
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.pattern = "spec/**/*_spec.rb"
7
+ end
8
+
9
+ desc "Runs spinach"
10
+ task :spinach do
11
+ exec 'spinach'
12
+ end
13
+
14
+ task :default => [:test, :spinach]
data/Readme.md ADDED
@@ -0,0 +1,53 @@
1
+ # Owemegod
2
+
3
+ Owemegod is a tool made for distributing costs of events or parties among a bunch of people.
4
+
5
+ ## Usage
6
+
7
+ ### Set up a bunch of people
8
+
9
+ ```ruby
10
+ me = Owemegod::Person.new(name: "Josep Jaume")
11
+ petula = Owemegod::Person.new(name: "Petula Clark")
12
+ chaplin = Owemegod::Person.new(name: "Charles Chaplin")
13
+ napoleon = Owemegod::Person.new(name: "Napoleon Dynamite")
14
+ ```
15
+
16
+ ### Assign them a bunch of expenses
17
+
18
+ ```ruby
19
+ me.add_expense("Food", 50)
20
+ me.add_expense("Bitches", 100)
21
+ petula.add_expense("Drinks", 40)
22
+ ```
23
+
24
+ ### Create a group
25
+
26
+ ```ruby
27
+ group = Owemegod::Group.new [me, petula, chaplin]
28
+ ```
29
+
30
+ ### Distribute the costs
31
+
32
+ ```ruby
33
+ distribution = group.distribute
34
+ ```
35
+
36
+ ### Inspect the results
37
+
38
+ ```ruby
39
+ puts distribution.debts.inspect
40
+ => [[#<Owemegod::Person name="Petula Clark">, #<Owemegod::Person name="Josep Jaume">, 7.5], [#<Owemegod::Person name="Napoleon Dynamite">, #<Owemegod::Person name="Josep Jaume">, 47.5], [#<Owemegod::Person name="Charles Chaplin">, #<Owemegod::Person name="Josep Jaume">, 47.5]]
41
+ ```
42
+
43
+ ## Todo
44
+
45
+ * Create a prettier API
46
+ * Create prettier output
47
+ * Simplify internals (refactoring)
48
+ * Add documentation
49
+ * Create a web interface
50
+
51
+ ## License
52
+
53
+ MIT License. Copyright 2011 Josep Jaume
@@ -0,0 +1,27 @@
1
+ Feature: Debt distribution
2
+ In order to distribute the cost of an event among friends
3
+ As the organizer
4
+ I want Owemegod to suggest a debt distribution
5
+
6
+ Scenario: I organize a party and pay for all
7
+ Given I'm organizing a party
8
+ And I invited 5 of my friends
9
+ And I paid for all for an amount of 120eur
10
+ When I use Owemegod to distribute the costs
11
+ Then everyone should pay me 20eur
12
+ And I should not pay a thing
13
+
14
+ Scenario: Someone organizes a party and each one pays the same amount
15
+ Given I'm organizing a party
16
+ And I invited 5 of my friends
17
+ And each one of us paid 15eur
18
+ When I use Owemegod to distribute the costs
19
+ Then no one should pay a thing
20
+
21
+ Scenario: Someone organizes a party and someone didn't pay for anything
22
+ Given I'm organizing a party
23
+ And I invited 5 of my friends
24
+ And each one of us paid 15eur except me
25
+ When I use Owemegod to distribute the costs
26
+ Then I should pay 2.5eur to everyone
27
+ And no one else should pay anything
@@ -0,0 +1,75 @@
1
+ class DebtDistribution < Spinach::FeatureSteps
2
+ feature 'Debt distribution'
3
+ Given 'I\'m organizing a party' do
4
+ @me = Owemegod::Person.new(name: 'John Doe')
5
+ @group = Owemegod::Group.new
6
+ @group.add_person @me
7
+ end
8
+
9
+ And 'I invited 5 of my friends' do
10
+ @friends = []
11
+ 5.times do |i|
12
+ friend = Owemegod::Person.new(name: "Friend #{i}")
13
+ @group.add_person friend
14
+ @friends << friend
15
+ end
16
+ end
17
+
18
+ And 'I paid for all for an amount of 120eur' do
19
+ @me.add_expense("Food", 50)
20
+ @me.add_expense("Equipment", 50)
21
+ @me.add_expense("Other", 20)
22
+ end
23
+
24
+ When 'I use Owemegod to distribute the costs' do
25
+ @distribution = @group.distribute
26
+ end
27
+
28
+ Then 'everyone should pay me 20eur' do
29
+ @friends.each do |friend|
30
+ debts = @distribution.outgoing_debts(friend)
31
+ debts.length.must_equal 1
32
+ debt = debts.first
33
+ debt[1].name.must_equal "John Doe"
34
+ debt[2].must_equal 20
35
+ end
36
+ end
37
+
38
+ And 'I should not pay a thing' do
39
+ @distribution.outgoing_debts(@me).length.must_equal 0
40
+ end
41
+
42
+ And 'each one of us paid 15eur' do
43
+ (@friends + [@me]).each do |person|
44
+ person.add_expense("Food", 10)
45
+ end
46
+ end
47
+
48
+ And 'no one should pay a thing' do
49
+ (@friends + [@me]).each do |person|
50
+ @distribution.outgoing_debts(person).length.must_equal 0
51
+ end
52
+ end
53
+
54
+ And 'each one of us paid 15eur except me' do
55
+ @friends.each do |person|
56
+ person.add_expense("Food", 15)
57
+ end
58
+ end
59
+
60
+ Then 'I should pay 2.5eur to everyone' do
61
+ debts = @distribution.outgoing_debts(@me)
62
+ debts.length.must_equal 5
63
+ @friends.each do |friend|
64
+ friend_debts = debts.select{|d| d[1] == friend}
65
+ friend_debts.length.must_equal 1
66
+ friend_debts.first[2].must_equal 2.5
67
+ end
68
+ end
69
+
70
+ And 'no one else should pay anything' do
71
+ @friends.each do |friend|
72
+ @distribution.outgoing_debts(friend).length.must_equal 0
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,10 @@
1
+ begin
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter "/spec/"
5
+ end
6
+ rescue nil
7
+ end
8
+
9
+ require 'owemegod'
10
+ require 'minitest/spec'
data/lib/owemegod.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "owemegod/version"
2
+ require 'owemegod/group'
3
+ require 'owemegod/person'
4
+ require 'owemegod/expense'
5
+ require 'owemegod/expense_collection'
@@ -0,0 +1,6 @@
1
+ require 'ostruct'
2
+
3
+ module Owemegod
4
+ class Debt < OpenStruct
5
+ end
6
+ end
@@ -0,0 +1,81 @@
1
+ module Owemegod
2
+ class DebtDistribution
3
+ attr_accessor :people, :debts
4
+
5
+ def initialize(people)
6
+ self.people = people
7
+ end
8
+
9
+ def average_expenses
10
+ total_amount = people.reduce(0.0) do |sum, person|
11
+ sum += person.total_expenses
12
+ end
13
+ total_amount / people.length
14
+ end
15
+
16
+ def debts
17
+ @debts ||= []
18
+ end
19
+
20
+ def add_debt(from, to, amount)
21
+ debts << [from, to, amount]
22
+ end
23
+
24
+ def outgoing_debts(person)
25
+ debts.select do |debt|
26
+ debt[0] == person
27
+ end
28
+ end
29
+
30
+ def outgoing_debts_amount(person)
31
+ outgoing_debts(person).inject(0.0) do |sum, debt|
32
+ sum += debt[2]
33
+ end
34
+ end
35
+
36
+ def incoming_debts(person)
37
+ debts.select do |debt|
38
+ debt[1] == person
39
+ end
40
+ end
41
+
42
+ def incoming_debts_amount(person)
43
+ incoming_debts(person).inject(0.0) do |sum, debt|
44
+ sum += debt[2]
45
+ end
46
+ end
47
+
48
+ def balance_for(person)
49
+ person = people.find{|p| p == person}
50
+ raise "#{person.name} isn't in this distribution" unless person
51
+ initial_balance = average_expenses - person.total_expenses
52
+ initial_balance += incoming_debts_amount(person)
53
+ initial_balance -= outgoing_debts_amount(person)
54
+ end
55
+
56
+ def calculate
57
+ while(!even?)
58
+ from = most_positive_balance
59
+ to = most_negative_balance
60
+
61
+ if balance_for(from) > -balance_for(to)
62
+ add_debt(from, to, -balance_for(to))
63
+ else
64
+ add_debt(from, to, balance_for(from))
65
+ end
66
+ end
67
+ end
68
+
69
+ def most_positive_balance
70
+ people.shuffle.select{|p| balance_for(p) > 0}.max{|p| balance_for(p)}
71
+ end
72
+
73
+ def most_negative_balance
74
+ people.shuffle.select{|p| balance_for(p) < 0}.min{|p| balance_for(p)}
75
+ end
76
+
77
+ def even?
78
+ people.all?{|p| balance_for(p) >= 0}
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,11 @@
1
+ require 'ostruct'
2
+
3
+ module Owemegod
4
+ class Expense < OpenStruct
5
+ include Comparable
6
+
7
+ def <=>(another)
8
+ self.value <=> another.value
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ require 'owemegod/expense'
2
+
3
+ module Owemegod
4
+ class ExpenseCollection
5
+ include Enumerable
6
+
7
+ def expenses
8
+ @expenses ||= []
9
+ end
10
+
11
+ def add_expense(name, value)
12
+ expenses << Expense.new(name: name, value: value)
13
+ end
14
+
15
+ def value
16
+ inject(0){|sum, expense| sum + expense.value}
17
+ end
18
+
19
+ def each(&block)
20
+ expenses.each do |expense|
21
+ block.call expense
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ require 'owemegod/debt_distribution'
2
+
3
+ module Owemegod
4
+ class Group
5
+
6
+ attr_accessor :people
7
+
8
+ # Initializes an event with a certain array of people
9
+ def initialize(people = [])
10
+ @people ||= []
11
+ people.each do |person|
12
+ add_person person
13
+ end
14
+ end
15
+
16
+ def add_person(person)
17
+ people << person
18
+ end
19
+
20
+ def distribute
21
+ distribution = DebtDistribution.new(people)
22
+ distribution.calculate
23
+ distribution
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ require 'ostruct'
2
+ require 'owemegod/expense_collection'
3
+
4
+ module Owemegod
5
+ class Person < OpenStruct
6
+ attr_accessor :expenses
7
+
8
+ def initialize(*args)
9
+ super
10
+ self.expenses = ExpenseCollection.new
11
+ end
12
+
13
+ def expenses
14
+ @expenses
15
+ end
16
+
17
+ def add_expense(name, amount)
18
+ expenses.add_expense(name, amount)
19
+ end
20
+
21
+ def total_expenses
22
+ expenses.value
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module Owemegod
2
+ VERSION = "0.0.1"
3
+ end
data/owemegod.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "owemegod/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "owemegod"
7
+ s.version = Owemegod::VERSION
8
+ s.authors = ["Josep Jaume"]
9
+ s.email = ["josepjaume@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{A gem for easily distribute debts among friends}
12
+ s.description = %q{A gem for easily distribute debts among friends}
13
+
14
+ s.rubyforge_project = "owemegod"
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 "minitest"
22
+ s.add_development_dependency "spinach"
23
+ s.add_development_dependency "minitest-reporters"
24
+ s.add_development_dependency "ansi"
25
+ end
@@ -0,0 +1,95 @@
1
+ require_relative '../spec_helper'
2
+ require 'owemegod/debt_distribution'
3
+ require 'ostruct'
4
+
5
+ describe Owemegod::DebtDistribution do
6
+ subject{ Owemegod::DebtDistribution.new(people) }
7
+
8
+ let(:james) { OpenStruct.new(name: 'James', total_expenses: 15) }
9
+ let(:john) { OpenStruct.new(name: 'John' , total_expenses: 5) }
10
+ let(:alex) { OpenStruct.new(name: 'Alex' , total_expenses: 0) }
11
+ let(:sally) { OpenStruct.new(name: 'Sally', total_expenses: 10) }
12
+ let(:people){ [james, john, alex, sally] }
13
+
14
+ before do
15
+ subject.add_debt(alex, james, 5)
16
+ subject.add_debt(john, sally, 1)
17
+ subject.add_debt(john, james, 1)
18
+ end
19
+
20
+
21
+ describe "#average_expenses" do
22
+ it "should return the average expenses" do
23
+ subject.average_expenses.must_equal 30.0 / 4
24
+ end
25
+ end
26
+
27
+ describe "debts" do
28
+ describe "#outgoing_debts" do
29
+ it "returns a list of all the debts for a person" do
30
+ subject.outgoing_debts(alex).length.must_equal 1
31
+ subject.outgoing_debts(james).length.must_equal 0
32
+ subject.outgoing_debts(john).length.must_equal 2
33
+ end
34
+ end
35
+
36
+ describe "#outgoing_debts_amount" do
37
+ it "returns the total amount of the debts of a person" do
38
+ subject.outgoing_debts_amount(alex).must_equal 5
39
+ subject.outgoing_debts_amount(john).must_equal 2
40
+ end
41
+ end
42
+
43
+ describe "#incoming_debts" do
44
+ it "returns a list of all the debts for a person" do
45
+ subject.incoming_debts(james).length.must_equal 2
46
+ subject.incoming_debts(john).length.must_equal 0
47
+ subject.incoming_debts(sally).length.must_equal 1
48
+ end
49
+ end
50
+
51
+ describe "#incoming_debts_amount" do
52
+ it "returns the total amount of debts other people have with a person" do
53
+ subject.incoming_debts_amount(james).must_equal 6
54
+ subject.incoming_debts_amount(sally).must_equal 1
55
+ subject.incoming_debts_amount(alex).must_equal 0
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "#balance_for" do
61
+ describe "when there's no debt" do
62
+ before do
63
+ subject.debts = []
64
+ end
65
+
66
+ it "returns the starting balance for that person" do
67
+ subject.balance_for(james).must_equal -7.5
68
+ subject.balance_for(john).must_equal 2.5
69
+ subject.balance_for(alex).must_equal 7.5
70
+ subject.balance_for(sally).must_equal -2.5
71
+ end
72
+ end
73
+
74
+ describe "when there are some debts" do
75
+ it "returns the actual balance for that person" do
76
+ subject.balance_for(james).must_equal -1.5
77
+ subject.balance_for(john).must_equal 0.5
78
+ subject.balance_for(alex).must_equal 2.5
79
+ subject.balance_for(sally).must_equal -1.5
80
+ end
81
+ end
82
+ end
83
+
84
+ describe "#calculate" do
85
+ before do
86
+ subject.debts = nil
87
+ end
88
+ it "sets the balance of everyone to 0" do
89
+ subject.calculate
90
+ subject.people.each do |person|
91
+ subject.balance_for(person).must_equal 0
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,55 @@
1
+ require_relative '../spec_helper'
2
+ require 'owemegod/expense_collection'
3
+
4
+ require 'ostruct'
5
+
6
+ module Owemegod
7
+ describe Owemegod::ExpenseCollection do
8
+ subject { Owemegod::ExpenseCollection.new }
9
+ describe "#first" do
10
+ it "is nil when there's no expenses" do
11
+ subject.first.must_equal nil
12
+ end
13
+
14
+ it "returns the first expense when there's more expenses" do
15
+ subject.add_expense 'Foo', 2
16
+ subject.add_expense 'Bar', 3
17
+ subject.first.name.must_equal 'Foo'
18
+ subject.first.value.must_equal 2
19
+ end
20
+ end
21
+
22
+ describe "#total" do
23
+ it "returns 0 when there's no expense" do
24
+ subject.value.must_equal 0
25
+ end
26
+
27
+ it "returns the total amount of expenses" do
28
+ subject.add_expense "Foo", 5
29
+ subject.add_expense "Bar", 10
30
+ subject.value.must_equal 15
31
+ end
32
+ end
33
+
34
+ describe "#max" do
35
+ it "returns nil if there's no expense" do
36
+ subject.max.must_equal nil
37
+ end
38
+
39
+ it "returns the max expense" do
40
+ subject.add_expense "Foo", 5
41
+ subject.add_expense "Bar", 10
42
+ subject.max.value.must_equal 10
43
+ subject.max.name.must_equal "Bar"
44
+ end
45
+ end
46
+
47
+ describe "#to_a" do
48
+ it "returns a comprehensible array of expenses" do
49
+ subject.add_expense "Foo", 5
50
+ subject.add_expense "Bar", 10
51
+ subject.to_a[0].value.must_equal 5
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ require_relative '../spec_helper'
2
+ require 'owemegod/expense'
3
+
4
+ describe Owemegod::Expense do
5
+ describe "#initializer" do
6
+ it "sets the expense value" do
7
+ expense = Owemegod::Expense.new(value: 50)
8
+ expense.value.must_equal 50
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../spec_helper'
2
+ require 'owemegod/group'
3
+
4
+ module Owemegod
5
+ describe Group do
6
+ describe "#initializer" do
7
+ it "initializes an array of people" do
8
+ person1 = Object.new
9
+ person2 = Object.new
10
+ event = Group.new [person1, person2]
11
+ event.people.must_include person1
12
+ event.people.must_include person2
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../spec_helper'
2
+ require 'owemegod/person'
3
+
4
+ describe Owemegod::Person do
5
+ subject{ Owemegod::Person.new(name: 'Josep Jaume')}
6
+ describe "#name" do
7
+ it "has a name" do
8
+ subject.name.must_equal "Josep Jaume"
9
+ end
10
+ end
11
+
12
+ describe "#total_expenses" do
13
+ describe "when there's no expense" do
14
+ it "returns 0" do
15
+ subject.total_expenses.must_equal 0
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ begin
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter "/spec/"
5
+ end
6
+ rescue nil
7
+ end
8
+
9
+ require 'minitest/spec'
10
+ require 'minitest/autorun'
11
+
12
+ require 'minitest/reporters'
13
+ MiniTest::Unit.runner = MiniTest::SuiteRunner.new
14
+ MiniTest::Unit.runner.reporters << MiniTest::Reporters::ProgressReporter.new
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: owemegod
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Josep Jaume
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: minitest
16
+ requirement: &70365355724080 !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: *70365355724080
25
+ - !ruby/object:Gem::Dependency
26
+ name: spinach
27
+ requirement: &70365355723440 !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: *70365355723440
36
+ - !ruby/object:Gem::Dependency
37
+ name: minitest-reporters
38
+ requirement: &70365355723000 !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: *70365355723000
47
+ - !ruby/object:Gem::Dependency
48
+ name: ansi
49
+ requirement: &70365355722500 !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: *70365355722500
58
+ description: A gem for easily distribute debts among friends
59
+ email:
60
+ - josepjaume@gmail.com
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - .gitignore
66
+ - .rvmrc
67
+ - Gemfile
68
+ - Guardfile
69
+ - Rakefile
70
+ - Readme.md
71
+ - features/debt_distribution.feature
72
+ - features/steps/debt_distribution.rb
73
+ - features/support/env.rb
74
+ - lib/owemegod.rb
75
+ - lib/owemegod/debt.rb
76
+ - lib/owemegod/debt_distribution.rb
77
+ - lib/owemegod/expense.rb
78
+ - lib/owemegod/expense_collection.rb
79
+ - lib/owemegod/group.rb
80
+ - lib/owemegod/person.rb
81
+ - lib/owemegod/version.rb
82
+ - owemegod.gemspec
83
+ - spec/owemegod/debt_distribution_spec.rb
84
+ - spec/owemegod/expense_collection_spec.rb
85
+ - spec/owemegod/expense_spec.rb
86
+ - spec/owemegod/group_spec.rb
87
+ - spec/owemegod/person_spec.rb
88
+ - spec/spec_helper.rb
89
+ homepage: ''
90
+ licenses: []
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project: owemegod
109
+ rubygems_version: 1.8.16
110
+ signing_key:
111
+ specification_version: 3
112
+ summary: A gem for easily distribute debts among friends
113
+ test_files:
114
+ - features/debt_distribution.feature
115
+ - features/steps/debt_distribution.rb
116
+ - features/support/env.rb
117
+ - spec/owemegod/debt_distribution_spec.rb
118
+ - spec/owemegod/expense_collection_spec.rb
119
+ - spec/owemegod/expense_spec.rb
120
+ - spec/owemegod/group_spec.rb
121
+ - spec/owemegod/person_spec.rb
122
+ - spec/spec_helper.rb