/ccclock

ccclock — cord cutters clock — is a clock for "cord cutters" who miss the always correct clock on their cable tv box.

Primary LanguageClojureBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

ccclock

ccclock — cord cutters clock — is a clock for "cord cutters" who miss the always correct clock on their cable tv box. Weather data is sourced from the everaging the OpenWeather API, and written in ClojureScript using: re-frame.

The current version is now powered by openweather.org and requires a free account and api key.

ccclock demo

Getting Started

Project Overview

Directory structure

Editor/IDE

Use your preferred editor or IDE that supports Clojure/ClojureScript development. See Clojure tools for some popular options.

Environment Setup

  1. Install JDK 8 or later (Java Development Kit)
  2. Install Node.js (JavaScript runtime environment) which should include NPM or if your Node.js installation does not include NPM also install it.
  3. Install Chrome or Chromium version 59 or later (headless test environment)
    • For Chromium, set the CHROME_BIN environment variable in your shell to the command that launches Chromium. For example, in Ubuntu, add the following line to your .bashrc:
      export CHROME_BIN=chromium-browser
  4. Install clj-kondo (linter)
  5. Clone this repo and open a terminal in the ccclock project root directory
  6. (Optional) Setup lint cache:
    clj-kondo --lint "$(npx shadow-cljs classpath)"
  7. Setup linting in your editor

Browser Setup

Browser caching should be disabled when developer tools are open to prevent interference with shadow-cljs hot reloading.

Custom formatters must be enabled in the browser before CLJS DevTools can display ClojureScript data in the console in a more readable way.

Chrome/Chromium

  1. Open DevTools (Linux/Windows: F12 or Ctrl-Shift-I; macOS: ⌘-Option-I)
  2. Open DevTools Settings (Linux/Windows: ? or F1; macOS: ? or Fn+F1)
  3. Select Preferences in the navigation menu on the left, if it is not already selected
  4. Under the Network heading, enable the Disable cache (while DevTools is open) option
  5. Under the Console heading, enable the Enable custom formatters option

Firefox

  1. Open Developer Tools (Linux/Windows: F12 or Ctrl-Shift-I; macOS: ⌘-Option-I)
  2. Open Developer Tools Settings (Linux/macOS/Windows: F1)
  3. Under the Advanced settings heading, enable the Disable HTTP Cache (when toolbox is open) option

Unfortunately, Firefox does not yet support custom formatters in their devtools. For updates, follow the enhancement request in their bug tracker: 1262914 - Add support for Custom Formatters in devtools.

Development

Running the API

cp config-dev-example.edn config-dev.edn

Edit the config values as necessary in the config-dev.edn; you will need a OpenWeather API key. Then start the api with the command below. See the following Emacs section to run the API live with hot-reloading of changes.

clj -M:run

Connecting to the REPL from Emacs with CIDER

Connect to the browser REPL:

M-x cider-jack-in

Evaluate restart-server to run the API in the REPL instead of runnning it via the commandline; re-evaluate this function to hot-reload any changes during development.

Running the UI

Start a temporary local web server, build the app with the dev profile, and serve the app, browser test runner and karma test runner with hot reload:

npm install
npx shadow-cljs watch app

Please be patient; it may take over 20 seconds to see any output, and over 40 seconds to complete.

When [:app] Build completed appears in the output, browse to http://localhost:8280/.

shadow-cljs will automatically push ClojureScript code changes to your browser on save. To prevent a few common issues, see Hot Reload in ClojureScript: Things to avoid.

Opening the app in your browser starts a ClojureScript browser REPL, to which you may now connect.

Connecting to the browser REPL from Emacs with CIDER

Connect to the browser REPL:

M-x cider-jack-in-cljs

See Shadow CLJS User's Guide: Emacs/CIDER for more information. Note that the mentioned .dir-locals.el file has already been created for you.

Connecting to the browser REPL from VS Code with Calva

See the re-frame-template README for Calva instuctions. See also https://calva.io for Calva documentation.

Connecting to the browser REPL from other editors

See Shadow CLJS User's Guide: Editor Integration. Note that npm run watch runs npx shadow-cljs watch for you, and that this project's running build ids is app, browser-test, karma-test, or the keywords :app, :browser-test, :karma-test in a Clojure context.

Alternatively, search the web for info on connecting to a shadow-cljs ClojureScript browser REPL from your editor and configuration.

For example, in Vim / Neovim with fireplace.vim

  1. Open a .cljs file in the project to activate fireplace.vim
  2. In normal mode, execute the Piggieback command with this project's running build id, :app:
    :Piggieback :app

Connecting to the browser REPL from a terminal

  1. Connect to the shadow-cljs nREPL:

    lein repl :connect localhost:8777

    The REPL prompt, shadow.user=>, indicates that is a Clojure REPL, not ClojureScript.

  2. In the REPL, switch the session to this project's running build id, :app:

    (shadow.cljs.devtools.api/nrepl-select :app)

    The REPL prompt changes to cljs.user=>, indicating that this is now a ClojureScript REPL.

  3. See user.cljs for symbols that are immediately accessible in the REPL without needing to require.

Running Tests

Build the app with the prod profile, start a temporary local web server, launch headless Chrome/Chromium, run tests, and stop the web server:

npm install
npm run ci

Please be patient; it may take over 15 seconds to see any output, and over 25 seconds to complete.

Or, for auto-reload:

npm install
npm run watch

Then in another terminal:

karma start

Running shadow-cljs Actions

See a list of shadow-cljs CLI actions:

npx shadow-cljs --help

Please be patient; it may take over 10 seconds to see any output. Also note that some actions shown may not actually be supported, outputting "Unknown action." when run.

Run a shadow-cljs action on this project's build id (without the colon, just app):

npx shadow-cljs <action> app

Debug Logging

The debug? variable in config.cljs defaults to true in dev builds, and false in prod builds.

Use debug? for logging or other tasks that should run only on dev builds:

(ns ccclock.example
  (:require [ccclock.config :as config])

(when config/debug?
  (println "This message will appear in the browser console only on dev builds."))

Updating Dependencies

Run clj -M:ancient to get a full report of both Clojure and ClojureScript dependencies.

Production

Building

Build the app with the prod profile:

./build-prod.sh

This script runs the following, which produces a jar file that runs the backend and serves up the frontend.

npm install && npm run release
CCCLOCK_ENV=prod clj -T:build uberjar

Running

Set OPENWEATHER_API_KEY=<your api key> in your production environment, and run the jar.

To run it manually in prod run the following.

OPENWEATHER_API_KEY=<your api key> java -jar target/ccclock-standalone.jar

Notes

To deploy to a raspberry pi, I recommend the following:

Your browser may sit with a "cannot load page" or other such error for a couple minutes if it opens before the jvm launches your jar.