app_config 0.7.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/.rspec +1 -0
- data/Gemfile.lock +25 -13
- data/README.md +97 -0
- data/Rakefile +16 -18
- data/app_config.gemspec +9 -5
- data/lib/app_config/base.rb +16 -53
- data/lib/app_config/storage/base.rb +16 -6
- data/lib/app_config/storage/mongo.rb +7 -13
- data/lib/app_config/storage/yaml.rb +5 -10
- data/lib/app_config/storage.rb +0 -1
- data/lib/app_config.rb +18 -16
- data/lib/core_ext/hashish.rb +17 -21
- data/spec/app_config/storage/mongo_spec.rb +11 -3
- data/spec/app_config/storage/yaml_spec.rb +2 -7
- data/spec/app_config/storage_spec.rb +0 -5
- data/spec/app_config_spec.rb +1 -3
- data/spec/core_ext/hashish_spec.rb +1 -1
- data/spec/spec_helper.rb +12 -12
- metadata +84 -22
- data/README.rdoc +0 -119
- data/doc/js/darkfish.js +0 -116
- data/doc/js/jquery.js +0 -32
- data/doc/js/quicksearch.js +0 -114
- data/doc/js/thickbox-compressed.js +0 -10
- data/lib/app_config/storage/sqlite.rb +0 -62
- data/spec/watchr.rb +0 -28
data/doc/js/quicksearch.js
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
*
|
3
|
-
* JQuery QuickSearch - Hook up a form field to hide non-matching elements.
|
4
|
-
* $Id: quicksearch.js 53 2009-01-07 02:52:03Z deveiant $
|
5
|
-
*
|
6
|
-
* Author: Michael Granger <mgranger@laika.com>
|
7
|
-
*
|
8
|
-
*/
|
9
|
-
jQuery.fn.quicksearch = function( target, searchElems, options ) {
|
10
|
-
// console.debug( "Quicksearch fn" );
|
11
|
-
|
12
|
-
var settings = {
|
13
|
-
delay: 250,
|
14
|
-
clearButton: false,
|
15
|
-
highlightMatches: false,
|
16
|
-
focusOnLoad: false,
|
17
|
-
noSearchResultsIndicator: null
|
18
|
-
};
|
19
|
-
if ( options ) $.extend( settings, options );
|
20
|
-
|
21
|
-
return jQuery(this).each( function() {
|
22
|
-
// console.debug( "Creating a new quicksearch on %o for %o", this, searchElems );
|
23
|
-
new jQuery.quicksearch( this, searchElems, settings );
|
24
|
-
});
|
25
|
-
};
|
26
|
-
|
27
|
-
|
28
|
-
jQuery.quicksearch = function( searchBox, searchElems, settings ) {
|
29
|
-
var timeout;
|
30
|
-
var boxdiv = $(searchBox).parents('div').eq(0);
|
31
|
-
|
32
|
-
function init() {
|
33
|
-
setupKeyEventHandlers();
|
34
|
-
focusOnLoad();
|
35
|
-
};
|
36
|
-
|
37
|
-
function setupKeyEventHandlers() {
|
38
|
-
// console.debug( "Hooking up the 'keypress' event to %o", searchBox );
|
39
|
-
$(searchBox).
|
40
|
-
unbind( 'keyup' ).
|
41
|
-
keyup( function(e) { return onSearchKey( e.keyCode ); });
|
42
|
-
$(searchBox).
|
43
|
-
unbind( 'keypress' ).
|
44
|
-
keypress( function(e) {
|
45
|
-
switch( e.which ) {
|
46
|
-
// Execute the search on Enter, Tab, or Newline
|
47
|
-
case 9:
|
48
|
-
case 13:
|
49
|
-
case 10:
|
50
|
-
clearTimeout( timeout );
|
51
|
-
e.preventDefault();
|
52
|
-
doQuickSearch();
|
53
|
-
break;
|
54
|
-
|
55
|
-
// Allow backspace
|
56
|
-
case 8:
|
57
|
-
return true;
|
58
|
-
break;
|
59
|
-
|
60
|
-
// Only allow valid search characters
|
61
|
-
default:
|
62
|
-
return validQSChar( e.charCode );
|
63
|
-
}
|
64
|
-
});
|
65
|
-
};
|
66
|
-
|
67
|
-
function focusOnLoad() {
|
68
|
-
if ( !settings.focusOnLoad ) return false;
|
69
|
-
$(searchBox).focus();
|
70
|
-
};
|
71
|
-
|
72
|
-
function onSearchKey ( code ) {
|
73
|
-
clearTimeout( timeout );
|
74
|
-
// console.debug( "...scheduling search." );
|
75
|
-
timeout = setTimeout( doQuickSearch, settings.delay );
|
76
|
-
};
|
77
|
-
|
78
|
-
function validQSChar( code ) {
|
79
|
-
var c = String.fromCharCode( code );
|
80
|
-
return (
|
81
|
-
(c == ':') ||
|
82
|
-
(c >= 'a' && c <= 'z') ||
|
83
|
-
(c >= 'A' && c <= 'Z')
|
84
|
-
);
|
85
|
-
};
|
86
|
-
|
87
|
-
function doQuickSearch() {
|
88
|
-
var searchText = searchBox.value;
|
89
|
-
var pat = new RegExp( searchText, "im" );
|
90
|
-
var shownCount = 0;
|
91
|
-
|
92
|
-
if ( settings.noSearchResultsIndicator ) {
|
93
|
-
$('#' + settings.noSearchResultsIndicator).hide();
|
94
|
-
}
|
95
|
-
|
96
|
-
// All elements start out hidden
|
97
|
-
$(searchElems).each( function(index) {
|
98
|
-
var str = $(this).text();
|
99
|
-
|
100
|
-
if ( pat.test(str) ) {
|
101
|
-
shownCount += 1;
|
102
|
-
$(this).fadeIn();
|
103
|
-
} else {
|
104
|
-
$(this).hide();
|
105
|
-
}
|
106
|
-
});
|
107
|
-
|
108
|
-
if ( shownCount == 0 && settings.noSearchResultsIndicator ) {
|
109
|
-
$('#' + settings.noSearchResultsIndicator).slideDown();
|
110
|
-
}
|
111
|
-
};
|
112
|
-
|
113
|
-
init();
|
114
|
-
};
|
@@ -1,10 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Thickbox 3 - One Box To Rule Them All.
|
3
|
-
* By Cody Lindley (http://www.codylindley.com)
|
4
|
-
* Copyright (c) 2007 cody lindley
|
5
|
-
* Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
|
6
|
-
*/
|
7
|
-
|
8
|
-
var tb_pathToImage = "../images/loadingAnimation.gif";
|
9
|
-
|
10
|
-
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('$(o).2S(9(){1u(\'a.18, 3n.18, 3i.18\');1w=1p 1t();1w.L=2H});9 1u(b){$(b).s(9(){6 t=X.Q||X.1v||M;6 a=X.u||X.23;6 g=X.1N||P;19(t,a,g);X.2E();H P})}9 19(d,f,g){3m{3(2t o.v.J.2i==="2g"){$("v","11").r({A:"28%",z:"28%"});$("11").r("22","2Z");3(o.1Y("1F")===M){$("v").q("<U 5=\'1F\'></U><4 5=\'B\'></4><4 5=\'8\'></4>");$("#B").s(G)}}n{3(o.1Y("B")===M){$("v").q("<4 5=\'B\'></4><4 5=\'8\'></4>");$("#B").s(G)}}3(1K()){$("#B").1J("2B")}n{$("#B").1J("2z")}3(d===M){d=""}$("v").q("<4 5=\'K\'><1I L=\'"+1w.L+"\' /></4>");$(\'#K\').2y();6 h;3(f.O("?")!==-1){h=f.3l(0,f.O("?"))}n{h=f}6 i=/\\.2s$|\\.2q$|\\.2m$|\\.2l$|\\.2k$/;6 j=h.1C().2h(i);3(j==\'.2s\'||j==\'.2q\'||j==\'.2m\'||j==\'.2l\'||j==\'.2k\'){1D="";1G="";14="";1z="";1x="";R="";1n="";1r=P;3(g){E=$("a[@1N="+g+"]").36();25(D=0;((D<E.1c)&&(R===""));D++){6 k=E[D].u.1C().2h(i);3(!(E[D].u==f)){3(1r){1z=E[D].Q;1x=E[D].u;R="<1e 5=\'1X\'>&1d;&1d;<a u=\'#\'>2T &2R;</a></1e>"}n{1D=E[D].Q;1G=E[D].u;14="<1e 5=\'1U\'>&1d;&1d;<a u=\'#\'>&2O; 2N</a></1e>"}}n{1r=1b;1n="1t "+(D+1)+" 2L "+(E.1c)}}}S=1p 1t();S.1g=9(){S.1g=M;6 a=2x();6 x=a[0]-1M;6 y=a[1]-1M;6 b=S.z;6 c=S.A;3(b>x){c=c*(x/b);b=x;3(c>y){b=b*(y/c);c=y}}n 3(c>y){b=b*(y/c);c=y;3(b>x){c=c*(x/b);b=x}}13=b+30;1a=c+2G;$("#8").q("<a u=\'\' 5=\'1L\' Q=\'1o\'><1I 5=\'2F\' L=\'"+f+"\' z=\'"+b+"\' A=\'"+c+"\' 23=\'"+d+"\'/></a>"+"<4 5=\'2D\'>"+d+"<4 5=\'2C\'>"+1n+14+R+"</4></4><4 5=\'2A\'><a u=\'#\' 5=\'Z\' Q=\'1o\'>1l</a> 1k 1j 1s</4>");$("#Z").s(G);3(!(14==="")){9 12(){3($(o).N("s",12)){$(o).N("s",12)}$("#8").C();$("v").q("<4 5=\'8\'></4>");19(1D,1G,g);H P}$("#1U").s(12)}3(!(R==="")){9 1i(){$("#8").C();$("v").q("<4 5=\'8\'></4>");19(1z,1x,g);H P}$("#1X").s(1i)}o.1h=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}n 3(I==3k){3(!(R=="")){o.1h="";1i()}}n 3(I==3j){3(!(14=="")){o.1h="";12()}}};16();$("#K").C();$("#1L").s(G);$("#8").r({Y:"T"})};S.L=f}n{6 l=f.2r(/^[^\\?]+\\??/,\'\');6 m=2p(l);13=(m[\'z\']*1)+30||3h;1a=(m[\'A\']*1)+3g||3f;W=13-30;V=1a-3e;3(f.O(\'2j\')!=-1){1E=f.1B(\'3d\');$("#15").C();3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"</4><4 5=\'2e\'><a u=\'#\' 5=\'Z\' Q=\'1o\'>1l</a> 1k 1j 1s</4></4><U 1W=\'0\' 2d=\'0\' L=\'"+1E[0]+"\' 5=\'15\' 1v=\'15"+1f.2c(1f.1y()*2b)+"\' 1g=\'1m()\' J=\'z:"+(W+29)+"p;A:"+(V+17)+"p;\' > </U>")}n{$("#B").N();$("#8").q("<U 1W=\'0\' 2d=\'0\' L=\'"+1E[0]+"\' 5=\'15\' 1v=\'15"+1f.2c(1f.1y()*2b)+"\' 1g=\'1m()\' J=\'z:"+(W+29)+"p;A:"+(V+17)+"p;\'> </U>")}}n{3($("#8").r("Y")!="T"){3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"</4><4 5=\'2e\'><a u=\'#\' 5=\'Z\'>1l</a> 1k 1j 1s</4></4><4 5=\'F\' J=\'z:"+W+"p;A:"+V+"p\'></4>")}n{$("#B").N();$("#8").q("<4 5=\'F\' 3c=\'3b\' J=\'z:"+W+"p;A:"+V+"p;\'></4>")}}n{$("#F")[0].J.z=W+"p";$("#F")[0].J.A=V+"p";$("#F")[0].3a=0;$("#1H").11(d)}}$("#Z").s(G);3(f.O(\'37\')!=-1){$("#F").q($(\'#\'+m[\'26\']).1T());$("#8").24(9(){$(\'#\'+m[\'26\']).q($("#F").1T())});16();$("#K").C();$("#8").r({Y:"T"})}n 3(f.O(\'2j\')!=-1){16();3($.1q.35){$("#K").C();$("#8").r({Y:"T"})}}n{$("#F").34(f+="&1y="+(1p 33().32()),9(){16();$("#K").C();1u("#F a.18");$("#8").r({Y:"T"})})}}3(!m[\'1A\']){o.21=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}}}}31(e){}}9 1m(){$("#K").C();$("#8").r({Y:"T"})}9 G(){$("#2Y").N("s");$("#Z").N("s");$("#8").2X("2W",9(){$(\'#8,#B,#1F\').2V("24").N().C()});$("#K").C();3(2t o.v.J.2i=="2g"){$("v","11").r({A:"1Z",z:"1Z"});$("11").r("22","")}o.1h="";o.21="";H P}9 16(){$("#8").r({2U:\'-\'+20((13/2),10)+\'p\',z:13+\'p\'});3(!(1V.1q.2Q&&1V.1q.2P<7)){$("#8").r({38:\'-\'+20((1a/2),10)+\'p\'})}}9 2p(a){6 b={};3(!a){H b}6 c=a.1B(/[;&]/);25(6 i=0;i<c.1c;i++){6 d=c[i].1B(\'=\');3(!d||d.1c!=2){39}6 e=2a(d[0]);6 f=2a(d[1]);f=f.2r(/\\+/g,\' \');b[e]=f}H b}9 2x(){6 a=o.2M;6 w=1S.2o||1R.2o||(a&&a.1Q)||o.v.1Q;6 h=1S.1P||1R.1P||(a&&a.2n)||o.v.2n;1O=[w,h];H 1O}9 1K(){6 a=2K.2J.1C();3(a.O(\'2I\')!=-1&&a.O(\'3o\')!=-1){H 1b}}',62,211,'|||if|div|id|var||TB_window|function||||||||||||||else|document|px|append|css|click||href|body||||width|height|TB_overlay|remove|TB_Counter|TB_TempArray|TB_ajaxContent|tb_remove|return|keycode|style|TB_load|src|null|unbind|indexOf|false|title|TB_NextHTML|imgPreloader|block|iframe|ajaxContentH|ajaxContentW|this|display|TB_closeWindowButton||html|goPrev|TB_WIDTH|TB_PrevHTML|TB_iframeContent|tb_position||thickbox|tb_show|TB_HEIGHT|true|length|nbsp|span|Math|onload|onkeydown|goNext|Esc|or|close|tb_showIframe|TB_imageCount|Close|new|browser|TB_FoundURL|Key|Image|tb_init|name|imgLoader|TB_NextURL|random|TB_NextCaption|modal|split|toLowerCase|TB_PrevCaption|urlNoQuery|TB_HideSelect|TB_PrevURL|TB_ajaxWindowTitle|img|addClass|tb_detectMacXFF|TB_ImageOff|150|rel|arrayPageSize|innerHeight|clientWidth|self|window|children|TB_prev|jQuery|frameborder|TB_next|getElementById|auto|parseInt|onkeyup|overflow|alt|unload|for|inlineId||100||unescape|1000|round|hspace|TB_closeAjaxWindow|TB_title|undefined|match|maxHeight|TB_iframe|bmp|gif|png|clientHeight|innerWidth|tb_parseQuery|jpeg|replace|jpg|typeof|which|keyCode|event|tb_getPageSize|show|TB_overlayBG|TB_closeWindow|TB_overlayMacFFBGHack|TB_secondLine|TB_caption|blur|TB_Image|60|tb_pathToImage|mac|userAgent|navigator|of|documentElement|Prev|lt|version|msie|gt|ready|Next|marginLeft|trigger|fast|fadeOut|TB_imageOff|hidden||catch|getTime|Date|load|safari|get|TB_inline|marginTop|continue|scrollTop|TB_modal|class|TB_|45|440|40|630|input|188|190|substr|try|area|firefox'.split('|'),0,{}))
|
@@ -1,62 +0,0 @@
|
|
1
|
-
module AppConfig
|
2
|
-
module Storage
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'sqlite3'
|
6
|
-
rescue LoadError
|
7
|
-
require 'rubygems'
|
8
|
-
require 'sqlite3'
|
9
|
-
end
|
10
|
-
|
11
|
-
# SQLite3 storage method.
|
12
|
-
class Sqlite < Storage::Base
|
13
|
-
|
14
|
-
DEFAULTS = {
|
15
|
-
:database => File.expand_path(File.join(ENV['HOME'], '.app_config.sqlite3')),
|
16
|
-
:table => 'app_config'
|
17
|
-
}
|
18
|
-
|
19
|
-
# Loads @data with the SQLite3 database located at +path+.
|
20
|
-
# @data will be the Hashish that is accessed like AppConfig[:key].
|
21
|
-
#
|
22
|
-
# Defaults to $HOME/.app_config.sqlite3
|
23
|
-
def initialize(options)
|
24
|
-
super(DEFAULTS.merge(options))
|
25
|
-
@db = SQLite3::Database.open(@options[:database])
|
26
|
-
@data = load_from_database
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
# Returns a Hashish that looks something like {:column => value}.
|
32
|
-
# TODO: This could use a bit of work.
|
33
|
-
def load_from_database
|
34
|
-
query = ["SELECT * FROM sqlite_master",
|
35
|
-
"WHERE type == 'table' AND name == '#{@options[:table]}'",
|
36
|
-
"AND name != 'sqlite_sequence'"].join(' ')
|
37
|
-
table = @db.get_first_row(query).last
|
38
|
-
values(columns(table))
|
39
|
-
end
|
40
|
-
|
41
|
-
# Return the values for a given +columns+ (as a Hashish).
|
42
|
-
def values(columns)
|
43
|
-
data = Hashish.new
|
44
|
-
query = "SELECT #{columns.join(', ')} FROM #{@options[:table]}"
|
45
|
-
@db.get_first_row(query).each_with_index do |value, index|
|
46
|
-
data[columns[index]] = value
|
47
|
-
end
|
48
|
-
data
|
49
|
-
end
|
50
|
-
|
51
|
-
# Return the column names of a given +table+ (as an Array).
|
52
|
-
def columns(table)
|
53
|
-
columns = table.split(', ')
|
54
|
-
# Trip the first element, since it's the SQL CREATE statement.
|
55
|
-
columns = columns[1, columns.size]
|
56
|
-
# Yes, Ruby is 'elegant', but this is fucking disgusting. There *must* be a better way.
|
57
|
-
columns.map! {|c| c.split('"').reject {|e| e.empty? }.reject {|e| e.include? '('}}.flatten!
|
58
|
-
end
|
59
|
-
|
60
|
-
end # Sqlite
|
61
|
-
end # Storage
|
62
|
-
end # AppConfig
|
data/spec/watchr.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
def run_specs
|
4
|
-
system('rake spec')
|
5
|
-
end
|
6
|
-
|
7
|
-
# Ctrl-\
|
8
|
-
Signal.trap('QUIT') do
|
9
|
-
puts "\n--- Running all specs ---\n"
|
10
|
-
run_specs
|
11
|
-
end
|
12
|
-
|
13
|
-
# Ctrl-C
|
14
|
-
Signal.trap('INT') { abort("\n") }
|
15
|
-
|
16
|
-
|
17
|
-
if __FILE__ == $0
|
18
|
-
system("watchr #{$0}")
|
19
|
-
else
|
20
|
-
run_specs
|
21
|
-
|
22
|
-
[
|
23
|
-
'lib/(.*/)?.*\.rb',
|
24
|
-
'spec/(.*/)?.*_spec\.rb'
|
25
|
-
].each do |pattern|
|
26
|
-
watch(pattern) { |md| run_specs }
|
27
|
-
end
|
28
|
-
end
|