Skip to content

Commit

Permalink
Journal: Author provides Entry#summary (#2161)
Browse files Browse the repository at this point in the history
- When zinc-collective#2, add an zinc-collective#10 so we can eventually display it when zinc-collective#4


* 🧹🥗 `Journal`: Add `Entry#summary` field (#8)

- zinc-collective#10

What I'm driving towards here is similar to
#2055, where a
`Journal::Entry` has an affordance for being opinionated about how it's
represented when linked to in search engines or peer-to-peer sharing; as
well as short text for when there are a several on `Journal#show`.

* 🛠️ `Journal`: Test only the `Journal in CI

While working on
zinc-collective#11, I realized I
missed a piece of the refactor because I was leaning-on-ci as a way to
confirm that everything was working as expected.

Little did I know, CI was not working in this fork. Which makes sense,
because you don't want to automatically turn on all the Workflows when
you fork a project.

This adds a Github Workflow for testing *just* the `Journal`, which
should make detecting oopsie-daisys a bit easier for folks who are only
interested in working on the Journal.

* 🥗 `Journal`: Test adding `Entry#summary` when Writing `Entries`

- zinc-collective#10
- zinc-collective#2

This is a quick line-of-action end-to-end test for setting an `Entry#summary`.

* ✨ `Journal`: Save `Entry#summary` when Writing `Entries`

- zinc-collective#2
- zinc-collective#10

And just like that, there's a `Summary` field on the
`Journal::Entry#new` page!
  • Loading branch information
zspencer authored Feb 3, 2024
1 parent d63ae3f commit 64cc4aa
Show file tree
Hide file tree
Showing 8 changed files with 200 additions and 1 deletion.
154 changes: 154 additions & 0 deletions .github/workflows/test-convene-journal.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
name: Test Journal
on: push

env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
# Connect to locally-running Maildev for tests
SMTP_PORT: 1025
SMTP_DOMAIN: localhost
SMTP_ENABLE_TLS: false
REDIS_HOST: redis
REDIS_PORT: 6379
HEADLESS: true

jobs:
setup:
name: Install and cache dependencies
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Update apt
env:
DEBIAN_FRONTEND: noninteractive
run:
sudo apt-get update -qq -o Acquire::Retries=3

- name: Install libvips
env:
DEBIAN_FRONTEND: noninteractive
run:
# we only need the library
sudo apt-get install --fix-missing -qq -o Acquire::Retries=3
libvips

- name: Setup Ruby and install gems
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Setup Node with cache
uses: actions/setup-node@v3
with:
node-version: 18
cache: 'yarn'

- name: Install Node dependencies
run: yarn install

test:
name: Run Tests
runs-on: ubuntu-latest
needs: [setup]

services:
postgres:
image: postgres:latest
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
# needed because the postgres container does not provide a healthcheck
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
redis:
image: redis
ports:
# Maps port 6379 on service container to the host
- 6379:6379
# Set health checks to wait until redis has started
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Update apt
env:
DEBIAN_FRONTEND: noninteractive
run:
sudo apt-get update -qq -o Acquire::Retries=3

- name: Install libvips
env:
DEBIAN_FRONTEND: noninteractive
run:
# we only need the library
sudo apt-get install --fix-missing -qq -o Acquire::Retries=3
libvips

- name: Install Firefox
uses: browser-actions/setup-firefox@latest

- name: Setup Ruby and install gems
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Setup Node with cache
uses: actions/setup-node@v3
with:
node-version: 18
cache: 'yarn'

- name: Allow Ruby process to access port 80
run: sudo setcap 'cap_net_bind_service=+ep' `which ruby`

- name: Setup CI database.yml
run: cp config/database.yml.github-actions config/database.yml

- name: Setup rails
run: bin/setup-rails && bin/rails assets:precompile

- name: Run Tests
env:
HEADLESS: true
run: bundle exec rspec spec/furniture/journal
- name: Upload RSpec Screenshots
uses: actions/upload-artifact@v2
if: failure()
with:
name: rspec-failed-screenshot
path: tmp/capybara/*.png

lint:
name: Run style checks
runs-on: ubuntu-latest
needs: [setup]

steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Setup Ruby and install gems
uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Setup Node with cache
uses: actions/setup-node@v3
with:
node-version: 18
cache: 'yarn'

- name: Install Node dependencies
run: yarn install

- run: bundle exec rubocop --parallel --config .rubocop.yml
- run: yarn prettier --check "./**/*.{scss,css,js}"
2 changes: 2 additions & 0 deletions app/furniture/journal/entries/_form.html.erb
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<%= form_with model: entry.location, class: "flex flex-col grow" do |f| %>
<%= render "text_field", { attribute: :headline, form: f} %>
<%= render "text_area", { attribute: :summary, form: f} %>
<%= render "text_area", { attribute: :body, form: f, field_classes: "grow", container_classes: "grow flex flex-col"} %>
<%= render "datetime_field", { attribute: :published_at, form: f} %>
Expand Down
3 changes: 3 additions & 0 deletions app/furniture/journal/entry.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ class Entry < ApplicationRecord

scope :matching_keywords, ->(keywords) { where("keywords::text[] && ARRAY[?]::text[]", keywords) }

SUMMARY_MAX_LENGTH = 300
validates :summary, length: {maximum: SUMMARY_MAX_LENGTH, allow_blank: true}

def migrate_to(journal:, keywords: [])
new_body = keywords.present? ? body + "\n##{keywords.join(" #")}" : body
update(journal: journal, body: new_body)
Expand Down
2 changes: 1 addition & 1 deletion app/furniture/journal/entry_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def update?
end

def permitted_attributes(_params)
%i[headline body published_at]
%i[headline summary body published_at]
end

class Scope < ApplicationScope
Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20240129014151_journal_add_description_to_entry.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class JournalAddDescriptionToEntry < ActiveRecord::Migration[7.1]
def change
add_column :journal_entries, :summary, :text
end
end
1 change: 1 addition & 0 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "keywords", array: true
t.text "summary"
t.index ["journal_id"], name: "index_journal_entries_on_journal_id"
end

Expand Down
4 changes: 4 additions & 0 deletions spec/furniture/journal/entry_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@
end
end

describe "#summary" do
it { is_expected.to validate_length_of(:summary).is_at_most(300).allow_blank }
end

describe "#save" do
let(:entry) { create(:journal_entry, body: "#GoodTimes") }
let(:journal) { entry.journal }
Expand Down
30 changes: 30 additions & 0 deletions spec/furniture/journal/writing_entries_system_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
require "rails_helper"

# @see https://github.com/zinc-collective/convene-journal/issues/2
RSpec.describe "Writing Entries", type: :system do
let(:space) { create(:space, :with_entrance, :with_members) }
let(:journal) { create(:journal, room: space.entrance) }

before do
sign_in(space.members.first, space)
end

it "saves the headline, summary and body" do # rubocop:disable RSpec/ExampleLength
visit(polymorphic_path(journal.location(:new, child: :entry)))

body = 1000.times.map { Faker::Books::Dune.quote }.join("\n\n")
fill_in("Headline", with: "1000 Dune Quotes")
fill_in("Body", with: body)
summary = %(
So you thought you wanted 1000 Dune Quotes?
Well, you were wrong. But here they are anyway!
)
fill_in("Summary", with: summary)

click_button("Create")
entry = journal.entries.last
expect(entry.headline).to eq("1000 Dune Quotes")
expect(entry.body).to eq(body)
expect(entry.summary).to eq(summary)
end
end

0 comments on commit 64cc4aa

Please sign in to comment.