{removeSync:remove} = require 'remove'
-MODULE_LINK = 'node_modules/kraken'
+MODULE_LINK = 'node_modules/limn'
task \link 'Link package source to node_modules so the name resolves correctly' ->
# Browser-based require doens't support relative requires, but things
- # like `require 'kraken/utils'` rarely work in node without this hack.
+ # like `require 'limn/utils'` rarely work in node without this hack.
mkdirp 'node_modules'
if exists MODULE_LINK
remove MODULE_LINK
invoke \setup
coco <[ -bjc package.co ]>
- {sources} = require 'kraken/server/view-helpers'
+ {sources} = require 'limn/server/view-helpers'
browserify = require 'browserify'
Coco = require 'coco'
Jade = require 'jade'
invoke \bundle_vendor
task \bundle_app 'Build application bundle' ->
- {sources} = require 'kraken/server/view-helpers'
+ {sources} = require 'limn/server/view-helpers'
- app_bundle_path = 'var/js/kraken/app-bundle.js'
+ app_bundle_path = 'var/js/limn/app-bundle.js'
app_sources = sources("www/modules.yaml", 'development')
.filter -> not _.startsWith it, '/vendor'
- .map -> it.slice 1 .replace /js\/kraken/, 'lib'
+ .map -> it.slice 1 .replace /js\/limn/, 'lib'
mkdirp dirname app_bundle_path
bundle_js app_bundle_path, app_sources, {-minify}
say 'ok.\n'
task \bundle_vendor 'Build vendor bundle' ->
- {sources} = require 'kraken/server/view-helpers'
+ {sources} = require 'limn/server/view-helpers'
vendor_bundle_path = 'var/vendor/vendor-bundle.js'
vendor_sources = sources("www/modules.yaml", 'development')
task \source_list 'Print a list of the source file paths.' ->
invoke \setup
- {sources} = require 'kraken/server/view-helpers'
+ {sources} = require 'limn/server/view-helpers'
say do
sources("www/modules.yaml", 'development')
.map -> it.slice 1
-# Kraken UI: WMF Analytics Reportcard prototype
+# Limn — a GUI Visualization Toolkit
-Setup instructions to be cleaned up momentarily. (brb lunch)
### Setting Up
name : 'limn'
version : '0.1.0'
-description : 'A charting toolkit and dashboard.'
+description : 'A GUI Visualization Toolkit'
homepage : 'https://github.com/wikimedia/limn'
-keywords : <[ visualization graph d3 util server client browser ]>
+keywords : <[ visualization graph gui d3 ]>
author : 'David Schoonover <dsc@wikimedia.org> (http://less.ly)'
contributors : [
'Andrew Otto <otto@wikimedia.org>'
{
"name": "limn",
"version": "0.1.0",
- "description": "A charting toolkit and dashboard.",
+ "description": "A GUI Visualization Toolkit",
"homepage": "https://github.com/wikimedia/limn",
"keywords": [
"visualization",
"graph",
- "d3",
- "util",
- "server",
- "client",
- "browser"
+ "gui",
+ "d3"
],
"author": "David Schoonover <dsc@wikimedia.org> (http://less.ly)",
"contributors": [
Backbone = require 'backbone'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
/**
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ ReadyEmitter,
-} = require 'kraken/util/event'
+} = require 'limn/util/event'
Backbone = require 'backbone'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
Backbone = require 'backbone'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseBackboneMixin, mixinBase,
-} = require 'kraken/base/base-mixin'
+} = require 'limn/base/base-mixin'
Backbone = require 'backbone'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseBackboneMixin, mixinBase,
-} = require 'kraken/base/base-mixin'
+} = require 'limn/base/base-mixin'
{ BaseModel,
-} = require 'kraken/base/base-mixin'
+} = require 'limn/base/base-mixin'
{ DataBinding,
-} = require 'kraken/base/data-binding'
+} = require 'limn/base/data-binding'
EventEmitter::trigger = EventEmitter::emit
{ _, op
-} = require 'kraken/util'
+} = require 'limn/util'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseModel, BaseList,
-} = require 'kraken/base/base-model'
+} = require 'limn/base/base-model'
-Cascade = require 'kraken/util/cascade'
+Cascade = require 'limn/util/cascade'
Backbone = require 'backbone'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
class exports.DataBinding
-exports.Base = require 'kraken/base/base'
-mixins = require 'kraken/base/base-mixin'
-models = require 'kraken/base/base-model'
-views = require 'kraken/base/base-view'
-cache = require 'kraken/base/model-cache'
-cascading = require 'kraken/base/cascading-model'
-data_binding = require 'kraken/base/data-binding'
+exports.Base = require 'limn/base/base'
+mixins = require 'limn/base/base-mixin'
+models = require 'limn/base/base-model'
+views = require 'limn/base/base-view'
+cache = require 'limn/base/model-cache'
+cascading = require 'limn/base/cascading-model'
+data_binding = require 'limn/base/data-binding'
exports import mixins import models import views \
import cache import cascading import data_binding
_ = require 'underscore'
Seq = require 'seq'
-{ReadyEmitter} = require 'kraken/util/event'
+{ReadyEmitter} = require 'limn/util/event'
# TODO: Bubble events to decorated emitters
-models = require 'kraken/base/scaffold/scaffold-model'
-views = require 'kraken/base/scaffold/scaffold-view'
+models = require 'limn/base/scaffold/scaffold-model'
+views = require 'limn/base/scaffold/scaffold-view'
exports import models import views
-_ = require 'kraken/util/underscore'
-op = require 'kraken/util/op'
+_ = require 'limn/util/underscore'
+op = require 'limn/util/op'
{ BaseModel, BaseList,
-} = require 'kraken/base'
+} = require 'limn/base'
-_ = require 'kraken/util/underscore'
-op = require 'kraken/util/op'
+_ = require 'limn/util/underscore'
+op = require 'limn/util/op'
{ BaseView,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Field, FieldList,
-} = require 'kraken/base/scaffold/scaffold-model'
+} = require 'limn/base/scaffold/scaffold-model'
FieldView = exports.FieldView = BaseView.extend do # {{{
Backbone = require 'backbone'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ ReadyEmitter,
-} = require 'kraken/util/event'
+} = require 'limn/util/event'
{ Parsers, ParserMixin,
-} = require 'kraken/util/parser'
+} = require 'limn/util/parser'
-chart_type = require 'kraken/chart/chart-type'
-chart_option = require 'kraken/chart/option'
-dygraphs = require 'kraken/chart/type/dygraphs'
-d3_chart = require 'kraken/chart/type/d3-chart'
-d3_elements = require 'kraken/chart/type/d3'
+chart_type = require 'limn/chart/chart-type'
+chart_option = require 'limn/chart/option'
+dygraphs = require 'limn/chart/type/dygraphs'
+d3_chart = require 'limn/chart/type/d3-chart'
+d3_elements = require 'limn/chart/type/d3'
exports import chart_type import chart_option \
import dygraphs import d3_chart import d3_elements
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ Parsers, ParserMixin, ParsingModel, ParsingView,
-} = require 'kraken/util/parser'
+} = require 'limn/util/parser'
{ BaseModel, BaseList,
-} = require 'kraken/base'
+} = require 'limn/base'
/**
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseView,
-} = require 'kraken/base'
+} = require 'limn/base'
{ ChartOption, ChartOptionList,
-} = require 'kraken/chart/option/chart-option-model'
+} = require 'limn/chart/option/chart-option-model'
DEBOUNCE_RENDER = exports.DEBOUNCE_RENDER = 100ms
ChartOptionView = exports.ChartOptionView = BaseView.extend do # {{{
tagName : 'section'
className : 'chart-option field'
- template : require 'kraken/template/chart/chart-option'
+ template : require 'limn/template/chart/chart-option'
type : 'string'
isCollapsed : true
__bind__ : <[ addField ]>
tagName : 'form'
className : 'chart-options scaffold'
- template : require 'kraken/template/chart/chart-scaffold'
+ template : require 'limn/template/chart/chart-scaffold'
collectionType : ChartOptionList
subviewType : ChartOptionView
-model = require 'kraken/chart/option/chart-option-model'
-view = require 'kraken/chart/option/chart-option-view'
+model = require 'limn/chart/option/chart-option-model'
+view = require 'limn/chart/option/chart-option-view'
exports import model import view
ColorBrewer = require 'colorbrewer'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ ChartType,
-} = require 'kraken/chart/chart-type'
+} = require 'limn/chart/chart-type'
{ D3ChartElement,
-} = require 'kraken/chart/type/d3/d3-chart-element'
+} = require 'limn/chart/type/d3/d3-chart-element'
root = do -> this
d3 = require 'd3'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ ChartType,
-} = require 'kraken/chart/chart-type'
+} = require 'limn/chart/chart-type'
root = do -> this
d3 = require 'd3'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ D3ChartElement
-} = require 'kraken/chart/type/d3/d3-chart-element'
+} = require 'limn/chart/type/d3/d3-chart-element'
-_fmt = require 'kraken/util/formatters'
+_fmt = require 'limn/util/formatters'
root = do -> this
ColorBrewer = require 'colorbrewer'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ ReadyEmitter,
-} = require 'kraken/util/event'
-# Base = require 'kraken/base/base'
+} = require 'limn/util/event'
+# Base = require 'limn/base/base'
root = do -> this
ColorBrewer = require 'colorbrewer'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ ChartType,
-} = require 'kraken/chart/chart-type'
+} = require 'limn/chart/chart-type'
ColorBrewer = require 'colorbrewer'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ D3ChartElement
-} = require 'kraken/chart/type/d3/d3-chart-element'
+} = require 'limn/chart/type/d3/d3-chart-element'
-_fmt = require 'kraken/util/formatters'
+_fmt = require 'limn/util/formatters'
root = do -> this
-d3chart = require 'kraken/chart/type/d3/d3-chart-element'
-line = require 'kraken/chart/type/d3/d3-line-element'
-bar = require 'kraken/chart/type/d3/d3-bar-element'
-# geo = require 'kraken/chart/type/d3/d3-geo-element'
+d3chart = require 'limn/chart/type/d3/d3-chart-element'
+line = require 'limn/chart/type/d3/d3-line-element'
+bar = require 'limn/chart/type/d3/d3-bar-element'
+# geo = require 'limn/chart/type/d3/d3-geo-element'
exports import line import bar import d3chart # import geo
-_ = require 'kraken/util/underscore'
+_ = require 'limn/util/underscore'
{ ChartType,
-} = require 'kraken/chart/chart-type'
+} = require 'limn/chart/chart-type'
class exports.DygraphsChartType extends ChartType
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseModel,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Graph, GraphList,
-} = require 'kraken/graph/graph-model'
+} = require 'limn/graph/graph-model'
/**
Seq = require 'seq'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseModel, BaseView,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Graph, GraphList, GraphDisplayView,
-} = require 'kraken/graph'
+} = require 'limn/graph'
{ Dashboard,
-} = require 'kraken/dashboard/dashboard-model'
+} = require 'limn/dashboard/dashboard-model'
/**
__bind__ : <[ addTab ]>
tagName : 'section'
className : 'dashboard'
- template : require 'kraken/template/dashboard/dashboard'
+ template : require 'limn/template/dashboard/dashboard'
events:
__bind__ : <[ ]>
className : 'tab-pane'
tag : 'div'
- template : require 'kraken/template/dashboard/dashboard-tab'
+ template : require 'limn/template/dashboard/dashboard-tab'
constructor: function DashboardTabView
-models = require 'kraken/dashboard/dashboard-model'
-views = require 'kraken/dashboard/dashboard-view'
+models = require 'limn/dashboard/dashboard-model'
+views = require 'limn/dashboard/dashboard-view'
exports import models import views
Seq = require 'seq'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseView, ViewList,
-} = require 'kraken/base'
+} = require 'limn/base'
{ DataSetView,
-} = require 'kraken/data/dataset-view'
+} = require 'limn/data/dataset-view'
{ MetricEditView,
-} = require 'kraken/data/metric-edit-view'
+} = require 'limn/data/metric-edit-view'
{ DataSource,
-} = require 'kraken/data/datasource-model'
+} = require 'limn/data/datasource-model'
/**
* @class DataSet selection and customization UI (root of the `data` tab).
__bind__ : <[ onMetricsChanged ]>
tagName : 'section'
className : 'data-ui'
- template : require 'kraken/template/data/data'
+ template : require 'limn/template/data/data'
datasources : null
ColorBrewer = require 'colorbrewer'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseModel, BaseList,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Metric, MetricList,
-} = require 'kraken/data/metric-model'
+} = require 'limn/data/metric-model'
{ DataSource, DataSourceList,
-} = require 'kraken/data/datasource-model'
+} = require 'limn/data/datasource-model'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseView,
-} = require 'kraken/base'
+} = require 'limn/base'
/**
DataSetView = exports.DataSetView = BaseView.extend do # {{{
tagName : 'section'
className : 'dataset-ui dataset'
- template : require 'kraken/template/data/dataset'
+ template : require 'limn/template/data/dataset'
events:
'click .new-metric-button' : 'onNewMetric'
DataSetMetricView = exports.DataSetMetricView = BaseView.extend do # {{{
tagName : 'tr'
className : 'dataset-metric metric'
- template : require 'kraken/template/data/dataset-metric'
+ template : require 'limn/template/data/dataset-metric'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ TimeSeriesData, CSVData,
-} = require 'kraken/util/timeseries'
+} = require 'limn/util/timeseries'
{ BaseModel, BaseList, ModelCache,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Metric, MetricList,
-} = require 'kraken/data/metric-model'
+} = require 'limn/data/metric-model'
/**
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseModel, BaseList, BaseView,
-} = require 'kraken/base'
+} = require 'limn/base'
/**
__bind__ : <[ ]>
tagName : 'section'
className : 'datasource-ui'
- template : require 'kraken/template/data/datasource-ui'
+ template : require 'limn/template/data/datasource-ui'
events :
'click .datasource-summary' : 'onHeaderClick'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseModel, BaseList, BaseView,
-} = require 'kraken/base'
+} = require 'limn/base'
/**
__bind__ : <[ ]>
tagName : 'section'
className : 'datasource'
- template : require 'kraken/template/data/datasource'
+ template : require 'limn/template/data/datasource'
-metric_model = require 'kraken/data/metric-model'
-metric_edit_view = require 'kraken/data/metric-edit-view'
-datasource_model = require 'kraken/data/datasource-model'
-datasource_view = require 'kraken/data/datasource-view'
-datasource_ui_view = require 'kraken/data/datasource-ui-view'
-dataset_model = require 'kraken/data/dataset-model'
-dataset_view = require 'kraken/data/dataset-view'
-data_view = require 'kraken/data/data-view'
+metric_model = require 'limn/data/metric-model'
+metric_edit_view = require 'limn/data/metric-edit-view'
+datasource_model = require 'limn/data/datasource-model'
+datasource_view = require 'limn/data/datasource-view'
+datasource_ui_view = require 'limn/data/datasource-ui-view'
+dataset_model = require 'limn/data/dataset-model'
+dataset_view = require 'limn/data/dataset-view'
+data_view = require 'limn/data/data-view'
exports import datasource_model import datasource_view import datasource_ui_view \
import dataset_model import dataset_view \
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseView,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Metric,
-} = require 'kraken/data/metric-model'
+} = require 'limn/data/metric-model'
{ DataSourceUIView,
-} = require 'kraken/data/datasource-ui-view'
+} = require 'limn/data/datasource-ui-view'
__bind__ : <[ onChange ]>
tagName : 'section'
className : 'metric-edit-ui'
- template : require 'kraken/template/data/metric-edit'
+ template : require 'limn/template/data/metric-edit'
callOnReturnKeypress : 'onChange'
events:
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseModel, BaseList,
-} = require 'kraken/base'
-ProjectColors = require 'kraken/data/project-colors'
+} = require 'limn/base'
+ProjectColors = require 'limn/data/project-colors'
DataSource = DataSourceList = null
### FIXME: LOLHACKS ###
setTimeout do
- -> { DataSource, DataSourceList, } := require 'kraken/data/datasource-model'
+ -> { DataSource, DataSourceList, } := require 'limn/data/datasource-model'
10
moment = require 'moment'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ Graph,
-} = require 'kraken/graph/graph-model'
+} = require 'limn/graph/graph-model'
{ GraphView,
-} = require 'kraken/graph/graph-view'
+} = require 'limn/graph/graph-view'
root = do -> this
GraphDisplayView = exports.GraphDisplayView = GraphView.extend do # {{{
tagName : 'section'
className : 'graph graph-display'
- template : require 'kraken/template/graph/graph-display'
+ template : require 'limn/template/graph/graph-display'
events:
# Select the whole permalink URI text when it receives focus.
moment = require 'moment'
-_ = require 'kraken/util/underscore'
+_ = require 'limn/util/underscore'
{ Graph,
-} = require 'kraken/graph/graph-model'
+} = require 'limn/graph/graph-model'
{ GraphView,
-} = require 'kraken/graph/graph-view'
+} = require 'limn/graph/graph-view'
{ ChartOptionScaffold, DEBOUNCE_RENDER,
-} = require 'kraken/chart'
+} = require 'limn/chart'
{ DataView, DataSetView, DataSet,
-} = require 'kraken/data'
+} = require 'limn/data'
root = do -> this
onFirstClickRenderOptionsTab onFirstClickRenderDataTab
]>
className : 'graph-edit graph'
- template : require 'kraken/template/graph/graph-edit'
+ template : require 'limn/template/graph/graph-edit'
events:
'click .redraw-button' : 'stopAndRender'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseView,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Graph, GraphList
-} = require 'kraken/graph/graph-model'
+} = require 'limn/graph/graph-model'
root = do -> this
DEBOUNCE_RENDER = 100ms
tagName : 'section'
className : 'graph-list-view'
- template : require 'kraken/template/graph/graph-list'
+ template : require 'limn/template/graph/graph-list'
data : {}
ready : false
Seq = require 'seq'
{ _, Cascade,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseModel, BaseList, ModelCache,
-} = require 'kraken/base'
+} = require 'limn/base'
{ ChartType,
-} = require 'kraken/chart'
+} = require 'limn/chart'
{ DataSet
-} = require 'kraken/data'
+} = require 'limn/data'
root = do -> this
moment = require 'moment'
-_ = require 'kraken/util/underscore'
+_ = require 'limn/util/underscore'
{ BaseView,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Graph,
-} = require 'kraken/graph/graph-model'
+} = require 'limn/graph/graph-model'
root = do -> this
DEBOUNCE_RENDER = 100ms
-models = require 'kraken/graph/graph-model'
-base_views = require 'kraken/graph/graph-view'
-display_views = require 'kraken/graph/graph-display-view'
-edit_views = require 'kraken/graph/graph-edit-view'
-index_views = require 'kraken/graph/graph-list-view'
+models = require 'limn/graph/graph-model'
+base_views = require 'limn/graph/graph-view'
+display_views = require 'limn/graph/graph-display-view'
+edit_views = require 'limn/graph/graph-edit-view'
+index_views = require 'limn/graph/graph-list-view'
exports import models import base_views import display_views import edit_views import index_views
Backbone = require 'backbone'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ AppView,
-} = require 'kraken/app'
+} = require 'limn/app'
{ BaseView, BaseModel, BaseList,
-} = require 'kraken/base'
+} = require 'limn/base'
{ ChartType, DygraphsChartType,
-} = require 'kraken/chart'
+} = require 'limn/chart'
{ Graph, GraphList, GraphDisplayView,
-} = require 'kraken/graph'
+} = require 'limn/graph'
{ DashboardView, Dashboard,
-} = require 'kraken/dashboard'
+} = require 'limn/dashboard'
root = this
Backbone = require 'backbone'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ AppView,
-} = require 'kraken/app'
+} = require 'limn/app'
{ BaseView, BaseModel, BaseList,
-} = require 'kraken/base'
+} = require 'limn/base'
{ ChartType, DygraphsChartType,
-} = require 'kraken/chart'
+} = require 'limn/chart'
{ Graph, GraphList, GraphDisplayView,
-} = require 'kraken/graph'
+} = require 'limn/graph'
root = this
Backbone = require 'backbone'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ AppView,
-} = require 'kraken/app'
+} = require 'limn/app'
{ BaseView, BaseModel, BaseList,
-} = require 'kraken/base'
+} = require 'limn/base'
{ ChartType,
-} = require 'kraken/chart'
+} = require 'limn/chart'
{ DataSource, DataSourceList,
-} = require 'kraken/data'
+} = require 'limn/data'
{ Graph, GraphList, GraphEditView,
-} = require 'kraken/graph'
+} = require 'limn/graph'
root = this
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseView, BaseModel, BaseList,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Graph, GraphList, GraphListView
-} = require 'kraken/graph'
+} = require 'limn/graph'
# instantiates a new GraphListView with the
# passed in JSON graph_list_data, and then
@map verb, subroute, @[method]
this
+
+ /**
+ * Boilerplate for creating a error-handling callback that otherwise returns JSON {result:'ok'}.
+ * @param {Response} res Express response object.
+ * @param {String} msg Error message to send on failure.
+ * @param {Number} [code=500] HTTP error code to send on failure.
+ * @returns {Function} Error-handling callback.
+ */
+ errorHandler: (res, msg, code=500) ->
+ (err) ->
+ if err
+ msg or= err.message or String(err)
+ console.error msg
+ res.send { result:"error", message:msg }, code
+ else
+ res.send { result:"ok" }
+
+
+ getClassName: ->
+ "#{@..name or @..displayName}"
+
toString: ->
- "#{@.constructor.name}('#{@name}', base='#{@base}', app=#{@app})"
+ "#{@getClassName()}(name='#{@name}')"
express.HTTPServer::controller = \
_ = require 'underscore'
Seq = require 'seq'
yaml = require 'js-yaml'
-{mkdirp, mkdirpAsync} = require '../mkdirp'
+{ mkdirp, mkdirpAsync,
+} = require '../mkdirp'
{ readJSONFilesAsync,
} = require '../files'
]>
PROTECT : true
- name : 'dashboards'
- dataDir : 'data/dashboards'
+ name : 'dashboards'
-> super ...
# if format is json, then return the dashboard JSON
switch req.format
case 'json'
- pattern = @dataDir + "/*.json"
+ pattern = "#{@dataDir}/*.json"
Seq()
# find list of data/dashboard/*.json files, send back the objects
.seq -> readJSONFilesAsync pattern, this
return unless data = @processBody req, res
file = @toFile data.id
if exists file
- return res.send { result:"error", message:"Dashboard '#{data.id}' already exists!" }
+ return res.send { result:"error", message:"Dashboard '#{data.id}' already exists!" }, 409 # 409: Resource Conflict
else
fs.writeFile file, JSON.stringify(data), "utf8", @errorHandler(res, "Error writing Dashboard!")
update: (req, res) ->
return unless data = @processBody req, res
if @PROTECT and _ @PROTECTED_IDS .contains data.id
- return res.send {result:"error", message:"Dashboard '#{data.id}' is read-only."}, 403
+ return res.send {result:"error", message:"Dashboard '#{data.id}' is read-only."}, 403 # 403: Forbidden
fs.writeFile @toFile(data.id), JSON.stringify(data), "utf8", @errorHandler(res, "Error writing Dashboard!")
# DELETE /dashboards/:dashboard
destroy: (req, res) ->
id = req.param.dashboard
if @PROTECT and _ @PROTECTED_IDS .contains id
- return res.send {result:"error", message:"Dashboard '#{id}' is read-only."}, 403
- fs.unlink @toFile(id), @errorHandler(res, "Dashboard '#{id}' does not exist!")
+ return res.send {result:"error", message:"Dashboard '#{id}' is read-only."}, 403 # 403: Forbidden
+ fs.unlink @toFile(id), @errorHandler(res, "Dashboard '#{id}' does not exist!", 410) # 410: Resource Gone
glob = require 'glob'
yaml = require 'js-yaml'
-{_, op} = require '../../util'
-{readFilesAsync} = require '../files'
-Controller = require '../controller'
+{_, op} = require '../../util'
+{readFilesAsync} = require '../files'
+Controller = require '../controller'
+FileBackedController = require '../file-controller'
EXT_PAT = /\.[^\.]*$/i
/**
- * @class Resource controller for graph requests.
+ * @class Resource controller for datasource requests.
*/
-class DataSourceController extends Controller
+class DataSourceController extends FileBackedController
name : 'datasources'
- dataDir : 'data/datasources'
+ dataDir : null
mapping :
all : 'allData'
-> super ...
+ toFile: @::toFileRecursive
- toFile: (id) -> "#{@dataDir}/#id.json"
-
- /**
- * Auto-load :id for related requests.
- */
- autoload: (id, cb) ->
- files = findit.sync @dataDir
- pattern = new RegExp "#id\.(json|ya?ml)$", "i"
- file = _.find files, -> pattern.test it
-
- unless file
- console.error "Unable to find DataSource for '#id'!"
- return cb new Error "Unable to find DataSource for '#id'!"
-
- if _.endsWith file, "#id.json"
- parser = JSON.parse
- if _.endsWith file, "#id.yaml"
- parser = yaml.load
-
- err, data <- fs.readFile file, 'utf8'
- if 'ENOENT' is err?.code
- console.error "Unable to find DataSource for '#id'!"
- return cb new Error "Unable to find DataSource for '#id'!"
- if err
- console.error "DataSourceController.autoload(#id, #{typeof cb}) -->\n", err
- return cb err
- try
- cb null, parser data
- catch err
- console.error "DataSourceController.autoload(#id, #{typeof cb}) -->\n", err
- cb err
-
- /**
- * GET /datasources
- * @returns {Object} JSON listing of the datasource metadata files.
- */
- index : (req, res, next) ->
- Seq()
- .seq glob, 'data/datasources/**/*.@(yaml|json)', {+nocase, +nosort}, Seq
- .filter -> YAML_OR_JSON_PAT.test it
- .map -> "#it".replace YAML_EXT_PAT, '.json'
- .seq -> res.send it
-
/**
* GET /datasources/:datasource
*/
# res.render 'datasource/view'
/**
+ * GET /datasources
+ * @returns {Object} JSON listing of the datasource metadata files.
+ */
+ index : (req, res, next) ->
+ Seq()
+ .seq glob, "#{@dataDir}/**/*.@(yaml|json)", {+nocase, +nosort}, Seq
+ .map -> "#it".replace YAML_EXT_PAT, '.json'
+ .seq -> res.send it
+
+ /**
* Returns the aggregated JSON content of the datasource metadata files.
*/
allData : (req, res, next) ->
data = {}
Seq()
- .seq glob, 'data/datasources/**/*.@(yaml|json)', {+nocase, +nosort}, Seq
+ .seq glob, "#{@dataDir}/**/*.@(yaml|json)", {+nocase, +nosort}, Seq
.seq (paths) -> readFilesAsync paths, this
.seq (txts) -> @ok _.items txts
.flatten false
# console.log "#f ok!", data
@ok v
catch err
- console.error "[/datasources] catch! #err"
+ console.error "[/datasources] Error parsing data!"
console.error err
console.error that if err.stack
- res.send { error:String(err), partial_data:data }
+ res.send { error:String(err), partial_data:data }, 500
.seq -> res.send data
.catch (err) ->
- console.error '[/datasources] catch!'
+ console.error '[/datasources] Error!'
console.error err
console.error that if err.stack
- res.send { error:String(err), partial_data:data }
+ res.send { error:String(err), partial_data:data }, 500
PROTECT_GRAPHS : true
name : 'graphs'
- dataDir : 'data/graphs'
- -> super ...
+ dataDir : null
+
+ ->
+ super ...
+ limnOpts = @app.set 'limn options'
+ @dataDir = "#{limnOpts.dataDir}/graphs"
# if format is json, then return the graph JSON
switch req.format
case 'json'
- pattern = @dataDir + "/*.json"
+ pattern = "#{@dataDir}/*.json"
Seq()
# find list of data/graph/*.json files, send back the objects
.seq -> readJSONFilesAsync pattern, this
return unless data = @processBody req, res
file = @toFile data.id
if exists file
- return res.send { result:"error", message:"Graph '#{data.id}' already exists!" }
+ return res.send { result:"error", message:"Graph '#{data.id}' already exists!" }, 409 # 409: Resource Conflict
else
fs.writeFile file, JSON.stringify(data), "utf8", @errorHandler(res, "Error writing graph!")
update: (req, res) ->
return unless data = @processBody req, res
if @PROTECT_GRAPHS and _ @PROTECTED_GRAPH_IDS .contains data.id
- return res.send {result:"error", message:"Graph '#{data.id}' is read-only."}, 403
+ return res.send {result:"error", message:"Graph '#{data.id}' is read-only."}, 403 # 403: Forbidden
fs.writeFile @toFile(data.id), JSON.stringify(data), "utf8", @errorHandler(res, "Error writing graph!")
# DELETE /graphs/:graph
destroy: (req, res) ->
id = req.param.graph
if @PROTECT_GRAPHS and _ @PROTECTED_GRAPH_IDS .contains id
- return res.send {result:"error", message:"Graph '#{id}' is read-only."}, 403
- fs.unlink @toFile(id), @errorHandler(res, "Graph '#{id}' does not exist!")
+ return res.send {result:"error", message:"Graph '#{id}' is read-only."}, 403 # 403: Forbidden
+ fs.unlink @toFile(id), @errorHandler(res, "Graph '#{id}' does not exist!", 410) # 410: Resource Gone
### Helpers
processBody: (req, res) ->
- if not req.body
- res.send {result:"error", message:"Data required!"}, 501
+ unless req.body
+ res.send {result:"error", message:"Data required!"}, 400 # 400: Bad Request
return false
data = req.body
data.slug or= data.id
- data.id or= data.slug
+ data.id or= data.slug
- if not data.slug
- res.send {result:"error", message:"Slug required!"}, 501
+ unless data.slug
+ res.send {result:"error", message:"Slug required!"}, 400 # 400: Bad Request
return false
- mkdirp @dataDir if not exists @dataDir
+ mkdirp @dataDir unless exists @dataDir
return data
- errorHandler: (res, msg) ->
- (err) ->
- if err
- msg or= err.message or String(err)
- console.error msg
- res.send { result:"error", message:msg }, 501
- else
- res.send { result:"ok" }
module.exports = exports = GraphController
fs = require 'fs'
path = require 'path'
-{existsSync:exists} = path
+exists = fs.existsSync or path.existsSync
_ = require 'underscore'
Seq = require 'seq'
yaml = require 'js-yaml'
-{mkdirp, mkdirpAsync} = require './mkdirp'
+{ mkdirp, mkdirpAsync,
+} = require './mkdirp'
{ readJSONFilesAsync,
} = require './files'
name : null
dataDir : null
+ noun : null
->
- @dataDir or= "data/#{@name}"
super ...
+ limnOpts = @app.set 'limn options'
+ @dataDir = "#{limnOpts.dataDir}/#{@name}"
+ @noun ?= @name.charAt(0).toUpperCase() + @name.slice(1)
/**
- * Override to customize lookup of files by ID.
+ * Look up the resource in the dataDir.
*
* @param {String} id ID of this resource.
* @returns {String} Path to file for this resource.
+ * @see toFileRecursive
*/
- toFile: (id) -> "#{@dataDir}/#id.json"
+ toFileFlat: (id) ->
+ return j if exists f = "#{@dataDir}/#id.json"
+ return y if exists y = "#{@dataDir}/#id.yaml"
+
+ /**
+ * Look up the resource by recursively searching the dataDir.
+ *
+ * @param {String} id ID of this resource.
+ * @returns {String} Path to file for this resource.
+ * @see toFileFlat
+ */
+ toFileRecursive: (id, cb) ->
+ files = glob "#{@dataDir}/**/#id.@(yaml|json)", {+nocase, +nosort, +sync}
+ files[0]
+
+ /**
+ * Function for looking up the filepath to a resource. Defaults to a recursive lookup;
+ * use `toFileFlat()` to only check the top-level directory.
+ */
+ toFile: @::toFileRecursive
/**
- * Auto-load :id for related requests.
+ * Auto-load :id for related requests by looking up the so-named file in the dataDir.
*
* @param {String} id ID of the resource.
* @param {Function} cb Callback to invoke with the loaded object.
*/
autoload: (id, cb) ->
- file = @toFile id
- parser = JSON.parse
+ parser = JSON.parse
+ file = @toFile id
- yamlFile = file.replace /\.json$/i, '.yaml'
- if exists yamlFile
- file = yamlFile
+ if _.endsWith file, "#id.yaml"
parser = yaml.load
err, data <- fs.readFile file, 'utf8'
if 'ENOENT' is err?.code
return cb null, {}
if err
- console.error "#{this}.autoload(#id, #{typeof cb}) -->\nerr"
+ console.error "#{this}.autoload(#id, #{typeof cb}) --> Error reading data!\n", err
return cb err
try
cb null, parser data
catch err
- console.error "#{this}.autoload(#id, #{typeof cb}) -->\nerr"
+ console.error "#{this}.autoload(#id, #{typeof cb}) --> Error parsing data!\n", err
cb err
+
+
### Helpers
processBody: (req, res) ->
- if not req.body
- res.send {result:"error", message:"Data required!"}, 501
+ unless req.body
+ res.send {result:"error", message:"Data required!"}, 400 # 400: Bad Request
return false
data = req.body
data.slug or= data.id
- data.id or= data.slug
+ data.id or= data.slug
- if not data.slug
- res.send {result:"error", message:"Slug required!"}, 501
+ unless data.slug
+ res.send {result:"error", message:"Slug required!"}, 400 # 400: Bad Request
return false
- mkdirp @dataDir if not exists @dataDir
+ mkdirp @dataDir unless exists @dataDir
return data
-
- errorHandler: (res, msg) ->
- (err) ->
- if err
- msg or= err.message or String(err)
- console.error msg
- res.send { result:"error", message:msg }, 501
- else
- res.send { result:"ok" }
module.exports = exports = FileBackedController
## Test Code
if require.main is module
files = exports
- u = require 'kraken/util/underscore'
+ u = require 'limn/util/underscore'
paths = <[ package.* deploy.sh ]>
files.readFilesAsync paths, (err, data) ->
if err then console.error err
else console.log '\n\n', global.data = u.map data, (txt, f) -> "#f: #{txt.length}"
- # u = require 'kraken/util/underscore'; files = require 'kraken/server/files'
+ # u = require 'limn/util/underscore'; files = require 'limn/server/files'
# files.readJSONFilesAsync 'data/**/*.json', files.logErrorsAnd()
* Limn project-internals
*/
BASE = dirname dirname __dirname
-DATA = "#BASE/data"
-LIB = "#BASE/llb"
+LIB = "#BASE/lib"
SRC = "#BASE/src"
STATIC = "#BASE/static"
-VAR = "#BASE/var"
WWW = "#BASE/www"
NODE_ENV = process.env.NODE_ENV or 'development'
IS_DEV = NODE_ENV is 'development'
IS_PROD = NODE_ENV is 'production'
-LOG_LEVEL = process.env.KRAKEN_LOG_LEVEL
+LOG_LEVEL = process.env.LIMN_LOG_LEVEL
LOG_LEVEL or= if IS_DEV then 'INFO' else 'WARN'
LOG_LEVEL .= toUpperCase()
-REV = process.env.KRAKEN_REV or 'HEAD'
+REV = process.env.LIMN_REV or 'HEAD'
try REV = require '../version' catch e
+/**
+ * Limn option defaults.
+ */
DEFAULT_OPTIONS =
- dataDir : './data' # Path to directory where data files should be written.
- # datasetDir : null # Path to a directory to statically serve as `/data` if present.
+ /**
+ * @name dataDir
+ * @type String
+ * Path to directory where data and metadata files are stored.
+ */
+ dataDir : './data'
+
+ /**
+ * @name varDir
+ * @type String
+ * Path to directory where derived files are written while in dev-mode.
+ */
+ varDir : './var'
+
+ /**
+ * @name proxy
+ * @type Object
+ */
proxy :
- enabled : false # Enables remote dataset proxy. If omitted, the proxy will be enabled if either `proxy.whitelist` or `proxy.blacklist` are set.
- whitelist : null # Array of domain patterns to whitelist for proxy. Strings are matched via glob-like syntax, but regular expressions may also be passed. If `proxy.enabled` is true but no whitelist is provided, it defaults to `['*']`.
- blacklist : null # Array of domain patterns to blacklist from proxying. Strings are matched via glob-like syntax, but regular expressions may also be passed.
+ /**
+ * @name enabled
+ * @type Boolean
+ * Enables remote dataset proxy. If omitted, the proxy will be enabled
+ * if either `proxy.whitelist` or `proxy.blacklist` are set.
+ */
+ enabled : false
+
+ /**
+ * @name whitelist
+ * @type Array<String|RegExp>
+ * Array of domain patterns to whitelist for proxy. Strings are matched
+ * via glob syntax, but regular expressions may also be passed.
+ * If `proxy.enabled` is true but no whitelist is provided, it defaults to `['*']`.
+ */
+ whitelist : null
+
+ /**
+ * @name blacklist
+ * @type Array<String|RegExp>
+ * Array of domain patterns to blacklist from proxying. Strings are matched
+ * via glob syntax, but regular expressions may also be passed.
+ */
+ blacklist : null
+
+ /**
+ * @name staticMaxAge
+ * @type Object
+ * Max-Age of static files served by Limn. Object is a hash from NODE_ENV to
+ * expiry time in miliseconds, with a special key "default" that does what you
+ * expect.
+ */
+ staticMaxAge :
+ default : 0
+ development : 0
+ production : 108_000_000_ms # set a one month max-age for static files
+
+/**
+ * Application pseudo-prototype (as we don't actually inherit from the Express server).
+ */
application = limn.application =
/**
version : REV
IS_DEV, IS_PROD
} import require './view-helpers'
-
# @helpers require './view-helpers'
# Parse URL, fiddle
# Route to the web services
@use @router
-
- # Browserify some deps
- @use require('browserify') do
- mount : '/vendor/browserify.js'
- require : <[ seq d3 events ]>
- cache : "#BASE/.cache/browserify/cache.json"
# production config
@configure 'production', ->
+ ### FIXME
+
# log all requests
@use express.logger()
- # set a one month max-age for static files
- @set 'static max age', 108_000_000_ms
-
# show simple errors
@use express.errorHandler()
# development config
@configure 'development', ->
- # show exceptions, pretty stack traces
+ opts = {varDir, dataDir} = @set 'limn options'
+
+ # show exceptions, pretty stack traces ### FIXME
@use express.errorHandler { +dumpExceptions, +showStack }
# turn on pretty-printing of views
@set('view options').pretty = true
+ # Browserify some deps
+ @use require('browserify') do
+ mount : '/vendor/browserify.js'
+ require : <[ seq d3 events ]>
+ cache : "#varDir/.cache/browserify/cache.json"
+
# import dev-only deps here, so prod users don't need them
compiler = require 'connect-compiler-extras'
# transparently recompile modules that have changed
- @use '/js/kraken', compiler do
+ @use '/js/limn', compiler do
enabled : 'coco'
src : SRC
- dest : "#VAR/js/kraken"
+ dest : "#varDir/js/limn"
log_level : LOG_LEVEL
@use compiler do
enabled : <[ jade-browser stylus yaml ]>
src : WWW
- dest : VAR
+ dest : varDir
options : stylus : { nib:true, include:"#WWW/css" }
log_level : LOG_LEVEL
@use compiler do
enabled : 'yaml'
- src : DATA
- dest : "#VAR/data"
+ src : dataDir
+ dest : "#varDir/data"
log_level : LOG_LEVEL
# wrap modules in commonjs closure for browser
@use compiler do
enabled : 'commonjs_define'
src : [ STATIC ]
- dest : VAR
+ dest : varDir
options :
commonjs : { drop_path_parts:1, drop_full_ext:false }
commonjs_define : { drop_path_parts:1, drop_full_ext:false }
log_level : LOG_LEVEL
@use compiler do
enabled : 'commonjs_define'
- src : [ VAR, WWW ]
- dest : VAR
+ src : [ varDir, WWW ]
+ dest : varDir
options :
commonjs : { drop_path_parts:1, drop_full_ext:true }
commonjs_define : { drop_path_parts:1, drop_full_ext:true }
# serve static files
@configure ->
- opts = @set('static file options') or {}
- @use express.static VAR, ^opts
- @use express.static WWW, ^opts
- @use express.static STATIC, ^opts
+ {staticMaxAge} = @set 'limn options'
+ maxAge = staticMaxAge[NODE_ENV] ? staticMaxAge.default
+
+ @use express.static varDir, {maxAge}
+ @use express.static WWW, {maxAge}
+ @use express.static STATIC, {maxAge}
YAML_EXT_PAT = /\.ya?ml$/i
@get '/datasources/all', (req, res, next) ->
+ opts = {varDir, dataDir} = @set 'limn options'
+
data = {}
Seq()
- .seq glob, 'data/datasources/**/*.@(yaml|json)', {+nocase, +nosort}, Seq
+ .seq glob, "#dataDir/datasources/**/*.@(yaml|json)", {+nocase, +nosort}, Seq
.seq (paths) -> readFilesAsync paths, this
.seq (txts) -> @ok _.items txts
.flatten false
# console.log "#f ok!", data
@ok v
catch err
- console.error "[/data/all] catch! #err"
+ console.error "[/datasources/all] Error parsing data!"
console.error err
console.error that if err.stack
- res.send { error:String(err), partial_data:data }
+ res.send { error:String(err), partial_data:data }, 500
.seq -> res.send data
.catch (err) ->
- console.error '[/data/all] catch!'
+ console.error '[/datasources/all] Error!'
console.error err
console.error that if err.stack
- res.send { error:String(err), partial_data:data }
+ res.send { error:String(err), partial_data:data }, 500
@controller require './controllers/datasource'
# proxy endpoint
if opts.proxy.enabled
- proxy = require('./proxy')({
- blacklist: opts.proxy.blacklist
- whitelist: opts.proxy.whitelist
- })
+ proxy = require('./proxy')(opts.proxy)
@get '/x', proxy
@get '/x/*', proxy
@get '/', (req, res) ->
res.render 'dashboard/view'
+ ### FIXME
@get '/geo', (req, res) ->
res.render 'geo'
+ ### FIXME?
@get '/:type/:action/?', (req, res, next) ->
{type, action} = req.params
if exists "#WWW/#type/#action.jade"
res.render "#type/#action"
else
next()
-
@get '/:type/?', (req, res, next) ->
{type} = req.params
if exists "#WWW/#type.jade"
mainfile = path.basename require.main?.filename
if require.main is module or 'Cokefile' is mainfile
PORT = 8081
- PORT = parseInt(that, 10) if process.env.KRAKEN_PORT
+ PORT = parseInt(that, 10) if process.env.LIMN_PORT
NODE_ENV = process.env.NODE_ENV or 'development'
- REV = process.env.KRAKEN_REV or 'HEAD'
+ REV = process.env.LIMN_REV or 'HEAD'
try REV = require '../version' catch e
err, stdout, stderr <- exec 'git rev-parse --short HEAD', {cwd:process.cwd(), env:process.env}
throw err if err
-SOURCES_ENV = if process.env.KRAKEN_FORCE_BUNDLES then 'production' else NODE_ENV
+SOURCES_ENV = if process.env.LIMN_FORCE_BUNDLES then 'production' else NODE_ENV
/**
* Reify a modules.yaml file
-_ = require 'kraken/util/underscore'
+_ = require 'limn/util/underscore'
/**
* @class A mapping of key-value pairs supporting key-aliases.
-_ = require 'kraken/util/underscore'
+_ = require 'limn/util/underscore'
hasOwn = ({}).hasOwnProperty
-exports.WaitingEmitter = require 'kraken/util/event/waiting-emitter'
-exports.ReadyEmitter = require 'kraken/util/event/ready-emitter'
+exports.WaitingEmitter = require 'limn/util/event/waiting-emitter'
+exports.ReadyEmitter = require 'limn/util/event/ready-emitter'
-Base = require 'kraken/base/base'
+Base = require 'limn/base/base'
/**
-Base = require 'kraken/base/base'
+Base = require 'limn/base/base'
/**
moment = require 'moment'
{ _, op,
-} = require 'kraken/util'
+} = require 'limn/util'
_fmt = do
-_ = exports._ = require 'kraken/util/underscore'
-op = exports.op = require 'kraken/util/op'
+_ = exports._ = require 'limn/util/underscore'
+op = exports.op = require 'limn/util/op'
# Root object -- `window` in the browser, `global` in Node.
root = exports.root = do -> this
jQuery(el)[method] ...args
-exports import require 'kraken/util/event'
+exports import require 'limn/util/event'
-backbone = exports.backbone = require 'kraken/util/backbone'
-parser = exports.parser = require 'kraken/util/parser'
-Cascade = exports.Cascade = require 'kraken/util/cascade'
+backbone = exports.backbone = require 'limn/util/backbone'
+parser = exports.parser = require 'limn/util/parser'
+Cascade = exports.Cascade = require 'limn/util/cascade'
-# HashSet = exports.HashSet = require 'kraken/util/hashset'
-# BitString = exports.BitString = require 'kraken/util/bitstring'
-# {crc32} = exports.{crc32} = require 'kraken/util/crc'
+# HashSet = exports.HashSet = require 'limn/util/hashset'
+# BitString = exports.BitString = require 'limn/util/bitstring'
+# {crc32} = exports.{crc32} = require 'limn/util/crc'
-_ = require 'kraken/util/underscore'
-op = require 'kraken/util/op'
+_ = require 'limn/util/underscore'
+op = require 'limn/util/op'
{ BaseModel, BaseList, BaseView, Mixin,
-} = require 'kraken/base'
+} = require 'limn/base'
/**
-_ = require 'kraken/util/underscore'
-TimeSeriesData = require 'kraken/util/timeseries/timeseries'
+_ = require 'limn/util/underscore'
+TimeSeriesData = require 'limn/util/timeseries/timeseries'
DASH_PATTERN = /-/g
-exports.TimeSeriesData = require 'kraken/util/timeseries/timeseries'
-exports.CSVData = require 'kraken/util/timeseries/csv'
+exports.TimeSeriesData = require 'limn/util/timeseries/timeseries'
+exports.CSVData = require 'limn/util/timeseries/csv'
-_ = require 'kraken/util/underscore'
+_ = require 'limn/util/underscore'
_.str = require 'underscore.string'
_.mixin _.str.exports()
-_.mixin require 'kraken/util/underscore/function'
-_.mixin require 'kraken/util/underscore/array'
-_.mixin require 'kraken/util/underscore/object'
-_.mixin require 'kraken/util/underscore/class'
-_.mixin require 'kraken/util/underscore/kv'
-_.mixin require 'kraken/util/underscore/string'
+_.mixin require 'limn/util/underscore/function'
+_.mixin require 'limn/util/underscore/array'
+_.mixin require 'limn/util/underscore/object'
+_.mixin require 'limn/util/underscore/class'
+_.mixin require 'limn/util/underscore/kv'
+_.mixin require 'limn/util/underscore/string'
## Debug
]>
-proxy = require('kraken/server/proxy')({
+proxy = require('limn/server/proxy')({
blacklist: PROXY_DOMAIN_BLACKLIST
whitelist: PROXY_DOMAIN_WHITELIST
})
assert = require 'assert'
-_ = require 'kraken/util/underscore'
-Cascade = require 'kraken/util/cascade'
+_ = require 'limn/util/underscore'
+Cascade = require 'limn/util/cascade'
assertArraysEqual = (actual, expected, name) ->
assert.deepEqual actual, expected
_ = require 'underscore'
assert = require 'assert'
-_.mixin require 'kraken/util/underscore/object'
+_.mixin require 'limn/util/underscore/object'
assertArraysEqual = (actual, expected, name) ->
d3 = require('d3')
Seq = require('seq')
Backbone = require('backbone')
- util = require('kraken/util'); _ = util._; op = util.op
- AppView = require('kraken/app').AppView
- base = require('kraken/base'); BaseView = base.BaseView; BaseModel = base.BaseModel; BaseList = base.BaseList
- ChartType = require('kraken/chart').ChartType
- data = require('kraken/data'); DataSource = data.DataSource; DataSourceList = data.DataSourceList
- _graph = require('kraken/graph'); Graph = _graph.Graph; GraphList = _graph.GraphList; GraphEditView = _graph.GraphEditView
- //LineChartType = require('kraken/chart/type/d3/d3-line-chart-type')
+ util = require('limn/util'); _ = util._; op = util.op
+ AppView = require('limn/app').AppView
+ base = require('limn/base'); BaseView = base.BaseView; BaseModel = base.BaseModel; BaseList = base.BaseList
+ ChartType = require('limn/chart').ChartType
+ data = require('limn/data'); DataSource = data.DataSource; DataSourceList = data.DataSourceList
+ _graph = require('limn/graph'); Graph = _graph.Graph; GraphList = _graph.GraphList; GraphEditView = _graph.GraphEditView
+ //LineChartType = require('limn/chart/type/d3/d3-line-chart-type')
// run on DOM-ready
jQuery(function(){
d3 = require('d3')
Seq = require('seq')
Backbone = require('backbone')
- util = require('kraken/util'); _ = util._; op = util.op
- AppView = require('kraken/app').AppView
- base = require('kraken/base'); BaseView = base.BaseView; BaseModel = base.BaseModel; BaseList = base.BaseList
- ChartType = require('kraken/chart').ChartType
- data = require('kraken/data'); DataSource = data.DataSource; DataSourceList = data.DataSourceList
- _graph = require('kraken/graph'); Graph = _graph.Graph; GraphList = _graph.GraphList; GraphEditView = _graph.GraphEditView
- //LineChartType = require('kraken/chart/type/d3/d3-line-chart-type')
+ util = require('limn/util'); _ = util._; op = util.op
+ AppView = require('limn/app').AppView
+ base = require('limn/base'); BaseView = base.BaseView; BaseModel = base.BaseModel; BaseList = base.BaseList
+ ChartType = require('limn/chart').ChartType
+ data = require('limn/data'); DataSource = data.DataSource; DataSourceList = data.DataSourceList
+ _graph = require('limn/graph'); Graph = _graph.Graph; GraphList = _graph.GraphList; GraphEditView = _graph.GraphEditView
+ //LineChartType = require('limn/chart/type/d3/d3-line-chart-type')
// run on DOM-ready
jQuery(function(){
d3 = require('d3')
Seq = require('seq')
Backbone = require('backbone')
- util = require('kraken/util'); _ = util._; op = util.op
- AppView = require('kraken/app').AppView
- base = require('kraken/base'); BaseView = base.BaseView; BaseModel = base.BaseModel; BaseList = base.BaseList
- ChartType = require('kraken/chart').ChartType
- data = require('kraken/data'); DataSource = data.DataSource; DataSourceList = data.DataSourceList
- _graph = require('kraken/graph'); Graph = _graph.Graph; GraphList = _graph.GraphList; GraphEditView = _graph.GraphEditView
- //LineChartType = require('kraken/chart/type/d3/d3-line-chart-type')
+ util = require('limn/util'); _ = util._; op = util.op
+ AppView = require('limn/app').AppView
+ base = require('limn/base'); BaseView = base.BaseView; BaseModel = base.BaseModel; BaseList = base.BaseList
+ ChartType = require('limn/chart').ChartType
+ data = require('limn/data'); DataSource = data.DataSource; DataSourceList = data.DataSourceList
+ _graph = require('limn/graph'); Graph = _graph.Graph; GraphList = _graph.GraphList; GraphEditView = _graph.GraphEditView
+ //LineChartType = require('limn/chart/type/d3/d3-line-chart-type')
// run on DOM-ready
jQuery(function(){
block main-scripts
- script(src="/js/kraken/main-dashboard.js?"+version)
+ script(src="/js/limn/main-dashboard.js?"+version)
mixin css('geo-display.css')
block main-scripts
- script(src="/js/kraken/main-geo.js?"+version)
+ script(src="/js/limn/main-geo.js?"+version)
block content
section.geo
mixin css('isotope.css')
block main-scripts
- script(src="/js/kraken/main-edit.js?"+version)
+ script(src="/js/limn/main-edit.js?"+version)
title Graph | Limn
block main-scripts
- script(src="/js/kraken/main-graph-list.js?"+version)
+ script(src="/js/limn/main-graph-list.js?"+version)
mixin css('graph-display.css')
block main-scripts
- script(src="/js/kraken/main-display.js?"+version)
+ script(src="/js/limn/main-display.js?"+version)
-_ = require 'kraken/util/underscore'
+_ = require 'limn/util/underscore'
config = tbody = null
script(src="/vendor/bootstrap.min.js")
script(src="/vendor/underscore.mod.js")
script(src="/vendor/underscore.string.mod.js")
- script(src="/js/kraken/util/underscore/array.mod.js")
- script(src="/js/kraken/util/underscore/object.mod.js")
- script(src="/js/kraken/util/underscore/kv.mod.js")
- script(src="/js/kraken/util/underscore/string.mod.js")
- script(src="/js/kraken/util/underscore/index.mod.js")
+ script(src="/js/limn/util/underscore/array.mod.js")
+ script(src="/js/limn/util/underscore/object.mod.js")
+ script(src="/js/limn/util/underscore/kv.mod.js")
+ script(src="/js/limn/util/underscore/string.mod.js")
+ script(src="/js/limn/util/underscore/index.mod.js")
script(src="numbers.js")
Backbone = require 'backbone'
{ _, op, Cascade,
-} = require 'kraken/util'
+} = require 'limn/util'
{ BaseView, BaseModel, BaseList,
-} = require 'kraken/base'
+} = require 'limn/base'
{ Field, FieldList, FieldView, Scaffold,
-} = require 'kraken/base/scaffold'
+} = require 'limn/base/scaffold'
{ ChartType, DygraphsChartType,
ChartOption, ChartOptionList, TagSet,
ChartOptionView, ChartOptionScaffold,
-} = require 'kraken/chart'
+} = require 'limn/chart'
{ GraphEditView, Graph, GraphList,
-} = require 'kraken/graph'
+} = require 'limn/graph'
root = this
- suffix: .js
paths:
- vendor/vendor-bundle.min
- - js/kraken/app-bundle
+ - js/limn/app-bundle
development:
- suffix: .js
- suffix: .mod.js
paths:
- js:
- - kraken:
+ - limn:
- template:
- chart:
- chart-option.jade
# - suffix: .js
# paths:
-# - js/kraken/main
+# - js/limn/main