diff --git a/.idea/ecoffee.iml b/.idea/ecoffee.iml index 7c605fa..f6f7bd0 100644 --- a/.idea/ecoffee.iml +++ b/.idea/ecoffee.iml @@ -42,23 +42,22 @@ - + + - - @@ -69,7 +68,6 @@ - @@ -80,16 +78,13 @@ + - - - - @@ -127,12 +122,13 @@ - + + diff --git a/Gemfile b/Gemfile index a4ada41..198b7d8 100644 --- a/Gemfile +++ b/Gemfile @@ -1,63 +1,38 @@ source "https://rubygems.org" -# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" gem "rails", "~> 8.0.1" -# The modern asset pipeline for Rails [https://github.com/rails/propshaft] gem "propshaft" -# Use postgresql as the database for Active Record gem "pg", "~> 1.1" -# Use the Puma web server [https://github.com/puma/puma] gem "puma", ">= 5.0" -# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] gem "importmap-rails" -# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] gem "turbo-rails" -# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] gem "stimulus-rails" -# Build JSON APIs with ease [https://github.com/rails/jbuilder] gem "jbuilder" +gem "toml-rb" +gem "nanoid" +gem "spicy-proton" -# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] -# gem "bcrypt", "~> 3.1.7" - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem "tzinfo-data", platforms: %i[ windows jruby ] -# Use the database-backed adapters for Rails.cache, Active Job, and Action Cable gem "solid_cache" gem "solid_queue" gem "solid_cable" -# Reduces boot times through caching; required in config/boot.rb gem "bootsnap", require: false -# Deploy this application anywhere as a Docker container [https://kamal-deploy.org] -gem "kamal", require: false - -# Add HTTP asset caching/compression and X-Sendfile acceleration to Puma [https://github.com/basecamp/thruster/] gem "thruster", require: false -# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] -# gem "image_processing", "~> 1.2" - group :development, :test do - # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem gem "debug", platforms: %i[ mri windows ], require: "debug/prelude" - - # Static analysis for security vulnerabilities [https://brakemanscanner.org/] gem "brakeman", require: false - - # Omakase Ruby styling [https://github.com/rails/rubocop-rails-omakase/] gem "rubocop-rails-omakase", require: false end group :development do - # Use console on exceptions pages [https://github.com/rails/web-console] gem "web-console" end group :test do - # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] gem "capybara" gem "selenium-webdriver" end diff --git a/Gemfile.lock b/Gemfile.lock index c0a83c7..5db998e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -76,11 +76,9 @@ GEM public_suffix (>= 2.0.2, < 7.0) ast (2.4.2) base64 (0.2.0) - bcrypt_pbkdf (1.1.1) - bcrypt_pbkdf (1.1.1-arm64-darwin) - bcrypt_pbkdf (1.1.1-x86_64-darwin) benchmark (0.4.0) bigdecimal (3.1.9) + bindata (2.5.0) bindex (0.8.1) bootsnap (1.18.4) msgpack (~> 1.2) @@ -96,6 +94,7 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) + citrus (3.0.2) concurrent-ruby (1.3.5) connection_pool (2.5.0) crass (1.0.6) @@ -103,9 +102,7 @@ GEM debug (1.10.0) irb (~> 1.10) reline (>= 0.3.8) - dotenv (3.1.7) drb (2.2.1) - ed25519 (1.3.0) erubi (1.13.1) et-orbi (1.2.11) tzinfo @@ -129,17 +126,6 @@ GEM actionview (>= 5.0.0) activesupport (>= 5.0.0) json (2.10.1) - kamal (2.5.3) - activesupport (>= 7.0) - base64 (~> 0.2) - bcrypt_pbkdf (~> 1.0) - concurrent-ruby (~> 1.2) - dotenv (~> 3.1) - ed25519 (~> 1.2) - net-ssh (~> 7.3) - sshkit (>= 1.23.0, < 2.0) - thor (~> 1.3) - zeitwerk (>= 2.6.18, < 3.0) language_server-protocol (3.17.0.4) lint_roller (1.1.0) logger (1.6.6) @@ -156,6 +142,7 @@ GEM mini_mime (1.1.5) minitest (5.25.4) msgpack (1.8.0) + nanoid (2.0.0) net-imap (0.5.6) date net-protocol @@ -163,13 +150,8 @@ GEM net-protocol net-protocol (0.2.2) timeout - net-scp (4.1.0) - net-ssh (>= 2.6.5, < 8.0.0) - net-sftp (4.0.0) - net-ssh (>= 5.0.0, < 8.0.0) net-smtp (0.5.1) net-protocol - net-ssh (7.3.0) nio4r (2.7.4) nokogiri (1.18.3-aarch64-linux-gnu) racc (~> 1.4) @@ -187,7 +169,6 @@ GEM racc (~> 1.4) nokogiri (1.18.3-x86_64-linux-musl) racc (~> 1.4) - ostruct (0.6.1) parallel (1.26.3) parser (3.3.7.1) ast (~> 2.4.1) @@ -306,13 +287,8 @@ GEM fugit (~> 1.11.0) railties (>= 7.1) thor (~> 1.3.1) - sshkit (1.24.0) - base64 - logger - net-scp (>= 1.1.2) - net-sftp (>= 2.1.2) - net-ssh (>= 2.8.0) - ostruct + spicy-proton (2.1.15) + bindata (~> 2.3) stimulus-rails (1.3.4) railties (>= 6.0.0) stringio (3.1.5) @@ -323,6 +299,9 @@ GEM thruster (0.1.12-x86_64-darwin) thruster (0.1.12-x86_64-linux) timeout (0.4.3) + toml-rb (3.0.1) + citrus (~> 3.0, > 3.0) + racc (~> 1.7) turbo-rails (2.0.13) actionpack (>= 7.1.0) railties (>= 7.1.0) @@ -366,7 +345,7 @@ DEPENDENCIES debug importmap-rails jbuilder - kamal + nanoid pg (~> 1.1) propshaft puma (>= 5.0) @@ -376,8 +355,10 @@ DEPENDENCIES solid_cable solid_cache solid_queue + spicy-proton stimulus-rails thruster + toml-rb turbo-rails tzinfo-data web-console diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index fe93333..e2dc060 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1,10 +1,82 @@ -/* - * This is a manifest file that'll be compiled into application.css. - * - * With Propshaft, assets are served efficiently without preprocessing steps. You can still include - * application-wide styles in this file, but keep in mind that CSS precedence will follow the standard - * cascading order, meaning styles declared later in the document or manifest will override earlier ones, - * depending on specificity. - * - * Consider organizing styles into separate files for maintainability. - */ +body { + font-family: sans-serif; + margin: 40px; +} + +header { + display: flex; + align-items: center; + gap: 3px; + margin-bottom: 10px; +} + +header h1 { + margin: 0; +} + +header .muted { + color: #666; + font-weight: normal; +} + +.new-buttons { + display: flex; + gap: 5px; +} + +.new-button { + padding: 10px; +} + +.nm-list { + +} + +.nm-list section { + margin-bottom: 5px; + display: grid; + grid-template-columns: .05fr 1fr 1fr .5fr; + align-items: center; + padding: 0 10px; + background-color: #eee; +} + +img { + vertical-align: middle; +} + +h3.nm-info { + margin: 0; + display: inline-block; +} + +.spawn-info { + display: inline-block; + font-size: 14px; + opacity: .6; +} + +.badge { + font-size: 12px; + font-weight: bold; + border: 1px solid black; + vertical-align: middle; + padding: 1px 6px; + border-radius: 10px; + font-family: monospace; +} + +small.badge { + font-size: 10px; +} + +button.action { + width: 100%; + height: 100%; +} + +section .meta { + padding-left: 10px; + padding-top: 4px; + padding-bottom: 4px; +} diff --git a/app/controllers/instance_controller.rb b/app/controllers/instance_controller.rb new file mode 100644 index 0000000..ae7cb55 --- /dev/null +++ b/app/controllers/instance_controller.rb @@ -0,0 +1,26 @@ +class InstanceController < ApplicationController + def create + zone = create_instance_params + public_id = Nanoid.generate(size: 6) + name = Spicy::Proton.pair(" ") + password = Nanoid.generate(size: 3, alphabet: "0123456789") + instance = Instance.new(zone: zone, public_id: public_id, name: name, password: password) + if instance.save + redirect_to(show_instance_path(public_id: public_id)) + end + end + + def show + @instance = Instance.find_by(public_id: show_instance_params) + end + + private + + def create_instance_params + params.expect(:zone) + end + + def show_instance_params + params.expect(:public_id) + end +end diff --git a/app/controllers/page_controller.rb b/app/controllers/page_controller.rb new file mode 100644 index 0000000..85ca14a --- /dev/null +++ b/app/controllers/page_controller.rb @@ -0,0 +1,4 @@ +class PageController < ApplicationController + def index + end +end diff --git a/app/helpers/instance_helper.rb b/app/helpers/instance_helper.rb new file mode 100644 index 0000000..212ddac --- /dev/null +++ b/app/helpers/instance_helper.rb @@ -0,0 +1,2 @@ +module InstanceHelper +end diff --git a/app/helpers/page_helper.rb b/app/helpers/page_helper.rb new file mode 100644 index 0000000..625cfe4 --- /dev/null +++ b/app/helpers/page_helper.rb @@ -0,0 +1,2 @@ +module PageHelper +end diff --git a/app/javascript/save_password.js b/app/javascript/save_password.js new file mode 100644 index 0000000..e69de29 diff --git a/app/models/instance.rb b/app/models/instance.rb new file mode 100644 index 0000000..f77247f --- /dev/null +++ b/app/models/instance.rb @@ -0,0 +1,3 @@ +class Instance < ApplicationRecord + validates :zone, inclusion: { in: %w[anemos pagos pyros hydatos] } +end diff --git a/app/views/instance/_zone_img.html.erb b/app/views/instance/_zone_img.html.erb new file mode 100644 index 0000000..6b695b2 --- /dev/null +++ b/app/views/instance/_zone_img.html.erb @@ -0,0 +1,9 @@ +<% if zone == "anemos" %> + <%= title=<%= title %> /> +<% elsif zone == "pagos" %> + <%= title=<%= title %> /> +<% elsif zone == "pyros" %> + <%= title=<%= title %> /> +<% elsif zone == "hydatos" %> + <%= title=<%= title %> /> +<% end %> diff --git a/app/views/instance/show.html.erb b/app/views/instance/show.html.erb new file mode 100644 index 0000000..8250cf9 --- /dev/null +++ b/app/views/instance/show.html.erb @@ -0,0 +1,40 @@ +
+ eureka.coffee logo +

