Created
March 1, 2016 18:56
-
-
Save mikedao/423d0ca4df718145e890 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/district.rb b/lib/district.rb | |
new file mode 100644 | |
index 0000000..ebe98f8 | |
--- /dev/null | |
+++ b/lib/district.rb | |
@@ -0,0 +1,10 @@ | |
+class District | |
+ attr_reader :name | |
+ | |
+ attr_accessor :enrollment | |
+ | |
+ | |
+ def initialize(hash) | |
+ @name = hash[:name].upcase | |
+ end | |
+end | |
diff --git a/lib/district_repository.rb b/lib/district_repository.rb | |
new file mode 100644 | |
index 0000000..c0d75fe | |
--- /dev/null | |
+++ b/lib/district_repository.rb | |
@@ -0,0 +1,29 @@ | |
+class DistrictRepository | |
+ | |
+ attr_reader :districts | |
+ | |
+ def initialize(districts = []) | |
+ @districts = districts | |
+ end | |
+ | |
+ def find_district_by_name(name) | |
+ @districts.find do |d| | |
+ d.name == name.upcase | |
+ end | |
+ end | |
+ | |
+ def find_all_matching(name) | |
+ @districts.select do |d| | |
+ d.name.include?(name.upcase) | |
+ end | |
+ | |
+ end | |
+ | |
+ def load_enrollments(er) | |
+ @er = er | |
+ | |
+ @districts.each do |district| | |
+ district.enrollment = er.find_by_name(district.name) | |
+ end | |
+ end | |
+end | |
diff --git a/lib/enrollment.rb b/lib/enrollment.rb | |
new file mode 100644 | |
index 0000000..4326ccf | |
--- /dev/null | |
+++ b/lib/enrollment.rb | |
@@ -0,0 +1,25 @@ | |
+class Enrollment | |
+ | |
+ attr_reader :data, | |
+ :name | |
+ | |
+ | |
+ def initialize(data) | |
+ @data = data.merge(kindergarten_participation: floor_stuff(data)) | |
+ @name = data[:name].upcase | |
+ end | |
+ | |
+ def kindergarten_participation_by_year | |
+ @data[:kindergarten_participation] | |
+ end | |
+ | |
+ def floor_stuff(data) | |
+ data[:kindergarten_participation].map do |year, value| | |
+ [year, truncate(value)] | |
+ end.to_h | |
+ end | |
+ | |
+ def truncate(value) | |
+ ((value * 1000).floor / 1000.0) | |
+ end | |
+end | |
diff --git a/lib/enrollment_repository.rb b/lib/enrollment_repository.rb | |
new file mode 100644 | |
index 0000000..c35c2b9 | |
--- /dev/null | |
+++ b/lib/enrollment_repository.rb | |
@@ -0,0 +1,14 @@ | |
+class EnrollmentRepository | |
+ | |
+ def initialize(enrollments) | |
+ @enrollments = enrollments | |
+ end | |
+ | |
+ def find_by_name(name) | |
+ @enrollments.find do |e| | |
+ e.name == name | |
+ end | |
+ | |
+ end | |
+ | |
+end | |
diff --git a/test/district_repository_test.rb b/test/district_repository_test.rb | |
new file mode 100644 | |
index 0000000..b691dff | |
--- /dev/null | |
+++ b/test/district_repository_test.rb | |
@@ -0,0 +1,59 @@ | |
+require "minitest/autorun" | |
+require "minitest/pride" | |
+require "./lib/district_repository" | |
+require "./lib/district" | |
+require "./lib/enrollment" | |
+require "./lib/enrollment_repository" | |
+ | |
+class DistrictRepositoryTest < Minitest::Test | |
+ | |
+ def test_cant_find_district_when_there_are_none | |
+ dr = DistrictRepository.new | |
+ | |
+ result = dr.find_district_by_name("Hogwarts") | |
+ | |
+ assert_equal nil, result | |
+ end | |
+ | |
+ def test_can_find_district_by_name | |
+ district = District.new({name: "Turing"}) | |
+ | |
+ dr = DistrictRepository.new([district]) | |
+ | |
+ result = dr.find_district_by_name("Turing") | |
+ | |
+ assert_equal district, result | |
+ end | |
+ | |
+ def test_can_find_mulitple_matches | |
+ district_1 = District.new({name: "Turing"}) | |
+ district_2 = District.new({name: "Turong"}) | |
+ district_3 = District.new({name: "Place"}) | |
+ | |
+ dr = DistrictRepository.new([ district_1, | |
+ district_2, | |
+ district_3]) | |
+ | |
+ result = dr.find_all_matching("Tur") | |
+ | |
+ expected = [district_1, district_2] | |
+ | |
+ assert_equal expected, result | |
+ end | |
+ | |
+ def test_a_district_knows_its_enrollments | |
+ district = District.new({name: "Turing"}) | |
+ | |
+ dr = DistrictRepository.new([district]) | |
+ | |
+ e = Enrollment.new({:name => "Turing", | |
+ :kindergarten_participation => {2010 => 0.3915, | |
+ 2011 => 0.35356, | |
+ 2012 => 0.2677}}) | |
+ | |
+ er = EnrollmentRepository.new([e]) | |
+ dr.load_enrollments(er) | |
+ | |
+ assert_equal e, dr.find_district_by_name("Turing").enrollment | |
+ end | |
+end | |
diff --git a/test/district_test.rb b/test/district_test.rb | |
new file mode 100644 | |
index 0000000..8e8cb67 | |
--- /dev/null | |
+++ b/test/district_test.rb | |
@@ -0,0 +1,19 @@ | |
+require "minitest/autorun" | |
+require "minitest/pride" | |
+require "./lib/district" | |
+ | |
+class DistrictTest < Minitest::Test | |
+ | |
+ def test_it_has_a_name | |
+ district = District.new({:name => "ACADEMY 20"}) | |
+ | |
+ assert_equal "ACADEMY 20", district.name | |
+ end | |
+ | |
+ def test_it_returns_upcased_version | |
+ district = District.new({:name => "academy 20"}) | |
+ | |
+ assert_equal "ACADEMY 20", district.name | |
+ end | |
+ | |
+end | |
diff --git a/test/enrollment_repository_test.rb b/test/enrollment_repository_test.rb | |
new file mode 100644 | |
index 0000000..7b632db | |
--- /dev/null | |
+++ b/test/enrollment_repository_test.rb | |
@@ -0,0 +1,17 @@ | |
+require "minitest/autorun" | |
+require "./lib/enrollment_repository" | |
+require "./lib/enrollment" | |
+ | |
+class EnrollmentRepositoryTest < Minitest::Test | |
+ | |
+ def test_it_can_find_by_name | |
+ enrollment = Enrollment.new({:name => "ACADEMY 20", | |
+ :kindergarten_participation => {2010 => 0.3915, | |
+ 2011 => 0.35356, | |
+ 2012 => 0.2677}}) | |
+ er = EnrollmentRepository.new([enrollment]) | |
+ | |
+ assert_equal enrollment, er.find_by_name("ACADEMY 20") | |
+ | |
+ end | |
+end | |
diff --git a/test/enrollment_test.rb b/test/enrollment_test.rb | |
new file mode 100644 | |
index 0000000..547d06a | |
--- /dev/null | |
+++ b/test/enrollment_test.rb | |
@@ -0,0 +1,22 @@ | |
+require "minitest/autorun" | |
+require "minitest/pride" | |
+require "./lib/enrollment" | |
+ | |
+class EnrollmentTest < Minitest::Test | |
+ | |
+ def test_takes_some_data | |
+ e = Enrollment.new({:name => "ACADEMY 20", | |
+ :kindergarten_participation => {2010 => 0.3915, | |
+ 2011 => 0.35356, | |
+ 2012 => 0.2677}}) | |
+ | |
+ data = {kindergarten_participation: {2010 => 0.391, | |
+ 2011 => 0.353, | |
+ 2012 => 0.267} } | |
+ | |
+ assert_equal data[:kindergarten_participation], | |
+ e.kindergarten_participation_by_year | |
+ | |
+ end | |
+ | |
+end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment