From 9674e3f330e27fdd09a30582f833baa495bea8d7 Mon Sep 17 00:00:00 2001 From: Gilbert Date: Wed, 3 Dec 2014 23:28:06 -0600 Subject: [PATCH 1/4] Starting code for project --- Gemfile | 2 ++ Gemfile.lock | 40 +++++++++++++-------- lib/library_plus.rb | 34 ++++++++++++++++++ lib/library_plus/book_repo.rb | 1 + lib/library_plus/user_repo.rb | 27 +++++++++++++++ server.rb | 8 +++++ spec/.gitkeep | 0 spec/repos/user_repo_spec.rb | 65 +++++++++++++++++++++++++++++++++++ spec/spec_helper.rb | 13 +++++++ views/index.erb | 3 ++ 10 files changed, 178 insertions(+), 15 deletions(-) create mode 100644 lib/library_plus.rb create mode 100644 lib/library_plus/book_repo.rb create mode 100644 lib/library_plus/user_repo.rb create mode 100644 server.rb delete mode 100644 spec/.gitkeep create mode 100644 spec/repos/user_repo_spec.rb create mode 100644 spec/spec_helper.rb create mode 100644 views/index.erb diff --git a/Gemfile b/Gemfile index 1f478929..f4b5c425 100644 --- a/Gemfile +++ b/Gemfile @@ -3,3 +3,5 @@ ruby '2.0.0' gem 'rspec', '~> 2.14.1' gem 'pry-byebug' +gem 'sinatra', '~> 1.4.5' +gem 'pg' diff --git a/Gemfile.lock b/Gemfile.lock index db516937..180a130e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,23 +1,26 @@ GEM remote: https://rubygems.org/ specs: + byebug (3.5.1) + columnize (~> 0.8) + debugger-linecache (~> 1.2) + slop (~> 3.6) coderay (1.1.0) - columnize (0.3.6) - debugger (1.6.5) - columnize (>= 0.3.1) - debugger-linecache (~> 1.2.0) - debugger-ruby_core_source (~> 1.3.1) + columnize (0.8.9) debugger-linecache (1.2.0) - debugger-ruby_core_source (1.3.1) diff-lcs (1.2.5) method_source (0.8.2) - pry (0.9.12.6) - coderay (~> 1.0) - method_source (~> 0.8) + pg (0.17.1) + pry (0.10.1) + coderay (~> 1.1.0) + method_source (~> 0.8.1) slop (~> 3.4) - pry-debugger (0.2.2) - debugger (~> 1.3) - pry (~> 0.9.10) + pry-byebug (2.0.0) + byebug (~> 3.4) + pry (~> 0.10) + rack (1.5.2) + rack-protection (1.5.3) + rack rspec (2.14.1) rspec-core (~> 2.14.0) rspec-expectations (~> 2.14.0) @@ -26,11 +29,18 @@ GEM rspec-expectations (2.14.5) diff-lcs (>= 1.1.3, < 2.0) rspec-mocks (2.14.5) - slop (3.4.7) + sinatra (1.4.5) + rack (~> 1.4) + rack-protection (~> 1.4) + tilt (~> 1.3, >= 1.3.4) + slop (3.6.0) + tilt (1.4.1) PLATFORMS ruby DEPENDENCIES - pry-debugger (~> 0.2.2) - rspec (~> 2.14.0) + pg + pry-byebug + rspec (~> 2.14.1) + sinatra (~> 1.4.5) diff --git a/lib/library_plus.rb b/lib/library_plus.rb new file mode 100644 index 00000000..9148018a --- /dev/null +++ b/lib/library_plus.rb @@ -0,0 +1,34 @@ +require 'pg' + +module Library + def self.create_db_connection(dbname) + PG.connect(host: 'localhost', dbname: dbname) + end + + def self.clear_db(db) + db.exec <<-SQL + DELETE FROM users; + /* TODO: Clear rest of the tables (books, etc.) */ + SQL + end + + def self.create_tables(db) + db.exec <<-SQL + CREATE TABLE users( + id SERIAL PRIMARY KEY, + name VARCHAR + ); + /* TODO: Create rest of the tables (books, etc.) */ + SQL + end + + def self.drop_tables(db) + db.exec <<-SQL + DROP TABLE users; + /* TODO: Drop rest of the tables (books, etc.) */ + SQL + end +end + +require_relative 'library_plus/book_repo' +require_relative 'library_plus/user_repo' diff --git a/lib/library_plus/book_repo.rb b/lib/library_plus/book_repo.rb new file mode 100644 index 00000000..46409041 --- /dev/null +++ b/lib/library_plus/book_repo.rb @@ -0,0 +1 @@ +# TODO diff --git a/lib/library_plus/user_repo.rb b/lib/library_plus/user_repo.rb new file mode 100644 index 00000000..ef6ee87c --- /dev/null +++ b/lib/library_plus/user_repo.rb @@ -0,0 +1,27 @@ +module Library + class UserRepo + + def self.all(db) + # Other code should not have to deal with the PG:Result. + # Therefore, convert the results into a plain array. + db.exec("SELECT * FROM users").to_a + end + + def self.find(db, user_data) + # TODO: Insert SQL statement + end + + def self.save(db, user_data) + if user_data['id'] + # TODO: Update SQL statement + else + # TODO: Insert SQL statement + end + end + + def self.destroy(db, user_data) + # TODO: Delete SQL statement + end + + end +end diff --git a/server.rb b/server.rb new file mode 100644 index 00000000..91a87bcd --- /dev/null +++ b/server.rb @@ -0,0 +1,8 @@ +require 'sinatra' +require './lib/library_plus' + +# set :bind, '0.0.0.0' # This is needed for Vagrant + +get '/' do + erb :index +end diff --git a/spec/.gitkeep b/spec/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/spec/repos/user_repo_spec.rb b/spec/repos/user_repo_spec.rb new file mode 100644 index 00000000..94028dde --- /dev/null +++ b/spec/repos/user_repo_spec.rb @@ -0,0 +1,65 @@ +require 'spec_helper' + +describe Library::UserRepo do + + def user_count(db) + db.exec("SELECT COUNT(*) FROM users")[0]["count"].to_i + end + + let(:db) { Library.create_db_connection('library_test') } + + before(:each) do + Library.clear_db(db) + end + + it "gets all users" do + db.exec("INSERT INTO users (name) VALUES ($1)", ["Alice"]) + db.exec("INSERT INTO users (name) VALUES ($1)", ["Bob"]) + + users = Library::UserRepo.all(db) + expect(users).to be_a Array + expect(users.count).to eq 2 + + names = users.map {|u| u['name'] } + expect(names).to include "Alice", "Bob" + end + + it "creates users" do + expect(user_count(db)).to eq 0 + + user = Library::UserRepo.save(db, :name => "Alice") + expect(user['id']).to_not be_nil + expect(user['name']).to eq "Alice" + + # Check for persistence + expect(user_count(db)).to eq 1 + + user = db.exec("SELECT * FROM users")[0] + expect(user['name']).to eq "Alice" + end + + xit "finds users" do + user = Library::UserRepo.save(db, :name => "Alice") + retrieved_user = Library::UserRepo.find(db, user['id']) + expect(retrieved_user['name']).to eq "Alice" + end + + xit "updates users" do + user1 = Library::UserRepo.save(db, :name => "Alice") + user2 = Library::UserRepo.save(db, :name => "Alicia") + expect(user2['id']).to eq(user1['id']) + expect(user2['name']).to eq "Alicia" + + # Check for persistence + user3 = Library::UserRepo.find(user1['id']) + expect(user3['name']).to eq "Alicia" + end + + xit "destroys users" do + user = Library::UserRepo.save(db, :name => "Alice") + expect(user_count(db)).to eq 1 + + Library::UserRepo.destroy(db, user['id']) + expect(user_count(db)).to eq 0 + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 00000000..962938ee --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,13 @@ +require 'library_plus' + +RSpec.configure do |config| + config.treat_symbols_as_metadata_keys_with_true_values = true + config.run_all_when_everything_filtered = true + config.filter_run :focus + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = 'random' +end diff --git a/views/index.erb b/views/index.erb new file mode 100644 index 00000000..aba3235d --- /dev/null +++ b/views/index.erb @@ -0,0 +1,3 @@ +

