days 0.0.1.earlier → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.rspec +2 -0
- data/.travis.yml +9 -0
- data/README.md +2 -0
- data/app/images/glyphicons-halflings-white.png +0 -0
- data/app/images/glyphicons-halflings.png +0 -0
- data/app/javascripts/bootstrap.js +2159 -0
- data/app/javascripts/bootstrap.min.js +6 -0
- data/app/javascripts/jquery-1.8.3.min.js +2 -0
- data/app/stylesheets/admin/login.scss +26 -0
- data/app/stylesheets/admin.scss +28 -0
- data/app/stylesheets/bootstrap-responsive.css +1092 -0
- data/app/stylesheets/bootstrap-responsive.min.css +9 -0
- data/app/stylesheets/bootstrap.css +6039 -0
- data/app/stylesheets/bootstrap.min.css +9 -0
- data/app/stylesheets/style.scss +132 -0
- data/app/views/admin/categories.haml +53 -0
- data/app/views/admin/entries/form.haml +55 -0
- data/app/views/admin/entries/index.haml +31 -0
- data/app/views/admin/index.haml +0 -0
- data/app/views/admin/login.haml +19 -0
- data/app/views/admin/setup.haml +22 -0
- data/app/views/admin/users/form.haml +25 -0
- data/app/views/admin/users/index.haml +23 -0
- data/app/views/admin.haml +37 -0
- data/app/views/entries.haml +4 -0
- data/app/views/entry.haml +32 -0
- data/app/views/layout.haml +32 -0
- data/bin/days +5 -0
- data/bootstrap.sh +41 -0
- data/days.gemspec +25 -2
- data/lib/days/app/admin/categories.rb +43 -0
- data/lib/days/app/admin/entries.rb +72 -0
- data/lib/days/app/admin/session.rb +28 -0
- data/lib/days/app/admin/setup.rb +20 -0
- data/lib/days/app/admin/users.rb +59 -0
- data/lib/days/app/admin.rb +11 -0
- data/lib/days/app/entries.rb +84 -0
- data/lib/days/app.rb +110 -0
- data/lib/days/command.rb +158 -0
- data/lib/days/config.rb +42 -0
- data/lib/days/helpers.rb +101 -0
- data/lib/days/migrate/20121221000000_create_entries.rb +18 -0
- data/lib/days/migrate/20121221001000_create_users.rb +12 -0
- data/lib/days/migrate/20121221002000_create_categories.rb +17 -0
- data/lib/days/migrator.rb +33 -0
- data/lib/days/models/category.rb +12 -0
- data/lib/days/models/entry.rb +63 -0
- data/lib/days/models/user.rb +14 -0
- data/lib/days/models.rb +7 -0
- data/lib/days/version.rb +1 -1
- data/lib/days.rb +3 -1
- data/scripts/lokka_export.rb +45 -0
- data/skeleton/days/Gemfile +11 -0
- data/skeleton/days/config.ru +6 -0
- data/skeleton/days/config.yml +33 -0
- data/skeleton/days/db/.gitkeep +0 -0
- data/spec/controllers/admin/categories_spec.rb +100 -0
- data/spec/controllers/admin/entries_spec.rb +185 -0
- data/spec/controllers/admin/session_spec.rb +112 -0
- data/spec/controllers/admin/setup_spec.rb +85 -0
- data/spec/controllers/admin/users_spec.rb +163 -0
- data/spec/controllers/entries_spec.rb +129 -0
- data/spec/environment/Gemfile +11 -0
- data/spec/environment/config.ru +6 -0
- data/spec/environment/config.yml +32 -0
- data/spec/environment/db/.gitkeep +0 -0
- data/spec/fixtures/categories.yml +5 -0
- data/spec/fixtures/entries.yml +25 -0
- data/spec/fixtures/users.yml +6 -0
- data/spec/helpers_spec.rb +117 -0
- data/spec/models/entry_spec.rb +238 -0
- data/spec/shared/admin.rb +8 -0
- data/spec/spec_helper.rb +134 -0
- data/tasks +9 -0
- metadata +353 -9
data/lib/days/command.rb
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'fileutils'
|
3
|
+
require_relative 'config'
|
4
|
+
require_relative 'app'
|
5
|
+
require_relative 'migrator'
|
6
|
+
|
7
|
+
module Days
|
8
|
+
class Command < Thor
|
9
|
+
SKELETON_PATH = File.expand_path(File.join(__FILE__, '..', '..', '..', 'skeleton', 'days'))
|
10
|
+
desc "init [DIR]", "Initialize days.gem world in the directory (default = ./)"
|
11
|
+
def init(dir = ".")
|
12
|
+
puts "Initializing new Days environment on #{File.expand_path dir}"
|
13
|
+
FileUtils.cp_r Dir["#{SKELETON_PATH}/*"], "#{dir}/"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "init_theme [DIR]", "Generate template of theme (views) to DIR (default = ./)"
|
17
|
+
def init_theme(dir = ".")
|
18
|
+
if File.exists?(File.join(dir, 'views')) || File.exists?(File.join(dir, 'stylesheets'))
|
19
|
+
puts "This will override the following:"
|
20
|
+
puts "* #{dir}/views/entries.haml"
|
21
|
+
puts "* #{dir}/views/entry.haml"
|
22
|
+
puts "* #{dir}/views/layout.haml"
|
23
|
+
puts "* #{dir}/stylesheets/style.scss"
|
24
|
+
|
25
|
+
print "Continue (y/n)? "
|
26
|
+
|
27
|
+
while _ = $stdin.gets
|
28
|
+
case _
|
29
|
+
when /^y|yes$/
|
30
|
+
break
|
31
|
+
when /^n|no$/
|
32
|
+
puts 'Cancelled.'
|
33
|
+
return
|
34
|
+
else
|
35
|
+
print "Please answer in 'yes' or 'no' or 'y' or 'n': "
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
require 'fileutils'
|
41
|
+
|
42
|
+
root = File.expand_path(File.join(__FILE__, '..', '..', '..', 'app'))
|
43
|
+
FileUtils.mkdir_p File.join(dir, 'views')
|
44
|
+
FileUtils.mkdir_p File.join(dir, 'stylesheets')
|
45
|
+
|
46
|
+
%w(entries.haml entry.haml layout.haml).each do |file|
|
47
|
+
FileUtils.cp(File.join(root, 'views', file),
|
48
|
+
File.join(dir, 'views', file))
|
49
|
+
end
|
50
|
+
|
51
|
+
FileUtils.cp(File.join(root, 'stylesheets', 'style.scss'),
|
52
|
+
File.join(dir, 'stylesheets', 'style.scss'))
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "server", "Starts the server"
|
56
|
+
method_option :config, :type => :string, :aliases => "-c"
|
57
|
+
method_option :port, :type => :numeric, :aliases => "-p", :default => 3162
|
58
|
+
method_option :bind, :type => :string, :aliases => "-b", :default => nil
|
59
|
+
method_option :environment, :type => :string, :aliases => "-e", :default => "development"
|
60
|
+
method_option :pid, :type => :string, :aliases => "-c"
|
61
|
+
def server
|
62
|
+
set_env
|
63
|
+
App.config = config
|
64
|
+
rack_options = {
|
65
|
+
app: App.rack,
|
66
|
+
Port: options[:port],
|
67
|
+
Host: options[:bind],
|
68
|
+
daemonize: options[:daemonize],
|
69
|
+
environment: options[:environment],
|
70
|
+
server: options[:server],
|
71
|
+
}
|
72
|
+
rack_options.merge!(pid: File.expand_path(options[:pid])) if options[:pid]
|
73
|
+
Rack::Server.start(rack_options)
|
74
|
+
end
|
75
|
+
|
76
|
+
# desc "precompile", "Precompile the assets for production"
|
77
|
+
# method_option :config, :type => :string, :aliases => "-c"
|
78
|
+
# def precompile
|
79
|
+
# end
|
80
|
+
|
81
|
+
desc "migrate [ENV]", "Run database migration for environment (default = development)"
|
82
|
+
method_option :config, :type => :string, :aliases => "-c"
|
83
|
+
method_option :version, :type => :numeric, :aliases => "-v", :default => nil
|
84
|
+
method_option :scope, :type => :string, :aliases => "-s"
|
85
|
+
method_option :verbose, :type => :boolean, :aliases => "-V", :default => true
|
86
|
+
def migrate(env = "development")
|
87
|
+
set_env env
|
88
|
+
Days::Migrator.start(config, options)
|
89
|
+
end
|
90
|
+
|
91
|
+
desc "console [ENV]", "Start console using pry (default = development)"
|
92
|
+
method_option :config, :type => :string, :aliases => "-c"
|
93
|
+
def console(env = "development")
|
94
|
+
set_env env
|
95
|
+
require 'pry'
|
96
|
+
require_relative 'models'
|
97
|
+
config.establish_db_connection()
|
98
|
+
Pry.start(binding)
|
99
|
+
end
|
100
|
+
|
101
|
+
desc "import FILE", "Import entries from file."
|
102
|
+
method_option :config, :type => :string, :aliases => "-c"
|
103
|
+
method_option :environment, :type => :string, :aliases => "-e", :default => "development"
|
104
|
+
def import(file)
|
105
|
+
set_env
|
106
|
+
config.establish_db_connection()
|
107
|
+
require 'json'
|
108
|
+
users = {}
|
109
|
+
categories = {}
|
110
|
+
open(file, 'r') do |io|
|
111
|
+
io.readlines.each do |line|
|
112
|
+
line = JSON.parse(line)
|
113
|
+
|
114
|
+
attributes ={}
|
115
|
+
if Entry.where(id: line['id']).count.zero?
|
116
|
+
attributes[:id] = line['id']
|
117
|
+
end
|
118
|
+
|
119
|
+
if line['user']
|
120
|
+
if users.has_key?(line['user'])
|
121
|
+
user = users[line['user']]
|
122
|
+
else
|
123
|
+
user = users[line['user']] = User.where(login_name: line['user']).first
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
attributes[:user] = user if user
|
128
|
+
end
|
129
|
+
|
130
|
+
if line['category']
|
131
|
+
attributes[:categories] = line['category'].map do |category_name|
|
132
|
+
categories[category_name] ||= Category.find_or_create_by_name!(category_name)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
attributes[:slug] = line['slug'] if line['slug']
|
137
|
+
attributes[:title] = line['title'] if line['title']
|
138
|
+
attributes[:body] = line['body'] if line['body']
|
139
|
+
attributes[:published_at] = line['published_at'] if line['published_at']
|
140
|
+
attributes[:draft] = line['draft'] if line['draft']
|
141
|
+
|
142
|
+
p attributes[:title]
|
143
|
+
Entry.create!(attributes)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
|
150
|
+
def set_env(env = nil)
|
151
|
+
App.environment = env || options[:environment] || ENV["RACK_ENV"] || :development
|
152
|
+
end
|
153
|
+
|
154
|
+
def config
|
155
|
+
@_days_config ||= Config.new(options[:config] || "./config.yml")
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
data/lib/days/config.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative 'app'
|
2
|
+
require 'active_record'
|
3
|
+
require 'logger'
|
4
|
+
require 'settingslogic'
|
5
|
+
|
6
|
+
module Days
|
7
|
+
class Config < Settingslogic
|
8
|
+
namespace App.environment.to_s
|
9
|
+
|
10
|
+
def initialize(hash_or_file = {}, section = nil)
|
11
|
+
super
|
12
|
+
if section.nil?
|
13
|
+
if String === hash_or_file
|
14
|
+
self[:root] = File.dirname(hash_or_file)
|
15
|
+
else
|
16
|
+
self[:root] = "."
|
17
|
+
end
|
18
|
+
|
19
|
+
self['database'].tap do |hash|
|
20
|
+
next unless hash
|
21
|
+
if hash['adapter'] == 'sqlite3' && /^\// !~ hash['database']
|
22
|
+
hash['database'] = File.join(self.root, hash['database'])
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def establish_db_connection(force=false)
|
29
|
+
if !self.has_key?(:activerecord_log) || self.activerecord_log == true
|
30
|
+
ActiveRecord::Base.logger = Logger.new($stdout)
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
raise ActiveRecord::ConnectionNotEstablished if force
|
35
|
+
return ActiveRecord::Base.connection
|
36
|
+
rescue ActiveRecord::ConnectionNotEstablished
|
37
|
+
ActiveRecord::Base.establish_connection(self['database'] ? Hash[self.database] : ENV["DATABASE_URL"])
|
38
|
+
retry
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/days/helpers.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'rack/csrf'
|
2
|
+
|
3
|
+
module Days
|
4
|
+
module Helpers
|
5
|
+
def config
|
6
|
+
Days::App.config
|
7
|
+
end
|
8
|
+
|
9
|
+
def logged_in?
|
10
|
+
!!session[:user_id]
|
11
|
+
end
|
12
|
+
|
13
|
+
def current_user
|
14
|
+
@current_user ||= session[:user_id] ? User.where(id: session[:user_id]).first : nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def csrf_token
|
18
|
+
Rack::Csrf.csrf_token(env)
|
19
|
+
end
|
20
|
+
|
21
|
+
def csrf_tag
|
22
|
+
Rack::Csrf.csrf_tag(env)
|
23
|
+
end
|
24
|
+
|
25
|
+
def entry_path(entry)
|
26
|
+
return nil unless entry.published?
|
27
|
+
|
28
|
+
published_at = entry.published_at
|
29
|
+
hash = {
|
30
|
+
year: published_at.year.to_s.rjust(2, '0'),
|
31
|
+
month: published_at.month.to_s.rjust(2, '0'),
|
32
|
+
day: published_at.day.to_s.rjust(2, '0'),
|
33
|
+
hour: published_at.hour.to_s.rjust(2, '0'),
|
34
|
+
minute: published_at.min.to_s.rjust(2, '0'),
|
35
|
+
second: published_at.sec.to_s.rjust(2, '0'),
|
36
|
+
slug: entry.slug, id: entry.id
|
37
|
+
}
|
38
|
+
config.permalink.gsub(/{(\w+?)}/) { hash[$1.to_sym] }
|
39
|
+
end
|
40
|
+
|
41
|
+
def lookup_entry(path)
|
42
|
+
regexp = Regexp.compile(Regexp.escape(config.permalink).gsub(/\\{(\w+?)\\}/) { "(?<#{$1}>.+?)" } + "$")
|
43
|
+
m = regexp.match(path)
|
44
|
+
return nil unless m
|
45
|
+
|
46
|
+
match = m.names.inject({}) do |hash, k|
|
47
|
+
hash[k.to_sym] = m[k]
|
48
|
+
hash
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
if match[:id] || match[:slug]
|
53
|
+
if match[:id]
|
54
|
+
query = Entry.where(id: match[:id])
|
55
|
+
else
|
56
|
+
query = Entry.where(slug: match[:slug])
|
57
|
+
end
|
58
|
+
|
59
|
+
entry = query.first
|
60
|
+
return nil unless entry
|
61
|
+
published_at = entry.published_at
|
62
|
+
return nil unless published_at
|
63
|
+
|
64
|
+
return nil if match[:slug] && match[:slug] != entry.slug
|
65
|
+
return nil if match[:id] && match[:id].to_i != entry.id
|
66
|
+
return nil if match[:year] && match[:year].to_i != published_at.year
|
67
|
+
return nil if match[:month] && match[:month].to_i != published_at.month
|
68
|
+
return nil if match[:day] && match[:day].to_i != published_at.day
|
69
|
+
return nil if match[:hour] && match[:hour].to_i != published_at.hour
|
70
|
+
return nil if match[:minute] && match[:minute].to_i != published_at.min
|
71
|
+
return nil if match[:second] && match[:second].to_i != published_at.sec
|
72
|
+
|
73
|
+
return entry
|
74
|
+
else
|
75
|
+
match_time = {}.tap do |h|
|
76
|
+
[:year, :month, :day, :hour, :minute, :second].each do |k|
|
77
|
+
h[k] = match[k] && match[k].to_i
|
78
|
+
end
|
79
|
+
end
|
80
|
+
range_begin = Time.local(
|
81
|
+
match_time[:year], match_time[:month] || 1, match_time[:day] || 1,
|
82
|
+
match_time[:hour] || 0, match_time[:minute] || 0, match_time[:second] || 0
|
83
|
+
)
|
84
|
+
range_end = Time.local(
|
85
|
+
match_time[:year], match_time[:month] || 12, match_time[:day] || 31,
|
86
|
+
match_time[:hour] || 23, match_time[:minute] || 59, match_time[:second] || 59
|
87
|
+
)
|
88
|
+
|
89
|
+
query = Entry.where(published_at: (range_begin .. range_end))
|
90
|
+
|
91
|
+
if query.count.zero?
|
92
|
+
return nil
|
93
|
+
elsif query.count == 1
|
94
|
+
return query.first
|
95
|
+
else
|
96
|
+
return query
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateEntries < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :entries do |t|
|
4
|
+
t.string :title
|
5
|
+
t.text :body
|
6
|
+
t.text :rendered
|
7
|
+
t.datetime :published_at
|
8
|
+
t.integer :user_id
|
9
|
+
t.string :slug
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
|
14
|
+
add_index :entries, :published_at
|
15
|
+
add_index :entries, :user_id
|
16
|
+
add_index :entries, :slug
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class CreateCategories < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :categories do |t|
|
4
|
+
t.string :name
|
5
|
+
end
|
6
|
+
|
7
|
+
create_table :categories_entries do |t|
|
8
|
+
t.integer :category_id
|
9
|
+
t.integer :entry_id
|
10
|
+
end
|
11
|
+
|
12
|
+
add_index :categories, :name
|
13
|
+
|
14
|
+
add_index :categories_entries, :entry_id
|
15
|
+
add_index :categories_entries, :category_id
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Days
|
2
|
+
module Migrator
|
3
|
+
def self.start(config, options = {})
|
4
|
+
require 'active_record'
|
5
|
+
require 'active_support/core_ext/class/attribute_accessors.rb'
|
6
|
+
require 'active_record/schema_dumper'
|
7
|
+
|
8
|
+
config.establish_db_connection()
|
9
|
+
orig_logger = ActiveRecord::Base.logger
|
10
|
+
begin
|
11
|
+
ActiveRecord::Base.logger = nil unless options[:show_sql]
|
12
|
+
ActiveRecord::Migration.verbose = options[:verbose]
|
13
|
+
|
14
|
+
migration_paths = [
|
15
|
+
config[:migration_path] || "#{config.root}/db/migrate",
|
16
|
+
File.expand_path(File.join(__FILE__, '..', 'migrate'))
|
17
|
+
]
|
18
|
+
ActiveRecord::Migrator.migrate(migration_paths, options[:version]) do |migration|
|
19
|
+
options[:scope].blank? || (options[:scope] == migration.scope)
|
20
|
+
end
|
21
|
+
|
22
|
+
schema_file = config[:schema] || "#{config.root}/db/schema.rb"
|
23
|
+
File.open(schema_file, "w:utf-8") do |io|
|
24
|
+
ActiveRecord::SchemaDumper.dump ActiveRecord::Base.connection, io
|
25
|
+
end
|
26
|
+
|
27
|
+
self
|
28
|
+
ensure
|
29
|
+
ActiveRecord::Base.logger = orig_logger
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'stringex'
|
3
|
+
require 'redcarpet'
|
4
|
+
|
5
|
+
module Days
|
6
|
+
class Entry < ActiveRecord::Base
|
7
|
+
attr_accessible :title, :body, :slug, :published_at, :categories, :user, :draft
|
8
|
+
|
9
|
+
validates_uniqueness_of :slug
|
10
|
+
validates_presence_of :title, :body, :rendered, :slug
|
11
|
+
|
12
|
+
belongs_to :user, class_name: 'Days::User'
|
13
|
+
has_and_belongs_to_many :categories, class_name: 'Days::Category'
|
14
|
+
|
15
|
+
scope :published, -> do
|
16
|
+
includes(:categories).
|
17
|
+
where('published_at IS NOT NULL AND published_at <= ?', Time.now).
|
18
|
+
order('published_at DESC')
|
19
|
+
end
|
20
|
+
|
21
|
+
def draft=(x)
|
22
|
+
if x.present?
|
23
|
+
@draft = true
|
24
|
+
else
|
25
|
+
@draft = false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def draft?
|
30
|
+
@draft
|
31
|
+
end
|
32
|
+
alias draft draft?
|
33
|
+
|
34
|
+
def published?
|
35
|
+
self.published_at && self.published_at <= Time.now
|
36
|
+
end
|
37
|
+
|
38
|
+
def scheduled?
|
39
|
+
self.published_at && Time.now < self.published_at
|
40
|
+
end
|
41
|
+
|
42
|
+
def short_rendered
|
43
|
+
self.rendered.gsub(/<!-- *more *-->.+\z/m, block_given? ? yield(self) : '')
|
44
|
+
end
|
45
|
+
|
46
|
+
before_validation do
|
47
|
+
if draft?
|
48
|
+
self.published_at = nil
|
49
|
+
else
|
50
|
+
self.published_at ||= Time.now
|
51
|
+
end
|
52
|
+
|
53
|
+
if self.title && (!self.slug || self.slug.empty?)
|
54
|
+
self.slug = self.title.to_url
|
55
|
+
end
|
56
|
+
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML,
|
57
|
+
:autolink => true, :space_after_headers => true,
|
58
|
+
:no_intra_emphasis => true, :fenced_code_blocks => true,
|
59
|
+
:tables => true, :superscript => true)
|
60
|
+
self.rendered = markdown.render(self.body)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
module Days
|
4
|
+
class User < ActiveRecord::Base
|
5
|
+
has_secure_password
|
6
|
+
|
7
|
+
attr_accessible :login_name, :name, :password, :password_confirmation
|
8
|
+
|
9
|
+
validates_uniqueness_of :login_name
|
10
|
+
validates_presence_of :login_name, :name
|
11
|
+
|
12
|
+
has_many :entries, class_name: 'Days::Entry'
|
13
|
+
end
|
14
|
+
end
|
data/lib/days/models.rb
ADDED
data/lib/days/version.rb
CHANGED
data/lib/days.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
ActiveRecord::Base.establish_connection ENV["DATABASE_URL"]
|
5
|
+
|
6
|
+
class User < ActiveRecord::Base
|
7
|
+
has_many :entries
|
8
|
+
end
|
9
|
+
|
10
|
+
class Category < ActiveRecord::Base
|
11
|
+
has_many :entries
|
12
|
+
end
|
13
|
+
|
14
|
+
class Entry < ActiveRecord::Base
|
15
|
+
belongs_to :user
|
16
|
+
belongs_to :category
|
17
|
+
end
|
18
|
+
|
19
|
+
class Post < Entry
|
20
|
+
end
|
21
|
+
|
22
|
+
Post.order('id ASC').all.each do |post|
|
23
|
+
if 'kramdown' != post.markup
|
24
|
+
warn "WARN: #{post.slug} (#{post.id}) is not written in kramdown"
|
25
|
+
end
|
26
|
+
|
27
|
+
hash = {}
|
28
|
+
hash[:id] = post.id
|
29
|
+
hash[:user] = post.user.name
|
30
|
+
hash[:slug] = post.slug
|
31
|
+
hash[:title] = post.title
|
32
|
+
hash[:body] = post.body
|
33
|
+
if post.draft == 1
|
34
|
+
hash[:published_at] = post.created_at
|
35
|
+
else
|
36
|
+
hash[:published_at] = nil
|
37
|
+
hash[:draft] = true
|
38
|
+
end
|
39
|
+
if post.category
|
40
|
+
hash[:category] = [post.category.title]
|
41
|
+
else
|
42
|
+
hash[:category] = []
|
43
|
+
end
|
44
|
+
puts hash.to_json
|
45
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
defaults: &defaults
|
2
|
+
base_path: "/"
|
3
|
+
permalink: "/{year}/{month}/{slug}"
|
4
|
+
title: "My Blog"
|
5
|
+
|
6
|
+
development:
|
7
|
+
<<: *defaults
|
8
|
+
database:
|
9
|
+
adapter: sqlite3
|
10
|
+
database: db/development.sqlite3
|
11
|
+
pool: 5
|
12
|
+
timeout: 5000
|
13
|
+
|
14
|
+
test:
|
15
|
+
<<: *defaults
|
16
|
+
database:
|
17
|
+
adapter: sqlite3
|
18
|
+
database: db/test.sqlite3
|
19
|
+
pool: 5
|
20
|
+
timeout: 5000
|
21
|
+
|
22
|
+
production:
|
23
|
+
<<: *defaults
|
24
|
+
<% unless ENV["DATABASE_URL"] %>
|
25
|
+
database:
|
26
|
+
adapter: mysql2
|
27
|
+
encoding: utf8
|
28
|
+
database: days_production
|
29
|
+
pool: 5
|
30
|
+
username: foo
|
31
|
+
password: bar
|
32
|
+
socket: /tmp/mysql.sock
|
33
|
+
<% end %>
|
File without changes
|