instance <%= @instance.name %>

+ <%= render partial: "zone_img", locals: { zone: @instance.zone, alt: @instance.zone, title: @instance.zone.upcase_first } %> +
+ +
+ <% APP_DATA[@instance.zone.to_sym][:nms].each do |nm| %> +
+
+ " alt="<%= nm[:element] %>" width="30" /> +
+
+

+ LV<%= nm[:level].to_s.rjust(2, "0") %> + <%= nm[:name] %> + <% if nm[:weather] %> + + <% end %> +

+
+ « + <%= nm[:spawned_by][:name] %> + <% if nm[:spawned_by][:night_only] %> + 🌙 + <% end %> + <% if nm[:spawned_by][:weather] %> + + <% end %> + LV<%= nm[:spawned_by][:level].to_s.rjust(2, "0") %> + +
+
+
+
+ +
+
+ <% end %> +
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 5063f8d..bd8792a 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,7 +1,7 @@ - <%= content_for(:title) || "Ecoffee" %> + <%= content_for(:title) || "eureka.coffee" %> @@ -14,7 +14,6 @@ <%#= tag.link rel: "manifest", href: pwa_manifest_path(format: :json) %> - <%# Includes all stylesheet files in app/assets/stylesheets %> diff --git a/app/views/page/index.html.erb b/app/views/page/index.html.erb new file mode 100644 index 0000000..7751ece --- /dev/null +++ b/app/views/page/index.html.erb @@ -0,0 +1,34 @@ +
+ eureka.coffee logo +