The Library Plus System

+ +

Welcome to your freedom!

From 31945facbfa3d57be1aea31c64fc3746b97847db Mon Sep 17 00:00:00 2001 From: Gilbert Date: Thu, 4 Dec 2014 16:11:12 -0600 Subject: [PATCH 2/4] Correct some variable names --- lib/library_plus/user_repo.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/library_plus/user_repo.rb b/lib/library_plus/user_repo.rb index ef6ee87c..f293fe6a 100644 --- a/lib/library_plus/user_repo.rb +++ b/lib/library_plus/user_repo.rb @@ -7,7 +7,7 @@ def self.all(db) db.exec("SELECT * FROM users").to_a end - def self.find(db, user_data) + def self.find(db, user_id) # TODO: Insert SQL statement end @@ -19,7 +19,7 @@ def self.save(db, user_data) end end - def self.destroy(db, user_data) + def self.destroy(db, user_id) # TODO: Delete SQL statement end From fd9cd8119e85585a7f41880f40bf9fd4014b1503 Mon Sep 17 00:00:00 2001 From: Gilbert Date: Fri, 5 Dec 2014 11:05:34 -0600 Subject: [PATCH 3/4] Fix spec typos --- spec/repos/user_repo_spec.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/repos/user_repo_spec.rb b/spec/repos/user_repo_spec.rb index 94028dde..44d0278b 100644 --- a/spec/repos/user_repo_spec.rb +++ b/spec/repos/user_repo_spec.rb @@ -27,7 +27,7 @@ def user_count(db) it "creates users" do expect(user_count(db)).to eq 0 - user = Library::UserRepo.save(db, :name => "Alice") + user = Library::UserRepo.save(db, { 'name' => "Alice" }) expect(user['id']).to_not be_nil expect(user['name']).to eq "Alice" @@ -39,14 +39,14 @@ def user_count(db) end xit "finds users" do - user = Library::UserRepo.save(db, :name => "Alice") + user = Library::UserRepo.save(db, { 'name' => "Alice" }) retrieved_user = Library::UserRepo.find(db, user['id']) expect(retrieved_user['name']).to eq "Alice" end xit "updates users" do - user1 = Library::UserRepo.save(db, :name => "Alice") - user2 = Library::UserRepo.save(db, :name => "Alicia") + user1 = Library::UserRepo.save(db, { 'name' => "Alice" }) + user2 = Library::UserRepo.save(db, { 'id' => user1['id'], 'name' => "Alicia" }) expect(user2['id']).to eq(user1['id']) expect(user2['name']).to eq "Alicia" @@ -56,7 +56,7 @@ def user_count(db) end xit "destroys users" do - user = Library::UserRepo.save(db, :name => "Alice") + user = Library::UserRepo.save(db, { 'name' => "Alice" }) expect(user_count(db)).to eq 1 Library::UserRepo.destroy(db, user['id']) From bca8d6fd5cbaf67c03678d508cc004a682a71ae8 Mon Sep 17 00:00:00 2001 From: Michael Bashour Date: Mon, 8 Dec 2014 13:37:22 -0600 Subject: [PATCH 4/4] Progress prior to wiping computer. --- lib/library_plus.rb | 2 +- lib/library_plus/user_repo.rb | 17 ++++++++++++++--- spec/repos/user_repo_spec.rb | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/library_plus.rb b/lib/library_plus.rb index 9148018a..fa1606e1 100644 --- a/lib/library_plus.rb +++ b/lib/library_plus.rb @@ -2,7 +2,7 @@ module Library def self.create_db_connection(dbname) - PG.connect(host: 'localhost', dbname: dbname) + PG.connect(host: 'localhost', dbname: dbname, user: 'postgres', password: 'password') end def self.clear_db(db) diff --git a/lib/library_plus/user_repo.rb b/lib/library_plus/user_repo.rb index ef6ee87c..e41c9ca1 100644 --- a/lib/library_plus/user_repo.rb +++ b/lib/library_plus/user_repo.rb @@ -1,3 +1,8 @@ +# Library ::UserRepo <-- how to reference this class +# This is a user class under the Library module +# Library::UserRepo.all(db) +# Library::BookRepo.all(db) + module Library class UserRepo @@ -7,15 +12,21 @@ def self.all(db) db.exec("SELECT * FROM users").to_a end - def self.find(db, user_data) + def self.find(db, user_id) # TODO: Insert SQL statement end + # Use Create if !exists and Update if does + # TODO: Update SQL statement + # Library::UserRepo.save(db, { :name => "Alice" }) def self.save(db, user_data) if user_data['id'] - # TODO: Update SQL statement + + # else - # TODO: Insert SQL statement + db.exec("INSERT INTO users (name) VALUES ($1)", [user_data[:name]]) + results = db.exec("SELECT * FROM users") + results end end diff --git a/spec/repos/user_repo_spec.rb b/spec/repos/user_repo_spec.rb index 94028dde..f5497433 100644 --- a/spec/repos/user_repo_spec.rb +++ b/spec/repos/user_repo_spec.rb @@ -24,7 +24,7 @@ def user_count(db) expect(names).to include "Alice", "Bob" end - it "creates users" do + xit "creates users" do expect(user_count(db)).to eq 0 user = Library::UserRepo.save(db, :name => "Alice")