Skip to content

Instantly share code, notes, and snippets.

@mikedao
Created March 1, 2016 18:56
Show Gist options
  • Save mikedao/423d0ca4df718145e890 to your computer and use it in GitHub Desktop.
Save mikedao/423d0ca4df718145e890 to your computer and use it in GitHub Desktop.
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