cartoonist 0.0.16 → 0.0.17

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ //= require jquery
2
+ $ ->
3
+ $("input[name='q']").focus()
@@ -3,6 +3,9 @@ class Admin::AccountsController < AdminCartoonistController
3
3
  @users = User.order(:name).all
4
4
  end
5
5
 
6
+ def new
7
+ end
8
+
6
9
  def create
7
10
  user = User.create_user params
8
11
  redirect_to "/admin/accounts"
@@ -1,21 +1,12 @@
1
1
  class CartoonistController < ActionController::Base
2
2
  helper :cartoonist
3
3
  protect_from_forgery
4
- before_filter :check_mobile
5
4
 
6
5
  private
7
6
  def handle_unverified_request
8
7
  raise ActionController::InvalidAuthenticityToken.new
9
8
  end
10
9
 
11
- def check_mobile
12
- @mobile = (request.subdomain == "m") || params[:mobile]
13
- end
14
-
15
- def mobile?
16
- @mobile
17
- end
18
-
19
10
  def cache_type
20
11
  "www"
21
12
  end
@@ -1,4 +1,13 @@
1
1
  module CartoonistHelper
2
+ def partial(name, locals = {}, &block)
3
+ if block
4
+ raise "Cannot have a 'body' local when a block is given!" if locals.include?(:body)
5
+ locals[:body] = capture &block
6
+ end
7
+
8
+ render :partial => name, :locals => locals
9
+ end
10
+
2
11
  def selected(a, b = true)
3
12
  if a == b
4
13
  'selected="selected"'.html_safe
@@ -11,6 +20,12 @@ module CartoonistHelper
11
20
  end
12
21
  end
13
22
 
23
+ def format_time(time, fmt)
24
+ if time
25
+ time.localtime.strftime fmt
26
+ end
27
+ end
28
+
14
29
  def markdown(text)
15
30
  Markdown.render text
16
31
  end
@@ -40,10 +55,6 @@ module CartoonistHelper
40
55
  @rss_title
41
56
  end
42
57
 
43
- def mobile?
44
- @mobile
45
- end
46
-
47
58
  def enable_disqus!(options)
48
59
  @disqus_enabled = true
49
60
  @disqus_options = options
@@ -0,0 +1,40 @@
1
+ module Expirable
2
+ def expired?
3
+ expired_at && (expired_at < DateTime.now)
4
+ end
5
+
6
+ def expire_from(params)
7
+ if params[:expire_now].present? && !expired?
8
+ self.expired_at = Time.now
9
+ elsif params[:expire_in_hour].present? && !expired?
10
+ self.expired_at = 1.hour.from_now
11
+ elsif params[:expire_day_after].present? && !expired?
12
+ self.expired_at = posted_at + 1.day
13
+ elsif params[:expire_3_days_after].present? && !expired?
14
+ self.expired_at = posted_at + 3.days
15
+ elsif params[:expired].present? && params[:expired_at_date].present?
16
+ time = "#{params[:expired_at_date]} #{params[:expired_at_hour]}:#{params[:expired_at_minute]} #{params[:expired_at_meridiem]}"
17
+ time = DateTime.parse time
18
+ time = Time.local time.year, time.month, time.day, time.hour, time.min
19
+ self.expired_at = time
20
+ elsif params[:expired].present?
21
+ self.expired_at = 1.hour.from_now
22
+ else
23
+ self.expired_at = nil
24
+ end
25
+ end
26
+
27
+ def self.included(base)
28
+ base.extend ClassMethods
29
+ end
30
+
31
+ module ClassMethods
32
+ def expired
33
+ where "#{quoted_table_name}.expired_at IS NOT NULL AND #{quoted_table_name}.expired_at < ?", DateTime.now
34
+ end
35
+
36
+ def unexpired
37
+ where "#{quoted_table_name}.expired_at IS NULL OR #{quoted_table_name}.expired_at >= ?", DateTime.now
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,33 @@
1
+ module Lockable
2
+ def locked?
3
+ locked
4
+ end
5
+
6
+ def toggle_lock_target
7
+ if locked?
8
+ "unlock"
9
+ else
10
+ "lock"
11
+ end
12
+ end
13
+
14
+ def lock_disabled_html
15
+ if locked?
16
+ 'disabled="disabled"'.html_safe
17
+ end
18
+ end
19
+
20
+ def lock!
21
+ self.locked = true
22
+ save!
23
+ end
24
+
25
+ def unlock!
26
+ self.locked = false
27
+ save!
28
+ end
29
+
30
+ def ensure_unlocked!
31
+ raise "Cannot update this when it is locked!" if locked?
32
+ end
33
+ end
@@ -2,6 +2,7 @@ class PageCache
2
2
  attr_reader :name
