time_machine 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,22 @@
1
+ = TimeMachine
2
+
3
+ This plugin lets you easily change Time.now.
4
+
5
+ == Installation
6
+
7
+ Add gem 'time_machine' to your development group and add this in a view file (ie application layout):
8
+
9
+ <%= time_machine %>
10
+
11
+ Reload, and you'll see a small box in the upper left corner of your app. Use this to travel in time and see how your app behaves/looks like when time changes.
12
+
13
+ == Options
14
+
15
+ You can pass some options to the time_machine helper to change some settings:
16
+
17
+ <%= time_machine style: 'dark', position: 'top-right', state: 'collapsed' %>
18
+
19
+ == Behind the scenes
20
+
21
+ It's just an engine with two routes. When you select a date you're sent to /time_machine/the-date where Timecop changes the date, and then you're redirected back to where you came from.
22
+
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'TimeMachine'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+
24
+
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
@@ -0,0 +1,14 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require jquery
14
+ //= require_tree .
@@ -0,0 +1,13 @@
1
+ jQuery ->
2
+ # initialize date picker
3
+ $('#time-machine-date').Zebra_DatePicker
4
+ always_show_clear: false
5
+ lang_clear_date: ''
6
+ onSelect: (date) -> window.location.href = "/time_machine/#{date}"
7
+
8
+ # toggle expanded/collapsed satte
9
+ $(document).on 'click', '#time-machine a.toggle', ->
10
+ $('#time-machine').toggleClass('collapsed')
11
+ false
12
+
13
+ $('#time-machine').show()
@@ -0,0 +1 @@
1
+ (function(c){c.Zebra_DatePicker=function(F,C){var da={always_show_clear:!1,always_visible:!1,days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),direction:0,disabled_dates:!1,first_day_of_week:1,format:"Y-m-d",inside:!0,lang_clear_date:"Clear",months:"January February March April May June July August September October November December".split(" "),offset:[20,-5],pair:!1,readonly_element:!0,show_week_number:!1,start_date:!1,view:"days",weekend_days:[0,6],onSelect:null},s,l,w, x,z,D,E,G,S,N,U,o,n,v,p,k,O,H,I,T,P,q,r,Q,J,L,X,Y,Z,y,a=this;a.settings={};var t=c(F),aa=function(b){b||(a.settings=c.extend({},da,C));a.settings.readonly_element&&t.attr("readonly","readonly");var d={days:["d","j"],months:["F","m","M","n","t"],years:["o","Y","y"]},g=!1,f=!1,h=!1;for(type in d)c.each(d[type],function(c,b){a.settings.format.indexOf(b)>-1&&(type=="days"?g=true:type=="months"?f=true:type=="years"&&(h=true))});y=g&&f&&h?["years","months","days"]:!g&&f&&h?["years","months"]:!g&&!f&&h? ["years"]:["years","months","days"];-1==c.inArray(a.settings.view,y)&&(a.settings.view=y[y.length-1]);var d=new Date,i=!a.settings.reference_date?t.data("zdp_reference_date")?t.data("zdp_reference_date"):d:a.settings.reference_date,e,j;r=q=void 0;o=i.getMonth();S=d.getMonth();n=i.getFullYear();N=d.getFullYear();v=i.getDate();U=d.getDate();if(!0===a.settings.direction)q=i;else if(!1===a.settings.direction)r=i,L=r.getMonth(),J=r.getFullYear(),Q=r.getDate();else if(!c.isArray(a.settings.direction)&& M(a.settings.direction)&&0<m(a.settings.direction)||c.isArray(a.settings.direction)&&(!0===a.settings.direction[0]||M(a.settings.direction[0])&&0<a.settings.direction[0]||(e=R(a.settings.direction[0])))&&(!1===a.settings.direction[1]||M(a.settings.direction[1])&&0<=a.settings.direction[1]||(j=R(a.settings.direction[1]))))q=e?e:new Date(n,o,v+(!c.isArray(a.settings.direction)?m(a.settings.direction):m(!0===a.settings.direction[0]?0:a.settings.direction[0]))),o=q.getMonth(),n=q.getFullYear(),v=q.getDate(), j&&+j>+q?r=j:!j&&(!1!==a.settings.direction[1]&&c.isArray(a.settings.direction))&&(r=new Date(n,o,v+m(a.settings.direction[1]))),r&&(L=r.getMonth(),J=r.getFullYear(),Q=r.getDate());else if(!c.isArray(a.settings.direction)&&M(a.settings.direction)&&0>m(a.settings.direction)||c.isArray(a.settings.direction)&&(!1===a.settings.direction[0]||M(a.settings.direction[0])&&0>a.settings.direction[0])&&(M(a.settings.direction[1])&&0<=a.settings.direction[1]||(e=R(a.settings.direction[1]))))r=new Date(n,o,v+ (!c.isArray(a.settings.direction)?m(a.settings.direction):m(!1===a.settings.direction[0]?0:a.settings.direction[0]))),L=r.getMonth(),J=r.getFullYear(),Q=r.getDate(),e&&+e<+r?q=e:!e&&c.isArray(a.settings.direction)&&(q=new Date(J,L,Q-m(a.settings.direction[1]))),q&&(o=q.getMonth(),n=q.getFullYear(),v=q.getDate());if(q&&A(n,o,v)){for(;A(n);)q?n++:n--,o=0;for(;A(n,o);)q?o++:o--,11<o?(n++,o=0):0>o&&(n--,o=0),v=1;for(;A(n,o,v);)q?v++:v--;d=new Date(n,o,v);n=d.getFullYear();o=d.getMonth();v=d.getDate()}T= [];c.each(a.settings.disabled_dates,function(){for(var a=this.split(" "),b=0;b<4;b++){a[b]||(a[b]="*");a[b]=a[b].indexOf(",")>-1?a[b].split(","):Array(a[b]);for(var d=0;d<a[b].length;d++)if(a[b][d].indexOf("-")>-1){var e=a[b][d].match(/^([0-9]+)\-([0-9]+)/);if(null!=e){for(var f=m(e[1]);f<=m(e[2]);f++)c.inArray(f,a[b])==-1&&a[b].push(f+"");a[b].splice(d,1)}}for(d=0;d<a[b].length;d++)a[b][d]=isNaN(m(a[b][d]))?a[b][d]:m(a[b][d])}T.push(a)});(e=R(t.val()||(a.settings.start_date?a.settings.start_date: "")))&&A(e.getFullYear(),e.getMonth(),e.getDate())&&t.val("");$(e);b||(a.settings.always_visible||(b='<button type="button" class="Zebra_DatePicker_Icon'+("disabled"==t.attr("disabled")?" Zebra_DatePicker_Icon_Disabled":"")+'">Pick a date</button>',w=c(b),a.icon=w,(a.settings.readonly_element?w.add(t):w).bind("click",function(b){b.preventDefault();t.attr("disabled")||(l.css("display")!="none"?a.hide():a.show())}),w.insertAfter(F),b=c(F).position(),e=c(F).outerHeight(!0),j=c(F).outerWidth(!0),icon_width= w.outerWidth(!0),icon_height=w.outerHeight(!0),a.settings.inside?(w.addClass("Zebra_DatePicker_Icon_Inside"),w.css({left:b.left+j-icon_width,top:b.top+(e-icon_height)/2})):w.css({left:b.left+j,top:b.top+(e-icon_height)/2})),b='<div class="Zebra_DatePicker"><table class="dp_header"><tr><td class="dp_previous">&laquo;</td><td class="dp_caption">&nbsp;</td><td class="dp_next">&raquo;</td></tr></table><table class="dp_daypicker"></table><table class="dp_monthpicker"></table><table class="dp_yearpicker"></table><table class="dp_footer"><tr><td>'+ a.settings.lang_clear_date+"</td></tr></table></div>",l=c(b),a.datepicker=l,x=c("table.dp_header",l),z=c("table.dp_daypicker",l),D=c("table.dp_monthpicker",l),E=c("table.dp_yearpicker",l),G=c("table.dp_footer",l),a.settings.always_visible?t.attr("disabled")||(a.settings.always_visible.append(l),a.show()):c("body").append(l),l.delegate("td:not(.dp_disabled, .dp_weekend_disabled, .dp_not_in_month, .dp_blocked, .dp_week_number)","mouseover",function(){c(this).addClass("dp_hover")}).delegate("td:not(.dp_disabled, .dp_weekend_disabled, .dp_not_in_month, .dp_blocked, .dp_week_number)", "mouseout",function(){c(this).removeClass("dp_hover")}),b=c("td",x),c.browser.mozilla?b.css("MozUserSelect","none"):c.browser.msie?b.bind("selectstart",function(){return false}):b.mousedown(function(){return false}),c(".dp_previous",x).bind("click",function(){if(!c(this).hasClass("dp_blocked")){if(s=="months")k--;else if(s=="years")k=k-12;else if(--p<0){p=11;k--}K()}}),c(".dp_caption",x).bind("click",function(){s=s=="days"?c.inArray("months",y)>-1?"months":c.inArray("years",y)>-1?"years":"days":s== "months"?c.inArray("years",y)>-1?"years":c.inArray("days",y)>-1?"days":"months":c.inArray("days",y)>-1?"days":c.inArray("months",y)>-1?"months":"years";K()}),c(".dp_next",x).bind("click",function(){if(!c(this).hasClass("dp_blocked")){if(s=="months")k++;else if(s=="years")k=k+12;else if(++p==12){p=0;k++}K()}}),z.delegate("td:not(.dp_disabled, .dp_weekend_disabled, .dp_not_in_month, .dp_week_number)","click",function(){V(k,p,m(c(this).html()),"days",c(this))}),D.delegate("td:not(.dp_disabled)","click", function(){var b=c(this).attr("class").match(/dp\_month\_([0-9]+)/);p=m(b[1]);if(c.inArray("days",y)==-1)V(k,p,1,"months",c(this));else{s="days";a.settings.always_visible&&t.val("");K()}}),E.delegate("td:not(.dp_disabled)","click",function(){k=m(c(this).html());if(c.inArray("months",y)==-1)V(k,1,1,"years",c(this));else{s="months";a.settings.always_visible&&t.val("");K()}}),c("td",G).bind("click",function(b){b.preventDefault();t.val("");if(!a.settings.always_visible){k=p=I=H=O=null;G.css("display", "none")}a.hide()}),a.settings.always_visible||c(document).bind({mousedown:a._mousedown,keyup:a._keyup}),K())};a.hide=function(){a.settings.always_visible||(ba("hide"),l.css("display","none"))};a.show=function(){s=a.settings.view;var b=R(t.val()||(a.settings.start_date?a.settings.start_date:""));b?(H=b.getMonth(),p=b.getMonth(),I=b.getFullYear(),k=b.getFullYear(),O=b.getDate(),A(I,H,O)&&(t.val(""),p=o,k=n)):(p=o,k=n);K();if(a.settings.always_visible)l.css("display","block");else{var b=l.outerWidth(), d=l.outerHeight(),g=w.offset().left+a.settings.offset[0],f=w.offset().top-d+a.settings.offset[1],h=c(window).width(),i=c(window).height(),e=c(window).scrollTop(),j=c(window).scrollLeft();g+b>j+h&&(g=j+h-b);g<j&&(g=j);f+d>e+i&&(f=e+i-d);f<e&&(f=e);l.css({left:g,top:f});l.fadeIn(c.browser.msie&&c.browser.version.match(/^[6-8]/)?0:150,"linear");ba()}};a.update=function(b){a.original_direction&&(a.original_direction=a.direction);a.settings=c.extend(a.settings,b);aa(!0)};var R=function(b){b+="";if(""!= c.trim(b)){var d;d=a.settings.format.replace(/\s/g,"").replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");for(var g="dDjlNSwFmMnYy".split(""),f=[],h=[],i=0;i<g.length;i++)-1<(position=d.indexOf(g[i]))&&f.push({character:g[i],position:position});f.sort(function(a,b){return a.position-b.position});c.each(f,function(a,b){switch(b.character){case "d":h.push("0[1-9]|[12][0-9]|3[01]");break;case "D":h.push("[a-z]{3}");break;case "j":h.push("[1-9]|[12][0-9]|3[01]");break;case "l":h.push("[a-z]+");break;case "N":h.push("[1-7]"); break;case "S":h.push("st|nd|rd|th");break;case "w":h.push("[0-6]");break;case "F":h.push("[a-z]+");break;case "m":h.push("0[1-9]|1[012]+");break;case "M":h.push("[a-z]{3}");break;case "n":h.push("[1-9]|1[012]");break;case "Y":h.push("[0-9]{4}");break;case "y":h.push("[0-9]{2}")}});if(h.length&&(f.reverse(),c.each(f,function(a,b){d=d.replace(b.character,"("+h[h.length-a-1]+")")}),h=RegExp("^"+d+"$","ig"),segments=h.exec(b.replace(/\s/g,"")))){var e,j,k,l="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), o="January February March April May June July August September October November December".split(" "),p,n=!0;f.reverse();c.each(f,function(b,d){if(!n)return!0;switch(d.character){case "m":case "n":j=m(segments[b+1]);break;case "d":case "j":e=m(segments[b+1]);break;case "D":case "l":case "F":case "M":p="D"==d.character||"l"==d.character?a.settings.days:a.settings.months;n=!1;c.each(p,function(a,c){if(n)return!0;if(segments[b+1].toLowerCase()==c.substring(0,"D"==d.character||"M"==d.character?3:c.length).toLowerCase()){switch(d.character){case "D":segments[b+ 1]=l[a].substring(0,3);break;case "l":segments[b+1]=l[a];break;case "F":segments[b+1]=o[a];j=a+1;break;case "M":segments[b+1]=o[a].substring(0,3),j=a+1}n=!0}});break;case "Y":k=m(segments[b+1]);break;case "y":k="19"+m(segments[b+1])}});if(n&&(b=new Date(k,(j||1)-1,e||1),b.getFullYear()==k&&b.getDate()==(e||1)&&b.getMonth()==(j||1)-1))return b}return!1}},ca=function(){var b=(new Date(k,p+1,0)).getDate(),d=(new Date(k,p,1)).getDay(),g=(new Date(k,p,0)).getDate(),d=d-a.settings.first_day_of_week,d=0> d?7+d:d;W(a.settings.months[p]+", "+k);var f="<tr>";a.settings.show_week_number&&(f+="<th>"+a.settings.show_week_number+"</th>");for(var h=0;7>h;h++)f+="<th>"+a.settings.days[(a.settings.first_day_of_week+h)%7].substr(0,2)+"</th>";f+="</tr><tr>";for(h=0;42>h;h++){0<h&&0==h%7&&(f+="</tr><tr>");if(0==h%7&&a.settings.show_week_number){var i=new Date(k,p,h-d+1),e=new Date(k,0,1),j=e.getDay()-a.settings.first_day_of_week,e=Math.floor((i.getTime()-e.getTime()-6E4*(i.getTimezoneOffset()-e.getTimezoneOffset()))/ 864E5)+1,j=0<=j?j:j+7;4>j?(j=Math.floor((e+j-1)/7)+1,52<j+1&&(i.getFullYear(),i=nYear.getDay()-a.settings.first_day_of_week,i=0<=i?i:i+7,j=4>i?1:53)):j=Math.floor((e+j-1)/7);f+='<td class="dp_week_number">'+j+"</td>"}i=h-d+1;h<d?f+='<td class="dp_not_in_month">'+(g-d+h+1)+"</td>":i>b?f+='<td class="dp_not_in_month">'+(i-b)+"</td>":(j=(a.settings.first_day_of_week+h)%7,e="",A(k,p,i)?(e=-1<c.inArray(j,a.settings.weekend_days)?"dp_weekend_disabled":e+" dp_disabled",p==S&&(k==N&&U==i)&&(e+=" dp_disabled_current")): (-1<c.inArray(j,a.settings.weekend_days)&&(e="dp_weekend"),p==H&&(k==I&&O==i)&&(e+=" dp_selected"),p==S&&(k==N&&U==i)&&(e+=" dp_current")),f+="<td"+(""!=e?' class="'+c.trim(e)+'"':"")+">"+u(i,2)+"</td>")}z.html(c(f+"</tr>"));a.settings.always_visible&&(X=c("td:not(.dp_disabled, .dp_weekend_disabled, .dp_not_in_month, .dp_blocked, .dp_week_number)",z));z.css("display","")},ba=function(a){if(c.browser.msie&&c.browser.version.match(/^6/)){if(!P){var d=m(l.css("zIndex"))-1;P=jQuery("<iframe>",{src:'javascript:document.write("")', scrolling:"no",frameborder:0,allowtransparency:"true",css:{zIndex:d,position:"absolute",top:-1E3,left:-1E3,width:l.outerWidth(),height:l.outerHeight(),filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)",display:"none"}});c("body").append(P)}switch(a){case "hide":P.css("display","none");break;default:a=l.offset(),P.css({top:a.top,left:a.left,display:"block"})}}},A=function(b,d,g){if(c.isArray(a.settings.direction)||0!==m(a.settings.direction)){var f=m(B(b,"undefined"!=typeof d?u(d,2):"","undefined"!= typeof g?u(g,2):"")),h=(f+"").length;if(8==h&&("undefined"!=typeof q&&f<m(B(n,u(o,2),u(v,2)))||"undefined"!=typeof r&&f>m(B(J,u(L,2),u(Q,2))))||6==h&&("undefined"!=typeof q&&f<m(B(n,u(o,2)))||"undefined"!=typeof r&&f>m(B(J,u(L,2))))||4==h&&("undefined"!=typeof q&&f<n||"undefined"!=typeof r&&f>J))return!0}if(T){"undefined"!=typeof d&&(d+=1);var i=!1;c.each(T,function(){if(!i&&(-1<c.inArray(b,this[2])||-1<c.inArray("*",this[2])))if("undefined"!=typeof d&&-1<c.inArray(d,this[1])||-1<c.inArray("*",this[1]))if("undefined"!= typeof g&&-1<c.inArray(g,this[0])||-1<c.inArray("*",this[0])){if("*"==this[3])return i=!0;var a=(new Date(b,d-1,g)).getDay();if(-1<c.inArray(a,this[3]))return i=!0}});if(i)return!0}return!1},M=function(a){return(a+"").match(/^\-?[0-9]+$/)?!0:!1},W=function(b){c(".dp_caption",x).html(b);if(c.isArray(a.settings.direction)||0!==m(a.settings.direction)){var b=k,d=p,g,f;"days"==s?(f=0>d-1?B(b-1,"11"):B(b,u(d-1,2)),g=11<d+1?B(b+1,"00"):B(b,u(d+1,2))):"months"==s?(f=b-1,g=b+1):"years"==s&&(f=b-7,g=b+7); A(f)?(c(".dp_previous",x).addClass("dp_blocked"),c(".dp_previous",x).removeClass("dp_hover")):c(".dp_previous",x).removeClass("dp_blocked");A(g)?(c(".dp_next",x).addClass("dp_blocked"),c(".dp_next",x).removeClass("dp_hover")):c(".dp_next",x).removeClass("dp_blocked")}},K=function(){if(""==z.text()||"days"==s){if(""==z.text()){a.settings.always_visible||l.css("left",-1E3);l.css({display:"block"});ca();var b=z.outerWidth(),d=z.outerHeight();x.css("width",b);D.css({width:b,height:d});E.css({width:b, height:d});G.css("width",b);l.css({display:"none"})}else ca();D.css("display","none");E.css("display","none")}else if("months"==s){W(k);b="<tr>";for(d=0;12>d;d++){0<d&&0==d%3&&(b+="</tr><tr>");var g="dp_month_"+d;A(k,d)?g+=" dp_disabled":!1!==H&&H==d?g+=" dp_selected":S==d&&N==k&&(g+=" dp_current");b+='<td class="'+c.trim(g)+'">'+a.settings.months[d].substr(0,3)+"</td>"}D.html(c(b+"</tr>"));a.settings.always_visible&&(Y=c("td:not(.dp_disabled)",D));D.css("display","");z.css("display","none");E.css("display", "none")}else if("years"==s){W(k-7+" - "+(k+4));b="<tr>";for(d=0;12>d;d++)0<d&&0==d%3&&(b+="</tr><tr>"),g="",A(k-7+d)?g+=" dp_disabled":I&&I==k-7+d?g+=" dp_selected":N==k-7+d&&(g+=" dp_current"),b+="<td"+(""!=c.trim(g)?' class="'+c.trim(g)+'"':"")+">"+(k-7+d)+"</td>";E.html(c(b+"</tr>"));a.settings.always_visible&&(Z=c("td:not(.dp_disabled)",E));E.css("display","");z.css("display","none");D.css("display","none")}(a.settings.always_show_clear||a.settings.always_visible||""!=t.val())&&"block"!=G.css("display")? G.css("display",""):G.css("display","none")},V=function(b,c,g,f,h){var i=new Date(b,c,g),f="days"==f?X:"months"==f?Y:Z,e;e="";for(var j=i.getDate(),l=i.getDay(),n=a.settings.days[l],m=i.getMonth()+1,o=a.settings.months[m-1],q=i.getFullYear()+"",r=0;r<a.settings.format.length;r++){var s=a.settings.format.charAt(r);switch(s){case "y":q=q.substr(2);case "Y":e+=q;break;case "m":m=u(m,2);case "n":e+=m;break;case "M":o=o.substr(0,3);case "F":e+=o;break;case "d":j=u(j,2);case "j":e+=j;break;case "D":n=n.substr(0, 3);case "l":e+=n;break;case "N":l++;case "w":e+=l;break;case "S":e=1==j%10&&"11"!=j?e+"st":2==j%10&&"12"!=j?e+"nd":3==j%10&&"13"!=j?e+"rd":e+"th";break;default:e+=s}}t.val(e);a.settings.always_visible&&(H=i.getMonth(),p=i.getMonth(),I=i.getFullYear(),k=i.getFullYear(),O=i.getDate(),f.removeClass("dp_selected"),h.addClass("dp_selected"));a.hide();$(i);if(a.settings.onSelect&&"function"==typeof a.settings.onSelect)a.settings.onSelect(e,b+"-"+u(c+1,2)+"-"+u(g,2),new Date(b,c,g))},B=function(){for(var a= "",c=0;c<arguments.length;c++)a+=arguments[c]+"";return a},u=function(a,c){for(a+="";a.length<c;)a="0"+a;return a},m=function(a){return parseInt(a,10)},$=function(b){if(a.settings.pair)if(!a.settings.pair.data||!a.settings.pair.data("Zebra_DatePicker"))a.settings.pair.data("zdp_reference_date",b);else{var c=a.settings.pair.data("Zebra_DatePicker");c.update({reference_date:b});c.settings.always_visible&&c.show()}};a._keyup=function(b){("block"==l.css("display")||27==b.which)&&a.hide();return!0};a._mousedown= function(b){if("block"==l.css("display")){if(c(b.target).get(0)===w.get(0))return!0;0==c(b.target).parents().filter(".Zebra_DatePicker").length&&a.hide()}return!0};aa()};c.fn.Zebra_DatePicker=function(F){return this.each(function(){if(void 0!=c(this).data("Zebra_DatePicker")){var C=c(this).data("Zebra_DatePicker");C.icon.remove();C.datepicker.remove();c(document).unbind("keyup",C._keyup);c(document).unbind("mousedown",C._mousedown)}C=new c.Zebra_DatePicker(this,F);c(this).data("Zebra_DatePicker", C)})}})(jQuery);
@@ -0,0 +1,102 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
14
+
15
+ body
16
+
17
+ #time-machine
18
+ position: absolute
19
+ top: 0
20
+ padding: 6px 8px
21
+ font-family: geneva
22
+ box-shadow: #999 0px 3px 15px
23
+ width: 150px
24
+ border:
25
+ bottom: 1px solid #ccc
26
+ right: 1px solid #ccc
27
+
28
+ &.top-left
29
+ left: 0
30
+ border-bottom-right-radius: 5px
31
+ a.toggle
32
+ float: right
33
+ a.reset
34
+ float: right
35
+
36
+ &.top-right
37
+ right: 0
38
+ border-bottom-left-radius: 5px
39
+ a.reset
40
+ float: left
41
+ a.toggle
42
+ left: 0
43
+ h6
44
+ float: right
45
+ input
46
+ float: right
47
+
48
+ &.light
49
+ background: #fff
50
+ a, h6
51
+ color: #333
52
+
53
+ &.dark
54
+ background: #373737
55
+ a
56
+ color: #fae03a
57
+ h6
58
+ color: #ccc
59
+
60
+ &.collapsed
61
+ width: 15px
62
+ a.reset, input, h6
63
+ display: none
64
+ a.toggle
65
+ font-size: 18px
66
+ font-weight: bold
67
+
68
+ button
69
+ display: none
70
+
71
+ a.reset, a.toggle
72
+ text-decoration: none
73
+ font-size: 10px
74
+
75
+ a.reset
76
+ margin-top: 7px
77
+
78
+ a.toggle
79
+ position: relative
80
+ font-size: 12px
81
+
82
+ input#time-machine-date
83
+ font-family: geneva
84
+ font-size: 12px
85
+ text-shadow: #fff 0px 1px 1px
86
+ background: #fff
87
+ box-shadow: #999 0px 0px 30px inset
88
+ text-align: center
89
+ width: 105px !important
90
+ margin: 0
91
+ border: none
92
+ padding: 3px
93
+ cursor: pointer !important
94
+
95
+ h6
96
+ padding: 0
97
+ margin: 0
98
+ font-size: 12px
99
+ letter-spacing: 3px
100
+ font-weight: normal
101
+ text-transform: uppercase
102
+ text-shadow: #000 0px 0px 6px
@@ -0,0 +1,81 @@
1
+ /*
2
+
3
+ Zebra_DatePicker: a lightweight jQuery date picker plugin
4
+
5
+ default stylesheet
6
+ copyright (c) 2011 - 2012 Stefan Gabos
7
+ http://stefangabos.ro/jquery/zebra-datepicker/
8
+
9
+ */
10
+
11
+ .Zebra_DatePicker * { margin: 0; padding: 0; color: #666 }
12
+ .Zebra_DatePicker { position: absolute; background: #373737; border: 3px solid #373737; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; display: none; z-index: 100; font-family: Geneva, 'Lucida Sans', 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif; font-size: 11px }
13
+
14
+ /* = GLOBALS
15
+ ----------------------------------------------------------------------------------------------------------------------*/
16
+ .Zebra_DatePicker table { width: 100%; border-collapse: collapse; border-spacing: 0 }
17
+
18
+ .Zebra_DatePicker td,
19
+ .Zebra_DatePicker th { text-align: center; padding: 5px 0 }
20
+
21
+ .Zebra_DatePicker td { cursor: pointer }
22
+
23
+ .Zebra_DatePicker .dp_daypicker,
24
+ .Zebra_DatePicker .dp_monthpicker,
25
+ .Zebra_DatePicker .dp_yearpicker { margin-top: 3px }
26
+
27
+ .Zebra_DatePicker .dp_daypicker td,
28
+ .Zebra_DatePicker .dp_daypicker th,
29
+ .Zebra_DatePicker .dp_monthpicker td,
30
+ .Zebra_DatePicker .dp_yearpicker td { width: 30px; border: 1px solid #BBB; background: #DEDEDE url('metallic/default-date.png') repeat-x top; color: #666 }
31
+
32
+ /* = HEADER
33
+ ----------------------------------------------------------------------------------------------------------------------*/
34
+ .Zebra_DatePicker .dp_header td { color: #E0E0E0; background: #373737 }
35
+
36
+ .Zebra_DatePicker .dp_header .dp_previous,
37
+ .Zebra_DatePicker .dp_header .dp_next { width: 30px }
38
+
39
+ .Zebra_DatePicker .dp_header .dp_caption { font-weight: bold }
40
+ .Zebra_DatePicker .dp_header .dp_hover { background: #222; color: #FFF; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px }
41
+ .Zebra_DatePicker .dp_header .dp_blocked { color: #888; cursor: default }
42
+
43
+ /* = DATEPICKER
44
+ ----------------------------------------------------------------------------------------------------------------------*/
45
+ .Zebra_DatePicker td.dp_week_number,
46
+ .Zebra_DatePicker .dp_daypicker th { background: #F1F1F1 url('metallic/titles.png') repeat-x top; font-size: 9px; padding-top: 7px }
47
+
48
+ .Zebra_DatePicker td.dp_weekend_disabled,
49
+ .Zebra_DatePicker td.dp_not_in_month { background: #ECECEC url('metallic/disabled-date.png'); color: #DDD; cursor: default }
50
+
51
+ .Zebra_DatePicker td.dp_weekend { background: #DEDEDE url('metallic/default-date.png') repeat-x top; color: #666 }
52
+
53
+ .Zebra_DatePicker td.dp_selected { background: #E26262 url('metallic/selected-date.png') repeat-x top; color: #E0E0E0 }
54
+
55
+ /* = MONTHPICKER
56
+ ----------------------------------------------------------------------------------------------------------------------*/
57
+ .Zebra_DatePicker .dp_monthpicker td { width: 33% }
58
+
59
+ /* = YEARPICKER
60
+ ----------------------------------------------------------------------------------------------------------------------*/
61
+ .Zebra_DatePicker .dp_yearpicker td { width: 33% }
62
+
63
+ /* = SOME MORE GLOBALS (MUST BE LAST IN ORDER TO OVERWRITE PRESIOUS PROPERTIES)
64
+ ----------------------------------------------------------------------------------------------------------------------*/
65
+ .Zebra_DatePicker td.dp_current { color: #E26261 }
66
+ .Zebra_DatePicker td.dp_disabled_current { color: #E38585 }
67
+ .Zebra_DatePicker td.dp_hover { background: #E26262 url('metallic/selected-date.png') repeat-x top; color: #E0E0E0 }
68
+ .Zebra_DatePicker td.dp_disabled { background: #ECECEC url('metallic/disabled-date.png') repeat-x top; color: #DDD; cursor: default }
69
+
70
+ /* = ICON
71
+ ----------------------------------------------------------------------------------------------------------------------*/
72
+ /* = ICON
73
+ ----------------------------------------------------------------------------------------------------------------------*/
74
+ button.Zebra_DatePicker_Icon { position: absolute; width: 16px; height: 16px; background: url('calendar.png') no-repeat left top; text-indent: -9000px; border: none; cursor: pointer; margin: 0 0 0 5px; padding: 0; line-height: 0 }
75
+ button.Zebra_DatePicker_Icon_Disabled { background-image: url('calendar-disabled.png') }
76
+ button.Zebra_DatePicker_Icon_Inside { margin: 0 0 0 2px }
77
+
78
+ /* Fix icon position in Chrome & Safari */
79
+ @media screen and (-webkit-min-device-pixel-ratio:0) {
80
+ button.Zebra_DatePicker_Icon_Inside { margin: 0 5px 0 0 }
81
+ }
@@ -0,0 +1,17 @@
1
+ module TimeMachine
2
+ class ApplicationController < ActionController::Base
3
+
4
+ def reset
5
+ Timecop.return
6
+ redirect_to params[:redirect] || :back
7
+ end
8
+
9
+ def travel
10
+ date = Date.parse params[:date]
11
+ Timecop.travel date
12
+ redirect_to params[:redirect] || :back
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,15 @@
1
+ module TimeMachine
2
+ module ApplicationHelper
3
+
4
+ def time_machine(options={})
5
+ options = {
6
+ style: 'light',
7
+ position: 'top-left',
8
+ state: 'expanded',
9
+ }.update options
10
+
11
+ options[:classes] = options.select { |k,v| [:position, :style, :state].include? k }.values.join " "
12
+ render :partial => 'time_machine', locals: { options: options }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ <div class="<%= options[:classes] %>" style="position: absolute; top: 0; left: -100000; display: none" id="time-machine" >
2
+ <%= link_to "¤", "#", class: 'toggle' %>
3
+ <h6>Timemachine</h6>
4
+ <input value="<%= Time.now.strftime('%Y-%m-%d') %>" type="text" readonly="readonly" id="time-machine-date"/>
5
+ <%= link_to "reset", "/time_machine/reset", class: 'reset' %>
6
+ </div>
7
+
8
+ <script type="text/javascript">
9
+ $(function() {
10
+ $("head").append($("<link rel='stylesheet' href='/assets/time_machine/application.css' type='text/css' media='screen' />"));
11
+ $("head").append($("<script type='text/javascript' src='/assets/time_machine/application.js' type='text/css' media='screen' />"));
12
+ });
13
+ </script>
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ TimeMachine::Engine.routes.draw do
2
+ # routes are added via engine.rb
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :time_machine do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,17 @@
1
+ module TimeMachine
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace TimeMachine
4
+
5
+ config.to_prepare do
6
+ ::ApplicationController.helper(TimeMachine::ApplicationHelper)
7
+ end
8
+
9
+ config.after_initialize do |app|
10
+ app.routes.append do
11
+ get '/time_machine/reset' => 'time_machine/application#reset'
12
+ get '/time_machine/:date' => 'time_machine/application#travel'
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module TimeMachine
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "time_machine/engine"
2
+ require "timecop"
3
+
4
+ module TimeMachine
5
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: time_machine
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Gudleik Rasch
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.2.8
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 3.2.8
30
+ - !ruby/object:Gem::Dependency
31
+ name: jquery-rails
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: timecop
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Development tool for changing Time.now in your rails app
63
+ email:
64
+ - gudleik@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - app/assets/images/time_machine/calendar-disabled.png
70
+ - app/assets/images/time_machine/calendar.png
71
+ - app/assets/images/time_machine/metallic/calendar.png
72
+ - app/assets/images/time_machine/metallic/default-date.png
73
+ - app/assets/images/time_machine/metallic/disabled-date.png
74
+ - app/assets/images/time_machine/metallic/header.png
75
+ - app/assets/images/time_machine/metallic/selected-date.png
76
+ - app/assets/images/time_machine/metallic/titles.png
77
+ - app/assets/javascripts/time_machine/application.js
78
+ - app/assets/javascripts/time_machine/datepicker.coffee
79
+ - app/assets/javascripts/time_machine/zebra_datepicker.js
80
+ - app/assets/stylesheets/time_machine/application.sass
81
+ - app/assets/stylesheets/time_machine/datepicker.css
82
+ - app/controllers/time_machine/application_controller.rb
83
+ - app/helpers/time_machine/application_helper.rb
84
+ - app/views/application/_time_machine.html.erb
85
+ - config/routes.rb
86
+ - lib/tasks/time_machine_tasks.rake
87
+ - lib/time_machine/engine.rb
88
+ - lib/time_machine/version.rb
89
+ - lib/time_machine.rb
90
+ - MIT-LICENSE
91
+ - Rakefile
92
+ - README.rdoc
93
+ homepage: https://github.com/gudleik/time_machine
94
+ licenses: []
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ segments:
106
+ - 0
107
+ hash: -4077653272273999823
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ segments:
115
+ - 0
116
+ hash: -4077653272273999823
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 1.8.23
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: Provides timetravelling in your rails app
123
+ test_files: []