Enable caching on Github API accesses.

If GithubAPI::enable_cache is set to true then Github JSON responses will be cached locally using JsonStore.

Cache can be used to limit the number of access on the API and lighten the rate limit on your github key.

Usage:

var api = new GithubAPI(get_github_oauth)
api.enable_cache = true

var name = "nitlang/nit"
assert not api.has_cache(name)
var repo = api.get_repo(name) # load from GitHub
#assert api.has_cache(name) FIXME bring back this assert
repo = api.get_repo(name) # load from cache

api.clear_cache
assert not api.has_cache(name)

Redefined classes

redef class GithubAPI

github :: cache $ GithubAPI

Client to Github API

All class definitions

redef class GithubAPI

github :: cache $ GithubAPI

Client to Github API
package_diagram github::cache cache github::api api github::cache->github::api json::store store github::cache->json::store base64 base64 github::api->base64 curl curl github::api->curl json json github::api->json json::store->json ...base64 ... ...base64->base64 ...curl ... ...curl->curl ...json ... ...json->json github::github github github::github->github::cache github::wallet wallet github::wallet->github::github popcorn::pop_auth pop_auth popcorn::pop_auth->github::github github::wallet... ... github::wallet...->github::wallet popcorn::pop_auth... ... popcorn::pop_auth...->popcorn::pop_auth

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module abstract_text

core :: abstract_text

Abstract class for manipulation of sequences of characters
module array

core :: array

This module introduces the standard array structure.
module base64

base64 :: base64

Offers the base 64 encoding and decoding algorithms
module bitset

core :: bitset

Services to handle BitSet
module bytes

core :: bytes

Services for byte streams and arrays
module caching

serialization :: caching

Services for caching serialization engines
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collection

core :: collection

This module define several collection classes.
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module curl

curl :: curl

Data transfer powered by the native curl library
module engine_tools

serialization :: engine_tools

Advanced services for serialization engines
module environ

core :: environ

Access to the environment variables of the process
module error

json :: error

Intro JsonParseError which is exposed by all JSON reading APIs
module error

core :: error

Standard error-management infrastructure.
module exec

core :: exec

Invocation and management of operating system sub-processes.
module file

core :: file

File manipulations (create, read, write, etc.)
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

core :: flat

All the array-based text representations
module gc

core :: gc

Access to the Nit internal garbage collection mechanism
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module inspect

serialization :: inspect

Refine Serializable::inspect to show more useful information
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module json

json :: json

Read and write JSON formatted text using the standard serialization services
module kernel

core :: kernel

Most basic classes and methods.
module list

core :: list

This module handle double linked lists
module math

core :: math

Mathematical operations
module meta

meta :: meta

Simple user-defined meta-level to manipulate types of instances as object.
module native

core :: native

Native structures for text and bytes
module native_curl

curl :: native_curl

Binding of C libCurl which allow us to interact with network.
module numeric

core :: numeric

Advanced services for Numeric types
module parser_base

parser_base :: parser_base

Simple base for hand-made parsers of all kinds
module poset

poset :: poset

Pre order sets and partial order set (ie hierarchies)
module protocol

core :: protocol

module queue

core :: queue

Queuing data structures and wrappers
module range

core :: range

Module for range of discrete objects.
module re

core :: re

Regular expression support for all services based on Pattern
module ropes

core :: ropes

Tree-based representation of a String.
module safe

serialization :: safe

Services for safer deserialization engines
module serialization

serialization :: serialization

General serialization services
module serialization_core

serialization :: serialization_core

Abstract services to serialize Nit objects to different formats
module serialization_read

json :: serialization_read

Services to read JSON: deserialize_json and JsonDeserializer
module serialization_write

json :: serialization_write

Services to write Nit objects to JSON strings: serialize_to_json and JsonSerializer
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module static

json :: static

Static interface to read Nit objects from JSON strings
module stream

core :: stream

Input and output streams of characters
module text

core :: text

All the classes and methods related to the manipulation of text entities
module time

core :: time

Management of time and dates
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure
module utf8

core :: utf8

Codec for UTF-8 I/O

Parents

module api

github :: api

Nit object oriented interface to Github api.
module store

json :: store

Store and load json data.

Children

module github

github :: github

Nit wrapper for Github API

Descendants

module a_star-m

a_star-m

module api

nitc :: api

Components required to build a web server about the nit model.
module api_auth

nitc :: api_auth

module api_feedback

nitc :: api_feedback

Feedback related features
module loader

github :: loader

module nitweb

nitc :: nitweb

Runs a webserver based on nitcorn that render things from model.
module pop_auth

popcorn :: pop_auth

Authentification handlers.
module wallet

github :: wallet

Github OAuth tokens management
# Enable caching on Github API accesses.
#
# If `GithubAPI::enable_cache` is set to true then Github JSON responses
# will be cached locally using `JsonStore`.
#
# Cache can be used to limit the number of access on the API and lighten
# the rate limit on your github key.
#
# Usage:
#
# ~~~
# var api = new GithubAPI(get_github_oauth)
# api.enable_cache = true
#
# var name = "nitlang/nit"
# assert not api.has_cache(name)
# var repo = api.get_repo(name) # load from GitHub
# #assert api.has_cache(name) FIXME bring back this assert
# repo = api.get_repo(name) # load from cache
#
# api.clear_cache
# assert not api.has_cache(name)
# ~~~
module cache

intrude import github::api
import json::store

redef class GithubAPI

	# Enable caching for this client.
	# Default is `false`.
	var enable_cache = false is writable

	# JsonStore used to cache data.
	#
	# Default directory is `".github_data/"`.
	var store = new JsonStore(".github_data/") is writable, lazy

	# Delete the cache directory.
	fun clear_cache do store.clear

	# If no cache data is found for `key` then json is loaded from Github API.
	redef fun get(key, headers, data) do
		if not enable_cache then return super
		if store.has_key(key) then
			# print "Get {key} (cache)" # debug
			was_error = false
			return deserialize(store.load_object(key).to_json)
		end
		var obj = super
		if not was_error and obj isa Serializable then
			cache(key, obj)
		end
		return obj
	end

	# Save `json` data in cache under `key`.
	private fun cache(key: String, obj: Serializable) do
		# print "Cache key {key}" # debug
		store.store_object(key, obj.to_json.parse_json.as(JsonObject))
	end

	# Check if a cache file exists for `key`.
	fun has_cache(key: String): Bool do
		return store.has_key(key)
	end
end
lib/github/cache.nit:15,1--82,3