{"id":15010666,"url":"https://github.com/illyasviel/sapphire","last_synced_at":"2025-05-13T03:30:46.736Z","repository":{"id":62434552,"uuid":"152675079","full_name":"illyasviel/sapphire","owner":"illyasviel","description":"A clojure declarative cache library inspired by Spring Cache and JCache.","archived":false,"fork":false,"pushed_at":"2019-09-07T02:31:01.000Z","size":53,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-19T00:34:56.413Z","etag":null,"topics":["cache","clojure","jcache"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/illyasviel.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-10-12T01:09:36.000Z","updated_at":"2024-04-27T14:36:15.000Z","dependencies_parsed_at":"2022-11-01T21:02:28.286Z","dependency_job_id":null,"html_url":"https://github.com/illyasviel/sapphire","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/illyasviel%2Fsapphire","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/illyasviel%2Fsapphire/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/illyasviel%2Fsapphire/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/illyasviel%2Fsapphire/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/illyasviel","download_url":"https://codeload.github.com/illyasviel/sapphire/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253867326,"owners_count":21976203,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cache","clojure","jcache"],"created_at":"2024-09-24T19:35:17.001Z","updated_at":"2025-05-13T03:30:46.394Z","avatar_url":"https://github.com/illyasviel.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sapphire\n\n[![Build Status](https://travis-ci.org/illyasviel/sapphire.svg?branch=master)](https://travis-ci.org/illyasviel/sapphire)\n[![Coverage Status](https://coveralls.io/repos/github/illyasviel/sapphire/badge.svg?branch=master)](https://coveralls.io/github/illyasviel/sapphire?branch=master)\n[![Clojars Project](https://img.shields.io/clojars/v/sapphire.svg)](https://clojars.org/sapphire)\n[![Dependencies Status](https://versions.deps.co/illyasviel/sapphire/status.svg)](https://versions.deps.co/illyasviel/sapphire)\n[![Downloads](https://versions.deps.co/illyasviel/sapphire/downloads.svg)](https://versions.deps.co/illyasviel/sapphire)\n[![License](http://img.shields.io/:license-apache-brightgreen.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)\n\nA clojure declarative cache library inspired by Spring Cache and JCache.\n\n## Feature\n\n- [JCache](https://jcp.org/en/jsr/detail?id=107) (JSR-107)\n  - [EhCache 3](http://www.ehcache.org/)\n  - [Caffeine](https://github.com/ben-manes/caffeine)\n  - Redis [(Redisson)](https://github.com/redisson/redisson)\n  - and more...\n\n## Usage\n\n-  Adding the following to your `:dependencies`\n\n```clojure\n[sapphire \"0.1.0-beta4\"]\n```\n\n- Currently we only support JCache, so you need to choose a provider\nand add it to your `:dependencies`\n\n```clojure\n[org.ehcache/ehcache \"3.7.0\"]\n```\n\n- Init cache\n\n```clojure\n(ns sapphire.example\n  (:require [sapphire.core :refer :all]\n            [sapphire.cache :as cache]))\n\n;; ehcache 3\n(cache/sapphire-init!\n  :cache-manager (cache/jcache-cache-manager-factory\n                   :fully-qualified-class-name \"org.ehcache.jsr107.EhcacheCachingProvider\"\n                   :config-file-path \"ehcache3.xml\")) ;; \u003c-- Provider also need a configuration file.\n```\n\n- Cache Result (`:cache-result`)\n\n```clojure\n(defcomponent find-user-by-id\n  \"The result is cacheable.\"\n  {:cache-result {:cache-name \"user\"}}\n  [id]\n  (prn \"Get from database..\"))\n;; =\u003e #'user/find-user-by-id\n(find-user-by-id 666)\n;; \"Get from database..\"\n;; =\u003e nil\n(find-user-by-id 666)\n;; =\u003e nil\n```\n\n- Cache Put (`:cache-put`)\n\n```clojure\n(defcomponent put-user-into-cache\n  \"Explicit put the data into cache.\"\n  {:cache-put {:cache-name \"user\", :key cache/first-param}}\n  [id user]\n  (prn \"Put the result into cache.\")\n  user)\n;; =\u003e #'user/put-user-into-cache\n(put-user-into-cache 777 {:username \"777\"})\n;; \"Put the result into cache.\"\n;; =\u003e {:username \"777\"}\n(find-user-by-id 777)\n;; =\u003e {:username \"777\"}\n```\n\n- Cache Remove By Key (`:cache-remove`)\n\n```clojure\n(defcomponent remove-user-from-cache\n  \"Remove data from cache.\"\n  {:cache-remove {:cache-name \"user\", :key cache/take-all-params}}\n  [id]\n  (prn \"Remove data from cache by id.\"))\n;; =\u003e #'user/remove-user-from-cache\n(remove-user-from-cache 777)\n;; \"Remove data from cache by id.\"\n;; =\u003e nil\n(find-user-by-id 777)\n;; \"Get from database..\"\n;; =\u003e nil\n```\n\n- Cache Remove All  (`:cache-remove-all`)\n\n```clojure\n(defcomponent remove-all-user-from-cache\n  \"Remove data from cache.\"\n  {:cache-remove-all {:cache-name \"user\"}}\n  []\n  (prn \"Remove all data from cache.\"))\n;; =\u003e #'user/remove-all-user-from-cache\n(remove-all-user-from-cache)\n;; \"Remove all data from cache.\"\n;; =\u003e nil\n(find-user-by-id 666)\n;; \"Get from database..\"\n;; =\u003e nil\n```\n\n- Default cache metadata  (`:cache-defaults`)\n\n```clojure\n(ns sapphire.example\n  \"You can offer default cache config for all cache components in current namespace.\"\n  {:cache-defaults {:cache-name \"user\"}}\n  (:require [sapphire.core :refer :all]\n            [sapphire.cache :as cache]))\n```\n\n- Keep sapphire metadata\n\nBy default, sapphire's metadata will not be retained.\nUnless you specify `:keep-sapphire-meta` on the current namespace **or** function.\n\n```clojure\n(ns sapphire.example\n  {:keep-sapphire-meta true}\n  (:require [sapphire.core :refer :all]\n            [sapphire.cache :as cache]))\n            \n(defcomponent keep-sapphire-metadata\n  {:keep-sapphire-meta true}\n  []\n  (prn \"Do something.\"))\n```\n\n## Documents\n\n### Macro\n\nMacro | Description\n----- | -----------\n`defcomponent` | Based on `clojure.core/defn` and has the same syntax. Put the sapphire metadata into attr-map.\n\n### Metadata\n\nMetadata Key | Description\n--- | ---\n\u003ca name=\"keep-sapphire-meta\"\u003e\u003ca/\u003e`:keep-sapphire-meta` | `true`. By default, sapphire's metadata will not be retained. Unless you specify `:keep-sapphire-meta` on the current namespace **or** function\n\u003ca name=\"cache-defaults\"\u003e\u003c/a\u003e`:cache-defaults` | `{}`. Specify the default cache config for current namespace.\n\u003ca name=\"cache-defaults-cache-name\"\u003e\u003c/a\u003e | `{:cache-name \"\"}`. Default cache name.\n\u003ca name=\"cache-defaults-key-generator\"\u003e\u003c/a\u003e | `{:key-generator func}`. Default key generator.\n\u003ca name=\"cache-result\"\u003e\u003c/a\u003e`:cache-result` | `{}`. Cache the result for current function by key.\n\u003ca name=\"cache-result-cache-name\"\u003e\u003c/a\u003e | `{:cache-name \"\"}`. Specify the cache name used to get cache from cache manager.\n\u003ca name=\"cache-result-key\"\u003e\u003c/a\u003e | `{:key func}`. Specify the function used to take params that will be passed to key generator.\n\u003ca name=\"cache-result-key-generator\"\u003e\u003c/a\u003e | `{:key-generator func}`. Specify the function used to generate key. `(key-generator (key args))`\n\u003ca name=\"cache-result-sync\"\u003e\u003c/a\u003e | `{:sync true}`. Synchronize the invocation of the underlying method if several threads are attempting to load a value for the same key. This is effectively a hint and the actual cache provider that you are using may not support it in a synchronized fashion.\n\u003ca name=\"cache-put\"\u003e\u003c/a\u003e`:cache-put` | `{}`. Explicitly put the result into cache by key.\n\u003ca name=\"cache-put-cache-name\"\u003e\u003c/a\u003e | `{:cache-name \"\"}`.\n\u003ca name=\"cache-put-key\"\u003e\u003c/a\u003e | `{:key func}`.\n\u003ca name=\"cache-put-key-generator\"\u003e\u003c/a\u003e | `{:key-generator func}`.\n\u003ca name=\"cache-remove\"\u003e\u003c/a\u003e`:cache-remove` | `{}`. Explicitly remove data from cache by key.\n\u003ca name=\"cache-remove-cache-name\"\u003e\u003c/a\u003e | `{:cache-name \"\"}`.\n\u003ca name=\"cache-remove-key\"\u003e\u003c/a\u003e | `{:key func}`.\n\u003ca name=\"cache-remove-key-generator\"\u003e\u003c/a\u003e | `{:key-generator func}`. \n\u003ca name=\"cache-remove-all\"\u003e\u003c/a\u003e`:cache-remove-all` | `{}`. Explicitly remove all data from cache.\n\u003ca name=\"cache-remove-all-cache-name\"\u003e\u003c/a\u003e | `{:cache-name \"\"}`.\nendAndKeepThisTableWidth | endAndKeepThisTableWidth\n\n### Built-in key func\n\nFunc | Description\n---- | -----------\n`cache/take-all-params` | The **default** key func, take all params as key.\n`cache/first-param` | Take the first param as key.\n`(cache/take-n-params n)` | Take n params as key.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fillyasviel%2Fsapphire","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fillyasviel%2Fsapphire","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fillyasviel%2Fsapphire/lists"}