{"id":20947879,"url":"https://github.com/chip/glimmer_dsl_with_active_record","last_synced_at":"2026-01-31T11:31:22.973Z","repository":{"id":244463292,"uuid":"815316873","full_name":"chip/glimmer_dsl_with_active_record","owner":"chip","description":"Example Glimmer DSL GUI app using ActiveRecord","archived":false,"fork":false,"pushed_at":"2024-07-12T17:02:24.000Z","size":413,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-13T02:48:17.760Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chip.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"support/active_record_rake_tasks.rb","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-14T20:59:10.000Z","updated_at":"2025-01-10T19:38:08.000Z","dependencies_parsed_at":"2025-03-01T12:39:59.492Z","dependency_job_id":null,"html_url":"https://github.com/chip/glimmer_dsl_with_active_record","commit_stats":null,"previous_names":["chip/glimmer_dsl_with_active_record"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/chip/glimmer_dsl_with_active_record","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chip%2Fglimmer_dsl_with_active_record","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chip%2Fglimmer_dsl_with_active_record/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chip%2Fglimmer_dsl_with_active_record/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chip%2Fglimmer_dsl_with_active_record/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chip","download_url":"https://codeload.github.com/chip/glimmer_dsl_with_active_record/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chip%2Fglimmer_dsl_with_active_record/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28940428,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T10:18:23.202Z","status":"ssl_error","status_checked_at":"2026-01-31T10:18:22.693Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-19T00:13:33.742Z","updated_at":"2026-01-31T11:31:22.968Z","avatar_url":"https://github.com/chip.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Example Glimmer DSL GUI app using ActiveRecord\n\nThis repository was originally created to satisfy my need for a kind of\nboilerplate using [Glimmer DSL](https://github.com/AndyObtiva/glimmer) with\n`ActiveRecord` as an ORM over a `sqlite3` database. At that time, I couldn't\nfind any resources on it. Since then, [Andy\nMaleh](https://github.com/AndyObtiva), [OSS Author of\nGlimmer](https://github.com/AndyObtiva/glimmer), reached out to me about his\npost, [Using ActiveRecord with SQLite DB in a JRuby Desktop\nApp](https://andymaleh.blogspot.com/2022/06/using-activerecord-with-sqlite-db-in.html).\nI decided to put together a tutorial to extend this idea further, including\nother migration tasks from `ActiveRecord::Tasks::DatabaseTask`, and an ability\nto run `rake db:seed` using the `SeedLoader`.\n\nIf you'd like to use this repository, just follow [Setup](#setup). Otherwise,\nfollow the [ALTERNATIVE APPROACH](#alternative-approach).\n\n![Demo](./assets/images/demo.png \"glimmer-dsl-libui app using ActiveRecord and sqlite3\")\n\n## Setup\n\n1. Clone repository\n2. Install dependencies: ``bundle install``\n3. Prepare database: ``rake db:prepare``\n4. Run app: ``glimmer run``\n\n## ALTERNATIVE APPROACH\n\n**Without using this repository**, just follow along with this tutorial.\n\n### Table of Contents\n\n- [Install Glimmer](#install-glimmer)\n- [Scaffold a Glimmer demo app](#scaffold-a-glimmer-demo-app)\n- [Commit remaining scaffolding](#commit-remaining-scaffolding)\n- [Add dependencies](#add-dependencies)\n- [Install dependencies](#install-dependencies)\n- [Add db directory](#add-db-directory)\n- [Add migration for contacts table](#add-migration-for-contacts-table)\n- [Add database configuration](#add-database-configuration)\n- [Add a SQLite database with ActiveRecord](#add-a-sqlite-database-with-activerecord)\n  - [Add shared methods for database access](#add-shared-methods-for-database-access)\n  - [Add database connection](#add-database-connection)\n- [Integrate DatabaseTasks with SeedLoader](#integrate-databasetasks-with-seedloader)\n- [Add rake tasks for ActiveRecord migrations](#add-rake-tasks-for-activerecord-migrations)\n- [Wire up ActiveRecord tasks in Rakefile](#wire-up-activerecord-tasks-in-rakefile)\n- [Verify rake tasks](#verify-rake-tasks)\n- [Prepare database](#prepare-database)\n- [Add Contact model](#add-contact-model)\n- [Add seed data](#add-seed-data)\n- [Import seed data](#import-seed-data)\n- [Update demo view](#update-demo-view)\n- [Run demo app](#run-demo-app)\n- [Troubleshooting](#troubleshooting)\n\n\n### Install Glimmer\n\nSee instructions at [glimmer-dsl-libui](https://github.com/AndyObtiva/glimmer-dsl-libui?tab=readme-ov-file#setup)\n\n### Scaffold a Glimmer demo app\n\n    glimmer \"scaffold[demo]\"\n    cd demo\n\n### Commit remaining scaffolding\n\nThis step is *optional*.\n\nGlimmer makes an initial git commit and leaves a dirty tree, so to clean it up...\n\n    git add .\n    git commit -m \"Add remaining scaffolding\"\n\n### Add dependencies\n\n*after `gem 'glimmer-dsl-libui'` line*\n\n```ruby\n# Gemfile\n\ngem 'activerecord', '~\u003e 7.1', '\u003e= 7.1.3.4'\ngem 'sqlite3', '~\u003e 1.4', force_ruby_platform: true\n```\n\n### Install dependencies\n\n    bundle install\n\n### Add db directory\n\n    mkdir -p db/migrate\n\n### Add migration for contacts table\n\n    touch db/migrate/20240708135100_create_contacts.rb\n\n```ruby\n# db/migrate/20240708135100_create_contacts.rb\n\nrequire 'active_record'\n\nclass CreateContacts \u003c ActiveRecord::Migration[7.1]\n  def change\n    create_table :contacts do |t|\n      t.string     :first_name\n      t.string     :last_name\n      t.string     :email\n      t.string     :phone\n      t.string     :street\n      t.string     :city\n      t.string     :state_or_province\n      t.string     :zip_or_postal_code\n      t.string     :country\n    end\n  end\nend\n```\n\n### Add database configuration\n\n    mkdir config\n    touch config/database.yml\n\n```ruby\n# config/database.yml\n\ndefault: \u0026default\n  adapter: sqlite3\n  pool: 5\n  timeout: 5000\n\ndevelopment:\n  \u003c\u003c: *default\n  database: db/demo.sqlite3\n\ntest:\n  \u003c\u003c: *default\n  database: db/test.sqlite3\n```\n\n### Add a SQLite database with ActiveRecord\n\n#### Add shared methods for database access\n\n    touch db/config.rb\n\n```ruby\n# db/config.rb\n\nclass Demo\n  module DB\n    module Config\n      def root\n        File.expand_path('../..', __FILE__)\n      end\n\n      def file\n        File.join(root, \"config/database.yml\")\n      end\n\n      def yaml\n        # aliases: true fixes Psych::AliasesNotEnabled exception\n        YAML.load_file(file, aliases: true)\n      end\n\n      def env\n        ENV['ENV'] || 'development'\n      end\n    end\n  end\nend\n```\n\n#### Add database connection\n\n    touch db/connection.rb\n\n```ruby\n# db/connection.rb\n\nrequire 'active_record'\nrequire_relative './config'\n\ninclude Demo::DB::Config\n\nActiveRecord::Base.configurations = Demo::DB::Config::yaml\nActiveRecord::Base.establish_connection(Demo::DB::Config::env.to_sym)\nActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)\n```\n\n### Integrate DatabaseTasks with SeedLoader\n\n    mkdir support\n    touch support/active_record_rake_tasks.rb\n\n### Add `rake` tasks for ActiveRecord migrations\n```ruby\n# support/active_record_rake_tasks.rb\n\nrequire_relative '../db/connection'\n\ninclude ActiveRecord::Tasks\n\nroot = Demo::DB::Config::root\n\nDatabaseTasks.root = root\nDatabaseTasks.db_dir = File.join(root, 'db')\nDatabaseTasks.migrations_paths = [File.join(root, 'db/migrate')]\nDatabaseTasks.database_configuration = Demo::DB::Config::yaml\n\n# The SeedLoader is Optional, if you don't want/need seeds you can skip setting it\nclass SeedLoader\n  def initialize(seed_file)\n    @seed_file = seed_file\n  end\n\n  def load_seed\n    load @seed_file if File.exist?(@seed_file)\n  end\nend\n\nDatabaseTasks.seed_loader = SeedLoader.new(File.join(root, 'db/seeds.rb'))\nDatabaseTasks.env = Demo::DB::Config::env\n\nload 'active_record/railties/databases.rake'\n```\n\n### Wire up ActiveRecord tasks in Rakefile\n```ruby\n# Rakefile\n\nrequire './support/active_record_rake_tasks'\n```\n\n### Verify rake tasks\n\n    rake -T\n\n### Add fix for \"Don't know how to build task 'environment'\" error\n\n```ruby\n# Rakefile\n\nRake::Task.define_task(:environment)\n```\n\n### Prepare database\n\n    rake db:prepare\n\n### Add Contact model\n\n    touch app/demo/model/contact.rb\n\n```ruby\n# app/demo/model/contact.rb\n\nclass Contact \u003c ActiveRecord::Base\nend\n```\n\n### Add seed data\n\n    touch db/seeds.rb\n    touch db/models.rb\n\n```ruby\n# db/models.rb\n\nmodel_dir = File.expand_path('../../app/demo/model', __FILE__)\nDir.glob(File.join(model_dir, '**', '*.rb')).each { |model| require model }\n```\n\n```ruby\n# db/seeds.rb\n\nrequire 'active_record'\nrequire_relative './connection'\nrequire_relative \"./models\"\n\nContact.create(first_name: 'Chip',\n               last_name: 'Castle',\n               email: 'chip@chipcastle.com',\n               phone: '555-555-5555',\n               street: 'Any street',\n               city: 'Inlet Beach',\n               state_or_province: 'FL',\n               zip_or_postal_code: '55555',\n               country: 'US')\n```\n\n### Import seed data\n\n     rake db:seed\n\n### Update demo view\n\nAt the top of the file, replace the `require 'demo/model/greeting'` with:\n\n```ruby\n# app/demo/view/demo.rb\n\nrequire 'demo/model/contact'\n```\n\nInside the `before_body` block, replace `@greeting = Model::Greeting.new` with:\n\n```ruby\n@contact = Contact.first\n```\n\nInside `def launch` method (after `margined true` line), remove the reference\nto the `@greeting` `form` `entry` and add the following code to verify\nActiveRecord:\n\n```ruby\nvertical_box {\n  form {\n    stretchy false\n\n    entry {\n      label 'First name'\n      text \u003c=\u003e [@contact, :first_name]\n    }\n    entry {\n      label 'Last name'\n      text \u003c=\u003e [@contact, :last_name]\n    }\n    entry {\n      label 'Email'\n      text \u003c=\u003e [@contact, :email]\n    }\n    entry {\n      label 'Phone'\n      text \u003c=\u003e [@contact, :phone]\n    }\n    entry {\n      label 'Street address'\n      text \u003c=\u003e [@contact, :street]\n    }\n    entry {\n      label 'City'\n      text \u003c=\u003e [@contact, :city]\n    }\n    entry {\n      label 'State/Province'\n      text \u003c=\u003e [@contact, :state_or_province]\n    }\n    entry {\n      label 'Zip/Postal code'\n      text \u003c=\u003e [@contact, :zip_or_postal_code]\n    }\n    entry {\n      label 'Country'\n      text \u003c=\u003e [@contact, :country]\n    }\n  }\n}\n```\n\n### Run demo app\n\n      glimmer run\n\n### Troubleshooting\n\n1. If you encounter a `Don't know how to build task environment` error, try adding this to the bottom of your `Rakefile`:\n\n```ruby\n# Rakefile\n\nRake::Task.define_task(:environment)\n```\n\n2. When an ActiveRecord::EnvironmentMismatchError exception is raised, run this from the shell:\n\n```ruby\n    rake db:environment:set ENV=development\n```\n\n3. Running `rake db:version` raises an `NameError: uninitialized constant Rails\n(NameError)` exception, which can be fixed with this hack (open to other suggestions, but I gotta move on.)\n\n```ruby\n# Rakefile\n\nclass Rails\n  def env\n    ENV['ENV'] || 'development'\n  end\nend\n```\n\n#### Copyright\n\nCopyright (c) 2024 Chip Castle. See LICENSE for further details.\n\n\u003c!--\n[SeedLoader example](https://jeremykreutzbender.com/blog/add-active-record-rake-tasks-to-gem)\n[Testing Rake task with Rspec with Rails environment](https://stackoverflow.com/questions/12686282/testing-rake-task-with-rspec-with-rails-environment) (via StackOverflow - Winston Kotzan's answer)\n--\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchip%2Fglimmer_dsl_with_active_record","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchip%2Fglimmer_dsl_with_active_record","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchip%2Fglimmer_dsl_with_active_record/lists"}