From fb7f99d67be2db2494f982d988eb28fe0455631a Mon Sep 17 00:00:00 2001 From: Gregory Ballantine Date: Wed, 3 Jul 2024 09:32:02 -0400 Subject: [PATCH] Initial sinatra project structure --- .gitignore | 9 +++++ .rubocop.yml | 23 ++++++++++++ Dockerfile.dev | 15 ++++++++ Gemfile | 17 +++++++++ Gruntfile.js | 65 +++++++++++++++++++++++++++++++++ Rakefile | 18 +++++++++ assets/scripts/darkmeyer.coffee | 2 + assets/styles/hallowvale.sass | 2 + config.ru | 7 ++++ config/defaults.yaml | 6 +++ entrypoints/dev.sh | 7 ++++ package.json | 27 ++++++++++++++ src/config.rb | 28 ++++++++++++++ src/helpers.rb | 11 ++++++ src/models/init.rb | 3 ++ src/routes/index.rb | 12 ++++++ src/routes/init.rb | 3 ++ src/server.rb | 34 +++++++++++++++++ views/index/home.erb | 5 +++ views/layout.erb | 22 +++++++++++ views/partials/navbar.erb | 8 ++++ 21 files changed, 324 insertions(+) create mode 100644 .rubocop.yml create mode 100644 Dockerfile.dev create mode 100644 Gemfile create mode 100644 Gruntfile.js create mode 100644 Rakefile create mode 100644 assets/scripts/darkmeyer.coffee create mode 100644 assets/styles/hallowvale.sass create mode 100644 config.ru create mode 100644 config/defaults.yaml create mode 100644 entrypoints/dev.sh create mode 100644 package.json create mode 100644 src/config.rb create mode 100644 src/helpers.rb create mode 100644 src/models/init.rb create mode 100644 src/routes/index.rb create mode 100644 src/routes/init.rb create mode 100644 src/server.rb create mode 100644 views/index/home.erb create mode 100644 views/layout.erb create mode 100644 views/partials/navbar.erb diff --git a/.gitignore b/.gitignore index d6aa672..7a6beec 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,12 @@ build-iPhoneSimulator/ # Used by RuboCop. Remote config files pulled in from inherit_from directive. # .rubocop-https?--* +# Ignore local data +data/ + +# Node modules +node_modules/ + +# Compiled assets +public/css/ +public/js/ diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..5378101 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,23 @@ +require: rubocop-sequel + +AllCops: + NewCops: enable + +Layout/EmptyLinesAroundClassBody: + EnforcedStyle: 'empty_lines_except_namespace' +Layout/EmptyLinesAroundModuleBody: + EnforcedStyle: 'empty_lines_except_namespace' +Layout/FirstHashElementIndentation: + EnforcedStyle: 'consistent' +Metrics/ClassLength: + Max: 150 +Style/ClassVars: + Enabled: false +Style/GlobalVars: + Enabled: false +Style/MethodCallWithoutArgsParentheses: + Enabled: false +Style/MethodCallWithArgsParentheses: + Enabled: true +Style/RedundantReturn: + Enabled: false diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..a3e0daa --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM ruby:3.3 + +RUN gem install bundler -v 2.5 + +WORKDIR /src + +COPY Gemfile Gemfile.lock ./ + +RUN bundle check || bundle install + +RUN gem install rake + +COPY . ./ + +ENTRYPOINT ["bash", "entrypoints/dev.sh"] diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..d6a34ec --- /dev/null +++ b/Gemfile @@ -0,0 +1,17 @@ +source 'https://rubygems.org' + +gem 'sinatra', '~> 3.0' +gem 'sinatra-contrib', '~> 3.0' +gem 'puma', '~> 6.3' + +gem 'sequel', '~> 5.70' +gem 'sqlite3', '~> 1.7' + +group :development, :test do + gem 'rerun' + gem 'wdm', '>= 0.1.0' if Gem.win_platform? + + # rubocop and extensions for code style + gem 'rubocop' + gem 'rubocop-sequel' +end diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..be0ed86 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,65 @@ +module.exports = function(grunt) { + + // Project configuration. + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + + sass: { + dist: { + options: { + style: 'compressed' + }, + files: [{ + expand: true, + cwd: 'assets/styles', + src: ['**/*.sass'], + dest: 'public/css', + ext: '.css' + }] + } + }, + + coffee: { + options: { + sourceMap: true, + style: 'compressed' + }, + files: { + expand: true, + flatten: true, + cwd: 'assets/scripts', + src: ['*.coffee'], + dest: 'public/js', + ext: '.js' + } + }, + + watch: { + css: { + files: ['assets/styles/**/*.sass'], + tasks: ['sass'], + options: { + atBegin: true, + spawn: false + } + }, + js: { + files: ['assets/scripts/**/*.js'], + tasks: ['coffee'], + options: { + atBegin: true, + spawn: false + } + } + } + }); + + // Load plugins. + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-sass'); + grunt.loadNpmTasks('grunt-contrib-coffee'); + + // CLI tasks. + grunt.registerTask('default', ['sass', 'coffee']); + +}; diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..073c700 --- /dev/null +++ b/Rakefile @@ -0,0 +1,18 @@ +require 'bundler/setup' + +namespace :server do + task :start do + ENV['APP_ENV'] = 'production' + system("puma") + end + + task :dev do + system('rerun --no-notify --exit --dir="src/" puma') + end +end + +namespace :test do + task :rubocop do + system("rubocop src/") + end +end diff --git a/assets/scripts/darkmeyer.coffee b/assets/scripts/darkmeyer.coffee new file mode 100644 index 0000000..70a7709 --- /dev/null +++ b/assets/scripts/darkmeyer.coffee @@ -0,0 +1,2 @@ +$ -> + console.log('Ready.') diff --git a/assets/styles/hallowvale.sass b/assets/styles/hallowvale.sass new file mode 100644 index 0000000..c562ebf --- /dev/null +++ b/assets/styles/hallowvale.sass @@ -0,0 +1,2 @@ +#main-nav + margin-bottom: 15px diff --git a/config.ru b/config.ru new file mode 100644 index 0000000..9f91c9b --- /dev/null +++ b/config.ru @@ -0,0 +1,7 @@ +# Load application config +require_relative 'src/config.rb' +$conf = Config.new(File.join(__dir__, 'config/defaults.yaml')) + +root = ::File.dirname(__FILE__) +require ::File.join( root, 'src', 'server' ) +run GameData.new diff --git a/config/defaults.yaml b/config/defaults.yaml new file mode 100644 index 0000000..527f2ba --- /dev/null +++ b/config/defaults.yaml @@ -0,0 +1,6 @@ +database: + adapter: 'sqlite' + database: 'data/destructo.db' + +testing: + minimum_results_required: 3 diff --git a/entrypoints/dev.sh b/entrypoints/dev.sh new file mode 100644 index 0000000..39c792f --- /dev/null +++ b/entrypoints/dev.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +if [ ! -f ./data/gamedata.db ]; then + rake db:migrate +fi + +rake server:dev diff --git a/package.json b/package.json new file mode 100644 index 0000000..331ea6a --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "destructo", + "description": "Self-destructing messaging app", + "version": "0.1.0", + "main": "src/server.rb", + "scripts": { + "grunt": "grunt" + }, + "repository": { + "type": "git", + "url": "https://git.metaunix.net/Metaunix/Destructo" + }, + "keywords": [ + "messaging", + "self-destructing" + ], + "author": "Gregory Ballantine ", + "license": "BSD-4-Clause", + "devDependencies": { + "grunt": "^1.6.1", + "grunt-cli": "^1.4.3", + "grunt-contrib-coffee": "^2.1.0", + "grunt-contrib-sass": "^2.0.0", + "grunt-contrib-watch": "^1.1.0", + "sass": "^1.77.4" + } +} diff --git a/src/config.rb b/src/config.rb new file mode 100644 index 0000000..84d7491 --- /dev/null +++ b/src/config.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'yaml' + +# Config - loads and manages the app's configuration +class Config + + DEFAULT_CONFIG = 'config/defaults.yaml' + + def initialize(config_path) + @data = YAML.load_file(DEFAULT_CONFIG) + + # merge in user-defined configuration if it exists + @data.merge!(YAML.load_file(config_path)) if File.exist?(config_path) + end + + def get(key) + bits = key.split('.') + value = @data + + bits.each do |bit| + value = value[bit] + end + + return value + end + +end diff --git a/src/helpers.rb b/src/helpers.rb new file mode 100644 index 0000000..b3db1b4 --- /dev/null +++ b/src/helpers.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +# Helpers - view helper functions +module Helpers + + def date_format(date) + dt = date.to_datetime + return dt.strftime('%B %d, %Y @ %I:%M:%S %p %Z') + end + +end diff --git a/src/models/init.rb b/src/models/init.rb new file mode 100644 index 0000000..5179b5b --- /dev/null +++ b/src/models/init.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +# Will add models to load here diff --git a/src/routes/index.rb b/src/routes/index.rb new file mode 100644 index 0000000..2b4ce59 --- /dev/null +++ b/src/routes/index.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +# / (top-level) routes +class Destructo < Sinatra::Base + + get '/' do + erb :'index/home', locals: { + title: 'Home' + } + end + +end diff --git a/src/routes/init.rb b/src/routes/init.rb new file mode 100644 index 0000000..f7eb452 --- /dev/null +++ b/src/routes/init.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require_relative 'index' diff --git a/src/server.rb b/src/server.rb new file mode 100644 index 0000000..cdccec0 --- /dev/null +++ b/src/server.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'sinatra/base' +require 'sinatra/json' +require 'sequel' +require 'sqlite3' + +# Load the Sequel timestamps plugin +Sequel::Model.plugin(:timestamps) +# Initialize Sequel gem for database actions +DB = Sequel.connect(adapter: $conf.get('database.adapter'), database: $conf.get('database.database')) + +# Base app +class Destructo < Sinatra::Base + + enable :sessions + + # Set up static file serving + enable :static + set :public_folder, File.join(__dir__, '/../public') + + # Register view helpers + require_relative 'helpers' + helpers Helpers + + # Set up our view engine + set :views, File.join(settings.root, '/../views') + +end + +# Load routes +require_relative 'routes/init' +# Load models +require_relative 'models/init' diff --git a/views/index/home.erb b/views/index/home.erb new file mode 100644 index 0000000..ed6c601 --- /dev/null +++ b/views/index/home.erb @@ -0,0 +1,5 @@ +
+
+

This is the home page.

+
+
diff --git a/views/layout.erb b/views/layout.erb new file mode 100644 index 0000000..063e92b --- /dev/null +++ b/views/layout.erb @@ -0,0 +1,22 @@ + + + + + + + <%= title %> | Game Data + + + + + + + + <%= erb :'partials/navbar', :locals => locals %> + + +
+ <%= yield %> +
+ + diff --git a/views/partials/navbar.erb b/views/partials/navbar.erb new file mode 100644 index 0000000..f254128 --- /dev/null +++ b/views/partials/navbar.erb @@ -0,0 +1,8 @@ +