3
3
 
4
4
  CACHE_PATH = File.join Rails.root, "public/cache"
5
+ EXTENSIONS = ["html", "json", "rss"]
5
6
 
6
7
  def initialize(name)
7
8
  @name = name
@@ -25,17 +26,21 @@ class PageCache
25
26
 
26
27
  def www?
27
28
  return @www_exists unless @www_exists.nil?
28
- @www_exists = File.exists? File.join(CACHE_PATH, "#{name}.www.html")
29
+ @www_exists = EXTENSIONS.any? do |extension|
30
+ File.exists? File.join(CACHE_PATH, "#{name}.www.#{extension}")
31
+ end
29
32
  end
30
33
 
31
34
  def www_tmp?
32
35
  return @www_tmp_exists unless @www_tmp_exists.nil?
33
- @www_tmp_exists = File.exists? File.join(CACHE_PATH, "#{name}.www.tmp.html")
36
+ @www_tmp_exists = EXTENSIONS.any? do |extension|
37
+ File.exists? File.join(CACHE_PATH, "#{name}.www.tmp.#{extension}")
38
+ end
34
39
  end
35
40
 
36
41
  def expire!
37
42
  PageCache.cache_files(:with_gz => true).select do |file|
38
- extracted_name = file.sub /\.(?:www)(?:\.tmp)?\.html(?:.gz)?$/, ""
43
+ extracted_name = file.sub /\.(?:www)(?:\.tmp)?\.(?:#{EXTENSIONS.join "|"})(?:.gz)?$/, ""
39
44
  extracted_name == name
40
45
  end.each do |file|
41
46
  File.delete File.join(CACHE_PATH, file)
@@ -57,31 +62,40 @@ class PageCache
57
62
  end
58
63
 
59
64
  def cache_files(options = {})
60
- globber = "**/*.html"
61
- globber += "*" if options[:with_gz]
65
+ globs = EXTENSIONS.map do |extension|
66
+ globber = "**/*.#{extension}"
67
+ globber += "*" if options[:with_gz]
68
+ File.join CACHE_PATH, globber
69
+ end
62
70
 
63
- Dir.glob(File.join(CACHE_PATH, globber), File::FNM_DOTMATCH).map do |file|
71
+ Dir.glob(globs, File::FNM_DOTMATCH).map do |file|
64
72
  file.sub "#{CACHE_PATH}/", ""
65
73
  end
66
74
  end
67
75
 
68
76
  def cache_names
69
77
  cache_files.map do |file|
70
- file.sub /\.(?:www)(?:\.tmp)?\.html$/, ""
78
+ file.sub /\.(?:www)(?:\.tmp)?\.(?:#{EXTENSIONS.join "|"})$/, ""
71
79
  end.sort.uniq
72
80
  end
73
81
 
74
82
  def expire_www!
75
- File.delete *Dir.glob(File.join(CACHE_PATH, "**/*.www.html*"), File::FNM_DOTMATCH)
76
- File.delete *Dir.glob(File.join(CACHE_PATH, "**/*.www.tmp.html*"), File::FNM_DOTMATCH)
83
+ EXTENSIONS.each do |extension|
84
+ File.delete *Dir.glob(File.join(CACHE_PATH, "**/*.www.#{extension}*"), File::FNM_DOTMATCH)
85
+ File.delete *Dir.glob(File.join(CACHE_PATH, "**/*.www.tmp.#{extension}*"), File::FNM_DOTMATCH)
86
+ end
77
87
  end
78
88
 
79
89
  def expire_tmp!
80
- File.delete *Dir.glob(File.join(CACHE_PATH, "**/*.tmp.html*"), File::FNM_DOTMATCH)
90
+ EXTENSIONS.each do |extension|
91
+ File.delete *Dir.glob(File.join(CACHE_PATH, "**/*.tmp.#{extension}*"), File::FNM_DOTMATCH)
92
+ end
81
93
  end
82
94
 
83
95
  def expire_all!
84
- File.delete *Dir.glob(File.join(CACHE_PATH, "**/*.html*"), File::FNM_DOTMATCH)
96
+ EXTENSIONS.each do |extension|
97
+ File.delete *Dir.glob(File.join(CACHE_PATH, "**/*.#{extension}*"), File::FNM_DOTMATCH)
98
+ end
85
99
  end
86
100
  end
87
101
  end
@@ -23,6 +23,23 @@ module Postable
23
23
  end
24
24
  end
25
25
 
26
+ def post_from(params)
27
+ if params[:post_now].present? && !posted?
28
+ self.posted_at = Time.now
29
+ elsif params[:post_in_hour].present? && !posted?
30
+ self.posted_at = 1.hour.from_now
31
+ elsif params[:posted].present? && params[:posted_at_date].present?
32
+ time = "#{params[:posted_at_date]} #{params[:posted_at_hour]}:#{params[:posted_at_minute]} #{params[:posted_at_meridiem]}"
33
+ time = DateTime.parse time
34
+ time = Time.local time.year, time.month, time.day, time.hour, time.min
35
+ self.posted_at = time
36
+ elsif params[:posted].present?
37
+ self.posted_at = 1.hour.from_now
38
+ else
39
+ self.posted_at = nil
40
+ end
41
+ end
42
+
26
43
  def self.included(base)
27
44
  base.extend ClassMethods
28
45
  end
@@ -65,7 +65,7 @@ class Setting < ActiveRecord::Base
65
65
  @onchange = options[:onchange]
66
66
  @validation = options[:validation]
67
67
  @select_from = options[:select_from]
68
- raise "Invalid setting type #{@type}" unless [:string, :symbol, :boolean, :int, :float, :array, :hash].include? @type
68
+ raise "Invalid setting type #{@type}" unless [:text, :string, :symbol, :boolean, :int, :float, :array, :hash].include? @type
69
69
 
70
70
  # Auto create general tab and section if it isn't created
71
71
  if @tab == :general && !Setting::Tab[@tab]
@@ -80,6 +80,8 @@ class Setting < ActiveRecord::Base
80
80
  @default = options[:default]
81
81
  elsif @type == :string
82
82
  @default = ""
83
+ elsif @type == :text
84
+ @default = ""
83
85
  elsif @type == :symbol
84
86
  @default = :""
85
87
  elsif @type == :boolean
@@ -118,6 +120,8 @@ class Setting < ActiveRecord::Base
118
120
  case type
119
121
  when :string
120
122
  value
123
+ when :text
124
+ value
121
125
  when :symbol
122
126
  value.to_sym
123
127
  when :boolean
@@ -19,7 +19,7 @@
19
19
 
20
20
  <% @tab[section].settings.each do |setting| %>
21
21
  <%# Other setting types to come later %>
22
- <% next unless Setting::Meta[setting].select_from || [:string, :boolean, :int].include?(Setting::Meta[setting].type) %>
22
+ <% next unless Setting::Meta[setting].select_from || [:text, :string, :boolean, :int].include?(Setting::Meta[setting].type) %>
23
23
  <p class="setting">
24
24
  <input type="hidden" name="included_settings[]" value="<%= setting %>" />
25
25
  <label>
@@ -30,6 +30,9 @@
30
30
  <option value="<%= setting_select_value option %>" <%= selected setting_select_value(option), Setting[setting] %>><%= setting_select_label option %></option>
31
31
  <% end %>
32
32
  <select name="<%= setting %>" value="<%= Setting[setting] %>">
33
+ <% elsif Setting::Meta[setting].type == :text %>
34
+ <br />
35
+ <textarea name="<%= setting %>" cols="75" rows="15"><%= Setting[setting] %></textarea>
33
36
  <% elsif Setting::Meta[setting].type == :string %>
34
37
  <input type="text" name="<%= setting %>" value="<%= Setting[setting] %>" size="60" />
35
38
  <% elsif [:int, :float].include?(Setting::Meta[setting].type) %>
@@ -9,6 +9,7 @@
9
9
  <link rel="shortcut icon" href="http://<%= Setting[:domain] %><%= asset_path Cartoonist::Theme.favicon %>" type="image/x-icon" />
10
10
  <%= javascript_include_tag controller_path if Rails.application.assets.find_asset("#{controller_path}.js").present? %>
11
11
  </head>
12
+
12
13
  <body>
13
14
  <%= form_tag "/users/sign_out", :method => :delete do %>
14
15
  <p class="tabs">
@@ -0,0 +1,28 @@
1
+ <% body = "" if body.nil? %>
2
+ <% name_prefix = name.downcase %>
3
+ <% disabled_attr = 'disabled="disabled"'.html_safe if disabled %>
4
+
5
+ <label>
6
+ <input type="checkbox" name="<%= name_prefix %>" value="true" <%= checked !!time %> <%= disabled_attr %> /><%= name.capitalize %> at
7
+ </label>
8
+
9
+ <input type="text" name="<%= name_prefix %>_at_date" value="<%= format_time time, "%Y-%m-%d" %>" <%= disabled_attr %> />
10
+
11
+ <select name="<%= name_prefix %>_at_hour" <%= disabled_attr %>>
12
+ <% 1.upto 12 do |h| %>
13
+ <option value="<%= h %>" <%= selected h, format_time(time, "%-l").to_i %>><%= h %></option>
14
+ <% end %>
15
+ </select>
16
+
17
+ <select name="<%= name_prefix %>_at_minute" <%= disabled_attr %>>
18
+ <% 0.upto 60 do |m| %>
19
+ <option value="<%= m %>" <%= selected m, format_time(time, "%-M").to_i %>><%= m %></option>
20
+ <% end %>
21
+ </select>
22
+
23
+ <select name="<%= name_prefix %>_at_meridiem" <%= disabled_attr %>>
24
+ <option value="am" <%= selected "am", format_time(time, "%P") %>>am</option>
25
+ <option value="pm" <%= selected "pm", format_time(time, "%P") %>>pm</option>
26
+ </select>
27
+
28
+ <%= body %>
@@ -0,0 +1,23 @@
1
+ <%
2
+
3
+ if expirable && expirable.kind_of?(Postable)
4
+ posted = expirable.posted?
5
+ else
6
+ posted = true
7
+ end
8
+
9
+ submit_disabled_attr = 'disabled="disabled"'.html_safe if expirable && (expirable.locked? || expirable.expired? || !posted)
10
+
11
+ %>
12
+ <%= partial "shared/date_time_entry", :time => (expirable.expired_at if expirable),
13
+ :disabled => (expirable && expirable.locked?),
14
+ :name => "expired" do %>
15
+ <input type="submit" name="expire_now" value="Expire Now" <%= submit_disabled_attr %> />
16
+
17
+ <% if expirable && expirable.kind_of?(Postable) %>
18
+ <input type="submit" name="expire_day_after" value="Expire Day After" <%= submit_disabled_attr %> />
19
+ <input type="submit" name="expire_3_days_after" value="Expire 3 Days After" <%= submit_disabled_attr %> />
20
+ <% else %>
21
+ <input type="submit" name="expire_in_hour" value="Expire in an Hour" <%= submit_disabled_attr %> />
22
+ <% end %>
23
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <% submit_disabled_attr = 'disabled="disabled"'.html_safe if postable && (postable.locked? || postable.posted?) %>
2
+ <%= partial "shared/date_time_entry", :time => (postable.posted_at if postable),
3
+ :disabled => (postable && postable.locked?),
4
+ :name => "posted" do %>
5
+ <input type="submit" name="post_now" value="Post Now" <%= submit_disabled_attr %> />
6
+ <input type="submit" name="post_in_hour" value="Post in an Hour" <%= submit_disabled_attr %> />
7
+ <% end %>
@@ -293,6 +293,7 @@ module Cartoonist
293
293
  Mime::Type.register "image/x-icon", :ico
294
294
  Mime::Type.register "application/octet-stream", :tgz
295
295
  Cartoonist::Admin::Tab.add :general, :url => "/admin", :order => 3
296
+ Cartoonist::Asset.add "admin/search.js"
296
297
  Cartoonist::Migration.add_for self
297
298
 
298
299
  Cartoonist::Backup.for :files do
@@ -336,7 +337,7 @@ module Cartoonist
336
337
  devise_for :users, :controllers => { :omniauth_callbacks => "admin/omniauth_callbacks" }
337
338
 
338
339
  namespace :admin do
339
- resources :accounts, :only => [:create, :destroy, :edit, :index, :show, :update]
340
+ resources :accounts
340
341
 
341
342
  resources :cache, :constraints => { :id => /.*/ }, :only => [:destroy, :index] do
342
343
  collection do
@@ -0,0 +1,100 @@
1
+ Nginxtra::Config::Extension.partial "nginx.conf", "cartoonist_rails" do |args, block|
2
+ rails_server = args[:server] || :passenger
3
+ ssl_details = args[:ssl]
4
+
5
+ if ssl_details
6
+ default_port = 443
7
+ else
8
+ default_port = 80
9
+ end
10
+
11
+ if rails_server == :passenger && !@passenger_requirements_done
12
+ @config.require_passenger!
13
+ passenger_root!
14
+ passenger_ruby!
15
+ @passenger_requirements_done = true
16
+ end
17
+
18
+ server do
19
+ listen(args[:port] || default_port)
20
+ server_name(args[:server_name] || "localhost")
21
+ root File.join(File.absolute_path(File.expand_path(args[:root] || ".")), "public")
22
+ gzip_static "on"
23
+ passenger_on! if rails_server == :passenger
24
+ rails_env(args[:environment] || "production")
25
+
26
+ if ssl_details
27
+ ssl "on"
28
+ ssl_certificate ssl_details[:ssl_cert]
29
+ ssl_certificate_key ssl_details[:ssl_key]
30
+ @config.compile_option "--with-http_ssl_module"
31
+ end
32
+
33
+ block.call
34
+ end
35
+ end
36
+
37
+ Nginxtra::Config::Extension.partial "nginx.conf", "cartoonist" do |args, block|
38
+ if !@passenger_requirements_done
39
+ @config.require_passenger!
40
+ passenger_root!
41
+ passenger_ruby!
42
+ @passenger_requirements_done = true
43
+ end
44
+
45
+ cartoonist_type = args[:type] || "www"
46
+ server_name = args[:server_name]
47
+ root_path = args[:root]
48
+ ssl_details = args[:ssl]
49
+ ssl_details = { :ssl => ssl_details } if ssl_details
50
+ short_expiration = args[:short_expiration] || "2h"
51
+ long_expiration = args[:long_expiration] || "7d"
52
+
53
+ [{}, ssl_details].compact.each do |additional_options|
54
+ options = { :server => :custom, :server_name => server_name, :root => root_path }.merge additional_options
55
+
56
+ cartoonist_rails options do
57
+ location "~*", "^/_long_expiration_/#{cartoonist_type}(/.*?)(?:\\.html)?$" do
58
+ expires long_expiration
59
+ add_header "Cache-Control", "public"
60
+ try_files "$1", "$1.html", "/cache/static$1", "@passenger"
61
+ end
62
+
63
+ ["/cache/static$uri", "$uri", "$uri.html"].each do |condition|
64
+ _if "-f #{root_path}/public#{condition}" do
65
+ rewrite "^(.*)$", "/_long_expiration_/#{cartoonist_type}$1", "last"
66
+ end
67
+ end
68
+
69
+ ["html", "json", "rss"].each do |extension|
70
+ location "~*", "^/_short_#{extension}_expiration_/#{cartoonist_type}(/.*?)(?:\\.#{extension})?$" do
71
+ expires short_expiration
72
+ add_header "Cache-Control", "public"
73
+ try_files "/cache$1.#{cartoonist_type}.tmp.#{extension}", "@passenger"
74
+ end
75
+
76
+ location "~*", "^/_long_#{extension}_expiration_/#{cartoonist_type}(/.*?)(?:\\.#{extension})?$" do
77
+ expires long_expiration
78
+ add_header "Cache-Control", "public"
79
+ try_files "/cache$1.#{cartoonist_type}.#{extension}", "@passenger"
80
+ end
81
+
82
+ _if "-f #{root_path}/public/cache$uri.#{cartoonist_type}.tmp.#{extension}" do
83
+ rewrite "^(.*)$", "/_short_#{extension}_expiration_/#{cartoonist_type}$1", "last"
84
+ end
85
+
86
+ _if "-f #{root_path}/public/cache$uri.#{cartoonist_type}.#{extension}" do
87
+ rewrite "^(.*)$", "/_long_#{extension}_expiration_/#{cartoonist_type}$1", "last"
88
+ end
89
+ end
90
+
91
+ location "/" do
92
+ try_files "/_jump_to_passenger_", "@passenger"
93
+ end
94
+
95
+ location "@passenger" do
96
+ passenger_on!
97
+ end
98
+ end
99
+ end
100
+ end
@@ -2,7 +2,7 @@ module Cartoonist
2
2
  class Version
3
3
  class << self
4
4
  def to_s
5
- "0.0.16"
5
+ "0.0.17"
6
6
  end
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,103 +1,135 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: cartoonist
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.17
4
5
  prerelease:
5
- version: 0.0.16
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Mike Virata-Stone
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2012-12-15 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2013-02-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: devise
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
18
+ requirements:
21
19
  - - ~>
22
- - !ruby/object:Gem::Version
20
+ - !ruby/object:Gem::Version
23
21
  version: 2.1.2
24
22
  type: :runtime
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: jquery-rails
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
30
25
  none: false
31
- requirements:
26
+ requirements:
32
27
  - - ~>
33
- - !ruby/object:Gem::Version
28
+ - !ruby/object:Gem::Version
29
+ version: 2.1.2
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
34
37
  version: 2.1.4
35
38
  type: :runtime
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: omniauth-openid
39
39
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.1.4
46
+ - !ruby/object:Gem::Dependency
47
+ name: omniauth-openid
48
+ requirement: !ruby/object:Gem::Requirement
41
49
  none: false
42
- requirements:
50
+ requirements:
43
51
  - - ~>
44
- - !ruby/object:Gem::Version
52
+ - !ruby/object:Gem::Version
45
53
  version: 1.0.1
46
54
  type: :runtime
47
- version_requirements: *id003
48
- - !ruby/object:Gem::Dependency
49
- name: railties
50
55
  prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
52
57
  none: false
53
- requirements:
58
+ requirements:
54
59
  - - ~>
55
- - !ruby/object:Gem::Version
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.1
62
+ - !ruby/object:Gem::Dependency
63
+ name: railties
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
56
69
  version: 3.2.9
57
70
  type: :runtime
58
- version_requirements: *id004
59
- - !ruby/object:Gem::Dependency
60
- name: redcarpet
61
71
  prerelease: false
62
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
63
73
  none: false
64
- requirements:
74
+ requirements:
65
75
  - - ~>
66
- - !ruby/object:Gem::Version
76
+ - !ruby/object:Gem::Version
77
+ version: 3.2.9
78
+ - !ruby/object:Gem::Dependency
79
+ name: redcarpet
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
67
85
  version: 2.2.2
68
86
  type: :runtime
69
- version_requirements: *id005
70
- - !ruby/object:Gem::Dependency
71
- name: rubyzip
72
87
  prerelease: false
73
- requirement: &id006 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
74
89
  none: false
75
- requirements:
90
+ requirements:
76
91
  - - ~>
77
- - !ruby/object:Gem::Version
92
+ - !ruby/object:Gem::Version
93
+ version: 2.2.2
94
+ - !ruby/object:Gem::Dependency
95
+ name: rubyzip
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
78
101
  version: 0.9.9
79
102
  type: :runtime
80
- version_requirements: *id006
81
- - !ruby/object:Gem::Dependency
82
- name: minitar
83
103
  prerelease: false
84
- requirement: &id007 !ruby/object:Gem::Requirement
104
+ version_requirements: !ruby/object:Gem::Requirement
85
105
  none: false
86
- requirements:
106
+ requirements:
87
107
  - - ~>
88
- - !ruby/object:Gem::Version
108
+ - !ruby/object:Gem::Version
109
+ version: 0.9.9
110
+ - !ruby/object:Gem::Dependency
111
+ name: minitar
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
89
117
  version: 0.5.4
90
118
  type: :runtime
91
- version_requirements: *id007
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.5.4
92
126
  description: This provides the main functionality and plugin api for Cartoonist.
93
127
  email: reasonnumber@gmail.com
94
128
  executables: []
95
-
96
129
  extensions: []
97
-
98
130
  extra_rdoc_files: []
99
-
100
- files:
131
+ files:
132
+ - app/assets/javascripts/admin/search.js.coffee
101
133
  - app/assets/javascripts/cartoonist.js.erb
102
134
  - app/assets/stylesheets/admin.css.scss
103
135
  - app/controllers/admin/accounts_controller.rb
@@ -117,6 +149,8 @@ files:
117
149
  - app/models/belongs_to_entity.rb
118
150
  - app/models/database_file.rb
119
151
  - app/models/entity.rb
152
+ - app/models/expirable.rb
153
+ - app/models/lockable.rb
120
154
  - app/models/markdown.rb
121
155
  - app/models/page_cache.rb
122
156
  - app/models/postable.rb
@@ -144,6 +178,9 @@ files:
144
178
  - app/views/layouts/cartoonist.xml.erb
145
179
  - app/views/layouts/general_admin.html.erb
146
180
  - app/views/layouts/users.html.erb
181
+ - app/views/shared/_date_time_entry.html.erb
182
+ - app/views/shared/_expire_date_time.html.erb
183
+ - app/views/shared/_post_date_time.html.erb
147
184
  - app/views/site/robots.text.erb
148
185
  - app/views/site/sitemap.xml.erb
149
186
  - cartoonist.gemspec
@@ -156,36 +193,33 @@ files:
156
193
  - db/migrate/20121205091909_add_omniautable_to_users.rb
157
194
  - lib/cartoonist.rb
158
195
  - lib/cartoonist/engine.rb
196
+ - lib/cartoonist/nginxtra.rb
159
197
  - lib/cartoonist/version.rb
160
198
  - public/errors/404.html
161
199
  - public/errors/422.html
162
200
  - public/errors/500.html
163
201
  homepage: http://reasonnumber.com/cartoonist
164
202
  licenses: []
165
-
166
203
  post_install_message:
167
204
  rdoc_options: []
168
-
169
- require_paths:
205
+ require_paths:
170
206
  - lib
171
- required_ruby_version: !ruby/object:Gem::Requirement
207
+ required_ruby_version: !ruby/object:Gem::Requirement
172
208
  none: false
173
- requirements:
174
- - - ">="
175
- - !ruby/object:Gem::Version
176
- version: "0"
177
- required_rubygems_version: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ! '>='
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ required_rubygems_version: !ruby/object:Gem::Requirement
178
214
  none: false
179
- requirements:
180
- - - ">="
181
- - !ruby/object:Gem::Version
182
- version: "0"
215
+ requirements:
216
+ - - ! '>='
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
183
219
  requirements: []
184
-
185
220
  rubyforge_project:
186
221
  rubygems_version: 1.8.24
187
222
  signing_key:
188
223
  specification_version: 3
189
224
  summary: Cartoonist Core
190
225
  test_files: []
191
-