eureka.coffee

+
+ +
+ <%= form_tag "/new?zone=anemos", method: :post do %> + + <% end %> + + <%= form_tag "/new?zone=pagos", method: :post do %> + + <% end %> + + <%= form_tag "/new?zone=pyros", method: :post do %> + + <% end %> + + <%= form_tag "/new?zone=hydatos", method: :post do %> + + <% end %> +
diff --git a/config/initializers/data.rb b/config/initializers/data.rb new file mode 100644 index 0000000..e534c94 --- /dev/null +++ b/config/initializers/data.rb @@ -0,0 +1,5 @@ +anemos_data = TomlRB.load_file("./data/anemos.toml", symbolize_keys: true) + +APP_DATA = { + anemos: anemos_data +} diff --git a/config/routes.rb b/config/routes.rb index 48254e8..8def87a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,14 +1,12 @@ Rails.application.routes.draw do - # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html + root "page#index" + + post "/new", to: "instance#create", as: :new_instance + get "/:public_id", to: "instance#show", as: :show_instance - # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500. - # Can be used by load balancers and uptime monitors to verify that the app is live. get "up" => "rails/health#show", as: :rails_health_check # Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb) # get "manifest" => "rails/pwa#manifest", as: :pwa_manifest # get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker - - # Defines the root path route ("/") - # root "posts#index" end diff --git a/data/anemos.toml b/data/anemos.toml new file mode 100644 index 0000000..19dfaa8 --- /dev/null +++ b/data/anemos.toml @@ -0,0 +1,232 @@ +[[nms]] +name = "Sabotender Corrido" +level = 1 +element = "wind" +x = 14 +y = 22 + +[nms.spawned_by] +name = "Flowering Sabotender" +level = 6 + +[[nms]] +name = "The Lord of Anemos" +level = 2 +element = "water" +x = 30 +y = 27 +drops = "The Prince of Anemos (minion)" + +[nms.spawned_by] +name = "Sea Bishop" +level = 7 + +[[nms]] +name = "Teles" +level = 3 +element = "wind" +x = 26 +y = 28 + +[nms.spawned_by] +name = "Anemos Harpeia" +level = 8 + +[[nms]] +name = "The Emperor of Anemos" +level = 4 +element = "wind" +x = 17 +y = 22 +drops = "Emperor Hairpin" + +[nms.spawned_by] +name = "Darner" +level = 9 + +[[nms]] +name = "Callisto" +level = 5 +element = "earth" +x = 26 +y = 22 + +[nms.spawned_by] +name = "Val Bear" +level = 10 + +[[nms]] +name = "Number" +level = 6 +element = "lightning" +x = 24 +y = 23 + +[nms.spawned_by] +name = "Pneumaflayer" +level = 11 + +[[nms]] +name = "Jahannam" +level = 7 +element = "wind" +x = 18 +y = 19 + +[nms.spawned_by] +name = "Typhoon Sprite" +level = 12 +weather = "gales" + +[[nms]] +name = "Amemet" +level = 8 +element = "fire" +x = 15 +y = 16 + +[nms.spawned_by] +name = "Abraxas" +level = 13 + +[[nms]] +name = "Caym" +level = 9 +element = "ice" +x = 14 +y = 13 + +[nms.spawned_by] +name = "Stalker Ziz" +level = 14 + +[[nms]] +name = "Bombadeel" +level = 10 +element = "earth" +x = 28 +y = 20 + +[nms.spawned_by] +name = "Traveling Gourmand" +level = 15 +night_only = true + +[[nms]] +name = "Serket" +level = 11 +element = "earth" +x = 25 +y = 18 +drops = "Scorpion Harness, Wind-up Mithra" + +[nms.spawned_by] +name = "Khor Claw" +level = 16 + +[[nms]] +name = "Judgmental Julika" +level = 12 +element = "ice" +x = 22 +y = 16 + +[nms.spawned_by] +name = "Henbane" +level = 17 + +[[nms]] +name = "The White Rider" +level = 13 +element = "lightning" +x = 20 +y = 13 + +[nms.spawned_by] +name = "Duskfall Dullahan" +level = 18 +night_only = true + +[[nms]] +name = "Polyphemus" +level = 14 +element = "ice" +x = 26 +y = 14 + +[nms.spawned_by] +name = "Monoeye" +level = 19 + +[[nms]] +name = "Simurgh's Strider" +level = 15 +element = "wind" +x = 29 +y = 13 +drops = "Strider Boots" + +[nms.spawned_by] +name = "Old World Zu" +level = 20 + +[[nms]] +name = "King Hazmat" +level = 16 +element = "fire" +x = 35 +y = 18 + +[nms.spawned_by] +name = "Anemos Anala" +level = 21 + +[[nms]] +name = "Fafnir" +level = 17 +element = "fire" +x = 36 +y = 22 +drops = "Wind-up Fafnir" + +[nms.spawned_by] +name = "Fossil Dragon" +level = 22 +night_only = true + +[[nms]] +name = "Amarok" +level = 18 +element = "ice" +x = 8 +y = 18 + +[nms.spawned_by] +name = "Voidscale" +level = 23 + +[[nms]] +name = "Lamashtu" +level = 19 +element = "wind" +x = 8 +y = 23 + +[nms.spawned_by] +name = "Val Specter" +level = 24 +night_only = true + +[[nms]] +name = "Pazuzu" +level = 20 +element = "wind" +x = 7 +y = 22 +weather = "gales" +drops = "Altar to Pazuzu, Pazuzu (card)" + +[nms.spawned_by] +name = "Shadow Wraith" +night_only = true +level = 25 diff --git a/db/migrate/20250310183139_create_instances.rb b/db/migrate/20250310183139_create_instances.rb new file mode 100644 index 0000000..883ad6c --- /dev/null +++ b/db/migrate/20250310183139_create_instances.rb @@ -0,0 +1,12 @@ +class CreateInstances < ActiveRecord::Migration[8.0] + def change + create_table :instances do |t| + t.string :public_id + t.string :name + t.string :password + t.string :zone + + t.timestamps + end + end +end diff --git a/db/migrate/20250310183556_create_pops.rb b/db/migrate/20250310183556_create_pops.rb new file mode 100644 index 0000000..5e49bce --- /dev/null +++ b/db/migrate/20250310183556_create_pops.rb @@ -0,0 +1,10 @@ +class CreatePops < ActiveRecord::Migration[8.0] + def change + create_table :pops do |t| + t.string :name + t.references :instance, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20250310183912_create_fairies.rb b/db/migrate/20250310183912_create_fairies.rb new file mode 100644 index 0000000..2898677 --- /dev/null +++ b/db/migrate/20250310183912_create_fairies.rb @@ -0,0 +1,12 @@ +class CreateFairies < ActiveRecord::Migration[8.0] + def change + create_table :fairies do |t| + t.integer :location + t.boolean :is_despawned + t.boolean :is_suggested + t.references :instance, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000..daf9152 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,46 @@ +# 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 `bin/rails +# db:schema:load`. When creating a new database, `bin/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[8.0].define(version: 2025_03_10_183912) do + # These are extensions that must be enabled in order to support this database + enable_extension "pg_catalog.plpgsql" + + create_table "fairies", force: :cascade do |t| + t.integer "location" + t.boolean "is_despawned" + t.boolean "is_suggested" + t.bigint "instance_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["instance_id"], name: "index_fairies_on_instance_id" + end + + create_table "instances", force: :cascade do |t| + t.string "public_id" + t.string "name" + t.string "password" + t.string "zone" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "pops", force: :cascade do |t| + t.string "name" + t.bigint "instance_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["instance_id"], name: "index_pops_on_instance_id" + end + + add_foreign_key "fairies", "instances" + add_foreign_key "pops", "instances" +end diff --git a/public/earth.png b/public/earth.png new file mode 100644 index 0000000..b20afe4 Binary files /dev/null and b/public/earth.png differ diff --git a/public/fire.png b/public/fire.png new file mode 100644 index 0000000..d91cf11 Binary files /dev/null and b/public/fire.png differ diff --git a/public/gales.png b/public/gales.png new file mode 100644 index 0000000..4eda59d Binary files /dev/null and b/public/gales.png differ diff --git a/public/ice.png b/public/ice.png new file mode 100644 index 0000000..a05e2f9 Binary files /dev/null and b/public/ice.png differ diff --git a/public/icon.png b/public/icon.png index c4c9dbf..cccd216 100644 Binary files a/public/icon.png and b/public/icon.png differ diff --git a/public/icon.svg b/public/icon.svg deleted file mode 100644 index 04b34bf..0000000 --- a/public/icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/lightning.png b/public/lightning.png new file mode 100644 index 0000000..5e827d2 Binary files /dev/null and b/public/lightning.png differ diff --git a/public/water.png b/public/water.png new file mode 100644 index 0000000..9b85e4a Binary files /dev/null and b/public/water.png differ diff --git a/public/wind.png b/public/wind.png new file mode 100644 index 0000000..9e2765d Binary files /dev/null and b/public/wind.png differ diff --git a/test/controllers/instance_controller_test.rb b/test/controllers/instance_controller_test.rb new file mode 100644 index 0000000..ac20d0a --- /dev/null +++ b/test/controllers/instance_controller_test.rb @@ -0,0 +1,13 @@ +require "test_helper" + +class InstanceControllerTest < ActionDispatch::IntegrationTest + test "should get create" do + get instance_create_url + assert_response :success + end + + test "should get show" do + get instance_show_url + assert_response :success + end +end diff --git a/test/controllers/page_controller_test.rb b/test/controllers/page_controller_test.rb new file mode 100644 index 0000000..38fa1c7 --- /dev/null +++ b/test/controllers/page_controller_test.rb @@ -0,0 +1,8 @@ +require "test_helper" + +class PageControllerTest < ActionDispatch::IntegrationTest + test "should get index" do + get page_index_url + assert_response :success + end +end diff --git a/test/fixtures/instances.yml b/test/fixtures/instances.yml new file mode 100644 index 0000000..d7a3329 --- /dev/null +++ b/test/fixtures/instances.yml @@ -0,0 +1,11 @@ +# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/instance_test.rb b/test/models/instance_test.rb new file mode 100644 index 0000000..818d755 --- /dev/null +++ b/test/models/instance_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class InstanceTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end