Skip to content
/ strf Public

Extensible string formatters & number parsers for Clojure/Clojurescript

License

Notifications You must be signed in to change notification settings

thi-ng/strf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

thi.ng/strf

Contents

About the project

Description

A small library providing composable, extensible string & date formatters and number parser helper functions for Clojure/Clojurescript. This library is the result of a thi.ng projectwide restructuring / dissolving of the thi.ng/common library.

Note: This library relies on the conditional reader syntax of recent Clojure & Clojurescript versions and therefore is not compatible with Clojure versions < 1.7.0

Current Leiningen coordinates

[thi.ng/strf "0.2.3"]

Example usage

(require '[thi.ng.strf.core :as f])

(f/parse-long "decafbad" 16)
;; 3737844653

(f/parse-int "w00t" 10 :fail)
;; :fail

(f/parse-float "3.1415926")
;; 3.1415926

(f/parse-float "w00t" :fail)
;; :fail

(f/format ["Rounded to 1/100th: " (f/float 2)] 3.1415926)
;; "Rounded to 1/100th: 3.14"

(f/format ["#" (f/hex 2) (f/hex 2) (f/hex 2)] 8 64 192)
;; "#0840c0"

(f/format-date (f/now))
;; "2015-05-23 01:43:21"

(f/format-date :mm-dd-yyyy (f/now))
;; "05/23/2015"

(keys f/date-formatters)
;; (:yyyy-mm-dd :yyyy-mm-dd-hh-mm-ss :dd-mm-yyyy :mm-dd-yyyy :dd-mm-yy :hh-mm-ss)

Namespaces

Tests

  • TBD

Project definition

Injected properties

0.2.3

Dependencies

Runtime

[org.clojure/clojure "1.11.1"]
[org.clojure/clojurescript "1.11.54"]

Development

[criterium "0.4.6"]
[com.cemerick/clojurescript.test "0.3.3"]
[lein-cljsbuild "1.1.8"]

Building this project

This project is written in a literate programming format and requires Emacs & Org-mode to generate usable source code. Assuming both tools are installed, the easiest way to generate a working project is via command line (make sure emacs is on your path or else edit its path in tangle.sh):

git clone https://github.com/thi.ng/strf.git
cd strf
./tangle.sh src/*.org test/*.org

Tangling is the process of extracting & combining source blocks from .org files into an actual working project/source tree. Once tangling is complete, you can cd into the generated project directory (babel) and then use lein as usual.

Testing

The project.clj file defines an alias to trigger a complete build & tests for both CLJ & CLJS versions.

cd babel
lein cleantest

To build the Clojurescript version simply run lein cljsbuild test from the same directory. A small HTML harness for the resulting JS file is also located in that folder (babel/index.html), allowing for further experimentation in the browser.

Working with the REPL

Editing code blocks or files in Org-mode, then re-loading & testing changes is quite trivial. Simply launch a REPL (via lein or Emacs) as usual. Everytime you’ve made changes to an .org file, re-tangle it from Emacs (C-c C-v t) or tangle.sh, then reload the namespace in the REPL via (require 'thi.ng.strf... :reload) or similar.

Leiningen project file

(defproject thi.ng/strf "<<version>>"
  :description  "Extensible CLJ/CLJS string formatting"
  :url          "<<project-url>>"
  :license      {:name "Apache Software License 2.0"
                 :url "http://www.apache.org/licenses/LICENSE-2.0"
                 :distribution :repo}
  :scm          {:name "git"
                 :url "[email protected]:thi-ng/strf.git"}

  :min-lein-vesion "2.4.0"
  
  :dependencies [<<dep-clj>>
                 <<dep-cljs>>]

  :source-paths ["src"]
  :test-paths   ["test"]

  :profiles     {:dev {:dependencies [<<dep-criterium>>]
                       :plugins [<<dep-cljsbuild>>
                                 <<dep-cljs-test>>]
                       :global-vars {*warn-on-reflection* true}
                       :jvm-opts ^:replace []
                       :aliases {"cleantest" ["do" "clean," "test," "cljsbuild" "test"]}
                }}

  :cljsbuild    {:builds [{:id "simple"
                           :source-paths ["src" "test"]
                           :compiler {:output-to "<<cljs-artefact-path>>"
                                      :optimizations :whitespace
                                      :pretty-print true}}]
                 :test-commands {"unit-tests" ["phantomjs" :runner "<<cljs-artefact-path>>"]}}

  :pom-addition [:developers [:developer
                              [:name "Karsten Schmidt"]
                              [:url "https://thi.ng"]
                              [:timezone "0"]]])

ClojureScript HTML harness

<!DOCTYPE html>
<html lang="en">
  <head>
    <title><<lein-coords>> test</title>
  </head>
  <body>
    <script type="text/javascript" src="<<cljs-artefact-path>>"></script>
  </body>
</html>

Accessing library version during runtime

The autogenerated namespace thi.ng.strf.version contains a single symbol version holding the version string defined above:

(use '[thi.ng.strf.version])

(prn version)
; "<<version>>"

Version namespace

Release history

VersionReleasedLein coordinatesDescriptionTagged Github URL
0.2.32022-04-23[thi.ng/strf "0.2.3"]update deps0.2.3
0.2.22016-02-28[thi.ng/strf "0.2.2"]bugfix float formatting for certain locales0.2.2
0.2.12015-08-30[thi.ng/strf "0.2.1"]bugfix rand-bits-hex0.2.1
0.2.02015-08-30[thi.ng/strf "0.2.0"]add date formats, UUIDv4 gen & hex formatters0.2.0
0.1.02015-05-25[thi.ng/strf "0.1.0"]initial test release0.1.0

Contributors

NameRoleWebsite
Karsten Schmidtinitiator & principal developerhttps://thi.ng

I’ve got a fairly detailed roadmap and task list to implement over the coming months, but am always happy to receive feedback & suggestions and have issues filed. Once the core engine is more refined I’ll be gladly welcoming other contributions. Thanks for understanding!

License

This project is open source and licensed under the Apache Software License 2.0.

About

Extensible string formatters & number parsers for Clojure/Clojurescript

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages