diff --git a/Gemfile b/Gemfile index 356e44a..2ccb4bb 100644 --- a/Gemfile +++ b/Gemfile @@ -11,3 +11,5 @@ gem "sinatra-activerecord", "~> 2.0" gem "rake", "~> 13.0" gem "sqlite3", "~> 1.4" gem "require_all", "~> 3.0" +gem 'tty-prompt' +gem 'tty-progressbar' diff --git a/Gemfile.lock b/Gemfile.lock index 2f1380f..f3573fc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -14,11 +14,16 @@ GEM zeitwerk (~> 2.2) coderay (1.1.2) concurrent-ruby (1.1.5) + equatable (0.6.1) i18n (1.7.0) concurrent-ruby (~> 1.0) method_source (0.9.2) minitest (5.13.0) mustermann (1.0.3) + necromancer (0.5.1) + pastel (0.7.4) + equatable (~> 0.6) + tty-color (~> 0.5) pry (0.12.2) coderay (~> 1.1.0) method_source (~> 0.9.0) @@ -36,10 +41,29 @@ GEM activerecord (>= 3.2) sinatra (>= 1.0) sqlite3 (1.4.1) + strings-ansi (0.1.0) thread_safe (0.3.6) tilt (2.0.10) + tty-color (0.5.1) + tty-cursor (0.7.1) + tty-progressbar (0.17.0) + strings-ansi (~> 0.1.0) + tty-cursor (~> 0.7) + tty-screen (~> 0.7) + unicode-display_width (~> 1.6) + tty-prompt (0.21.0) + necromancer (~> 0.5.0) + pastel (~> 0.7.0) + tty-reader (~> 0.7.0) + tty-reader (0.7.0) + tty-cursor (~> 0.7) + tty-screen (~> 0.7) + wisper (~> 2.0.0) + tty-screen (0.8.0) tzinfo (1.2.5) thread_safe (~> 0.1) + unicode-display_width (1.7.0) + wisper (2.0.1) zeitwerk (2.2.2) PLATFORMS @@ -52,6 +76,8 @@ DEPENDENCIES require_all (~> 3.0) sinatra-activerecord (~> 2.0) sqlite3 (~> 1.4) + tty-progressbar + tty-prompt BUNDLED WITH - 2.0.2 + 2.1.4 diff --git a/Rakefile b/Rakefile index 4e65a4f..3d42102 100644 --- a/Rakefile +++ b/Rakefile @@ -1,2 +1,7 @@ require_relative 'config/environment' -require 'sinatra/activerecord/rake' \ No newline at end of file +require 'sinatra/activerecord/rake' + +desc "start console" +task :console do + Pry.start +end \ No newline at end of file diff --git a/config/database.yml b/config/database.yml index 7d4c3a6..463729e 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,3 +1,3 @@ development: adapter: sqlite3 - database: db/cats.sqlite3 \ No newline at end of file + database: db/GitFit_db.sqlite3 \ No newline at end of file diff --git a/config/environment.rb b/config/environment.rb index 23718ce..0fa85f0 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,4 +1,7 @@ require 'bundler/setup' Bundler.require -require_all 'lib' \ No newline at end of file +require 'active_record' +require_all 'lib' +require_relative '../db/seeds' +ActiveRecord::Base.logger = nil \ No newline at end of file diff --git a/db/migrate/001_create_members.rb b/db/migrate/001_create_members.rb new file mode 100644 index 0000000..d88f694 --- /dev/null +++ b/db/migrate/001_create_members.rb @@ -0,0 +1,9 @@ +class CreateMembers < ActiveRecord::Migration[6.0] + + def change + create_table :members do |t| + t.string :name + t.string :goal + end + end +end \ No newline at end of file diff --git a/db/migrate/002_create_gym_sessions.rb b/db/migrate/002_create_gym_sessions.rb new file mode 100644 index 0000000..3a4648c --- /dev/null +++ b/db/migrate/002_create_gym_sessions.rb @@ -0,0 +1,9 @@ +class CreateGymSessions < ActiveRecord::Migration[6.0] + + def change + create_table :gym_sessions do |t| + t.references :member + t.references :workout + end + end +end \ No newline at end of file diff --git a/db/migrate/003_create_workouts.rb b/db/migrate/003_create_workouts.rb new file mode 100644 index 0000000..64d94f9 --- /dev/null +++ b/db/migrate/003_create_workouts.rb @@ -0,0 +1,8 @@ +class CreateWorkouts < ActiveRecord::Migration[6.0] + + def change + create_table :workouts do |t| + t.string :body_part + end + end +end \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000..05fd8e8 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,31 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# This file is the source Rails uses to define your schema when running `rails +# db:schema:load`. When creating a new database, `rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 3) do + + create_table "gym_sessions", force: :cascade do |t| + t.integer "member_id" + t.integer "workout_id" + t.index ["member_id"], name: "index_gym_sessions_on_member_id" + t.index ["workout_id"], name: "index_gym_sessions_on_workout_id" + end + + create_table "members", force: :cascade do |t| + t.string "name" + t.string "goal" + end + + create_table "workouts", force: :cascade do |t| + t.string "body_part" + end + +end diff --git a/db/seeds.rb b/db/seeds.rb index e69de29..df82765 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -0,0 +1,27 @@ +# Workout.destroy_all +# Member.destroy_all +# GymSession.destroy_all + +# michael = Member.create(:name=>"Michael", :goal=>"strength") +# derek = Member.create(:name=>"Derek", :goal=>"Weight Loss") +# gordo = Member.create(:name=>"Gordo", :goal=>"strength") + +# chest_workout = Workout.create(:body_part=>"Chest") +# back_workout = Workout.create(:body_part=>"back") +# arms_workout = Workout.create(:body_part=>"arms") + +# session1 = GymSession.create() +# session2 = GymSession.create() +# session3 = GymSession.create() + +# session1.member = michael +# session2.member = derek +# session3.member = gordo + +# michael.gym_sessions << session1 +# gordo.gym_sessions << session3 +# derek.gym_sessions << session2 + +# chest_workout.gym_sessions << session1 +# back_workout.gym_sessions << session2 +# arms_workout.gym_sessions << session3 diff --git a/lib/models/cli.rb b/lib/models/cli.rb new file mode 100644 index 0000000..c95073c --- /dev/null +++ b/lib/models/cli.rb @@ -0,0 +1,62 @@ +require 'tty-prompt' +class Cli + + $prompt = TTY::Prompt.new + + def welcome + puts "Welcome to GitFit, your personal workout generator!" + end + + def new_member + Member.create_new + end + + def see_member_profile + Member.see_member_profile + end + + def sign_in + Member.sign_in + end + + def end_app + puts "See you next time!" + end + + def workout + bar = TTY::ProgressBar.new("Work out in progress [:bar]", total: 30) + 30.times do + sleep(0.1) + bar.advance(1) + end + puts "Great job! You finished your workout." + end + + def main_menu + main_menu = $prompt.select("Main Menu") do |menu| + menu.choice 'Build new profile' + menu.choice 'See member profile' + menu.choice 'Select your workout' + menu.choice 'Exit GitFit' + end + main_menu + end + + + + + def select_type_of_workout member + answer = $prompt.select("Choose your workout") do |menu| + menu.choice 'Full Body' + menu.choice 'Chest' + menu.choice 'Back' + menu.choice 'Legs' + menu.choice 'Arms' + end + puts "You have selected a #{answer} workout." + new_session = GymSession.create() + new_workout = Workout.find_or_create_by(:body_part=>answer) + new_workout.gym_sessions << new_session + member.gym_sessions << new_session + end +end \ No newline at end of file diff --git a/lib/models/gym_session.rb b/lib/models/gym_session.rb new file mode 100644 index 0000000..523a276 --- /dev/null +++ b/lib/models/gym_session.rb @@ -0,0 +1,4 @@ +class GymSession < ActiveRecord::Base + belongs_to :member + belongs_to :workout +end \ No newline at end of file diff --git a/lib/models/member.rb b/lib/models/member.rb new file mode 100644 index 0000000..a843a73 --- /dev/null +++ b/lib/models/member.rb @@ -0,0 +1,45 @@ +require 'pry' +require 'tty-prompt' + +class Member < ActiveRecord::Base + $prompt = TTY::Prompt.new + has_many :gym_sessions + has_many :workouts, through: :gym_sessions + + def self.create_new + puts "What is your name" + name = gets.chomp + goal = $prompt.select("What is your goal") do |menu| + menu.choice 'I want to lose weight' + menu.choice 'I want to gain strength' + end + new_member = Member.create(:name=>name, :goal=>goal) + puts "Nice to meet you #{name}! GitFit is here to help you #{goal.remove("I want to ")}!" + puts "Please note your member ID: #{new_member.id}. You will need it to view your profile and log workouts later!" + end + + def self.see_member_profile + member = self.sign_in + puts "Name: #{member[:name]}" + puts "Goal: #{member[:goal]}" + puts "Workouts completed: #{self.get_user_workouts member}" + end + + def self.sign_in + puts "Please enter your member ID" + member_id = gets.chomp + found_member = self.find_by id: member_id + found_member + end + + def self.get_user_workouts member + workout_array = member.workouts.map do |workout| + workout.body_part + end + hash = {} + workout_array.each do |value| + hash[value] ? hash[value] += 1 : hash[value] = 1 + end + hash + end +end diff --git a/lib/models/workout.rb b/lib/models/workout.rb new file mode 100644 index 0000000..b00b640 --- /dev/null +++ b/lib/models/workout.rb @@ -0,0 +1,5 @@ +class Workout < ActiveRecord::Base + has_many :gym_sessions + has_many :members, through: :gym_sessions + +end \ No newline at end of file diff --git a/runner.rb b/runner.rb index fa3c59b..26794eb 100644 --- a/runner.rb +++ b/runner.rb @@ -1,6 +1,23 @@ require_relative 'config/environment' +require 'pry' +require 'tty-prompt' -Cli.new.start_game - - +app = Cli.new +app.welcome +loop do + case app.main_menu + when 'Build new profile' + app.new_member + when 'Select your workout' + app.select_type_of_workout app.sign_in + app.workout + when 'See member profile' + app.see_member_profile + when 'Exit GitFit' + app.end_app + break + end +end +# binding.pry +# 0