adva-static 0.0.9 → 0.0.11
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/lib/adva/static.rb +5 -2
- data/lib/adva/static/export.rb +1 -1
- data/lib/adva/static/export/store.rb +2 -2
- data/lib/adva/static/export/templates/config.ru +34 -10
- data/lib/adva/static/import.rb +13 -6
- data/lib/adva/static/import/format.rb +25 -29
- data/lib/adva/static/import/model.rb +9 -10
- data/lib/adva/static/import/model/base.rb +20 -43
- data/lib/adva/static/import/model/blog.rb +11 -17
- data/lib/adva/static/import/model/page.rb +1 -16
- data/lib/adva/static/import/model/post.rb +21 -48
- data/lib/adva/static/import/model/section.rb +17 -23
- data/lib/adva/static/import/model/site.rb +11 -35
- data/lib/adva/static/import/source.rb +17 -72
- data/lib/adva/static/import/source/base.rb +59 -0
- data/lib/adva/static/import/source/blog.rb +37 -0
- data/lib/adva/static/import/source/page.rb +17 -0
- data/lib/adva/static/import/source/path.rb +84 -0
- data/lib/adva/static/import/source/post.rb +67 -0
- data/lib/adva/static/import/source/section.rb +39 -0
- data/lib/adva/static/import/source/site.rb +44 -0
- data/lib/adva/static/server.rb +38 -0
- data/lib/adva/static/{rack → server}/export.rb +1 -1
- data/lib/adva/static/{rack → server}/request.rb +1 -1
- data/lib/adva/static/{rack → server}/static.rb +2 -2
- data/lib/adva/static/{rack → server}/watch.rb +4 -4
- data/lib/adva/static/server/watch/handler.rb +57 -0
- data/lib/adva/tasks/static.rb +3 -4
- data/lib/adva_static/version.rb +1 -1
- data/lib/testing/step_definitions.rb +3 -0
- data/lib/testing/test_helper.rb +36 -31
- metadata +145 -104
- data/lib/adva/static/rack.rb +0 -15
- data/lib/adva/static/watch.rb +0 -7
- data/lib/adva/static/watch/handler.rb +0 -57
data/lib/adva/static.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
require 'adva/core'
|
2
|
+
require 'adva/blog'
|
3
|
+
require 'adva/cache'
|
4
|
+
require 'adva/categories'
|
5
|
+
require 'adva/markup'
|
2
6
|
|
3
7
|
module Adva
|
4
8
|
class Static < ::Rails::Engine
|
5
9
|
autoload :Export, 'adva/static/export'
|
6
10
|
autoload :Import, 'adva/static/import'
|
7
|
-
autoload :Watch, 'adva/static/watch'
|
8
|
-
autoload :Rack, 'adva/static/rack'
|
9
11
|
autoload :Setup, 'adva/static/setup'
|
12
|
+
autoload :Server, 'adva/static/server'
|
10
13
|
|
11
14
|
include Adva::Engine
|
12
15
|
end
|
data/lib/adva/static/export.rb
CHANGED
@@ -1,14 +1,38 @@
|
|
1
|
-
|
1
|
+
# This config.ru file simply serves static files in the format exported by
|
2
|
+
# adva-static. I.e. you can use it (e.g.) to deploy exported html files to
|
3
|
+
# Heroku.
|
2
4
|
|
3
|
-
|
5
|
+
class Static < ::Rack::File
|
6
|
+
attr_reader :app, :root
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
+
def initialize(app, root)
|
9
|
+
@app = app
|
10
|
+
@root = root
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
if get?(env) && path = static(env)
|
15
|
+
super(env.merge('PATH_INFO' => path))
|
16
|
+
else
|
17
|
+
app.call(env)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
8
22
|
|
9
|
-
|
10
|
-
|
11
|
-
|
23
|
+
def static(env)
|
24
|
+
path = env['PATH_INFO'].chomp('/')
|
25
|
+
[path, "#{path}.html", "#{path}/index.html"].detect { |path| file?(path) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def file?(path)
|
29
|
+
File.file?(File.join(root, ::Rack::Utils.unescape(path)))
|
30
|
+
end
|
31
|
+
|
32
|
+
def get?(env)
|
33
|
+
env['REQUEST_METHOD'] == 'GET'
|
34
|
+
end
|
35
|
+
end
|
12
36
|
|
13
|
-
|
14
|
-
run
|
37
|
+
use Static, ::File.expand_path('..', __FILE__)
|
38
|
+
run lambda { [404, { 'content-type' => 'text/html' }, '<h1>404 Not found.</h1>'] }
|
data/lib/adva/static/import.rb
CHANGED
@@ -9,22 +9,23 @@ module Adva
|
|
9
9
|
attr_reader :root
|
10
10
|
|
11
11
|
def initialize(options = {})
|
12
|
-
@root =
|
12
|
+
@root = Source::Path.new(File.expand_path(options[:source] || 'import'))
|
13
13
|
end
|
14
14
|
|
15
15
|
def run
|
16
16
|
Adva.out.puts "importing from #{root}"
|
17
17
|
Account.all.each(&:destroy)
|
18
|
-
|
18
|
+
Category.delete_all
|
19
|
+
Model::Site.new(root).update!
|
19
20
|
end
|
20
21
|
|
21
22
|
def import(path)
|
22
|
-
model = recognize(path)
|
23
|
-
model.
|
23
|
+
model = recognize(path)
|
24
|
+
model.update! if model
|
24
25
|
end
|
25
26
|
|
26
27
|
def request_for(path)
|
27
|
-
model = recognize(path)
|
28
|
+
model = recognize(path)
|
28
29
|
Request.new(model.source, model.record, model.attributes)
|
29
30
|
end
|
30
31
|
|
@@ -35,7 +36,13 @@ module Adva
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def recognize(path)
|
38
|
-
Model.recognize([
|
39
|
+
Model.build(Source.recognize([normalize_path(path)]).first)
|
40
|
+
end
|
41
|
+
|
42
|
+
def normalize_path(path)
|
43
|
+
path.gsub!(root.to_s, '')
|
44
|
+
path.gsub!(/^\//, '')
|
45
|
+
root.join(path)
|
39
46
|
end
|
40
47
|
end
|
41
48
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'hashr'
|
2
|
+
|
1
3
|
module Adva
|
2
4
|
class Static
|
3
5
|
class Import
|
@@ -14,42 +16,36 @@ module Adva
|
|
14
16
|
@path = path
|
15
17
|
end
|
16
18
|
|
17
|
-
def load(target)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
def define_attribute?(target, name)
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
def define_attribute(target, name)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
19
|
+
# def load(target)
|
20
|
+
# data.each do |name, value|
|
21
|
+
# define_attribute(target, name) # if define_attribute?(target, name)
|
22
|
+
# target.instance_variable_set(:"@#{name}", value)
|
23
|
+
# end if data.is_a?(Hash)
|
24
|
+
# end
|
25
|
+
|
26
|
+
# def define_attribute?(target, name)
|
27
|
+
# !target.attribute_name?(name) && target.column_name?(name)
|
28
|
+
# end
|
29
|
+
|
30
|
+
# def define_attribute(target, name)
|
31
|
+
# # target.attribute_names << name
|
32
|
+
# target.attribute_names.uniq!
|
33
|
+
# target.class.send(:attr_reader, name) unless target.respond_to?(name)
|
34
|
+
# end
|
33
35
|
end
|
34
36
|
|
35
37
|
class Yml < Base
|
36
|
-
def
|
37
|
-
|
38
|
+
def read
|
39
|
+
YAML.load_file(path)
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
41
43
|
class Jekyll < Base
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
data
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def file
|
52
|
-
@file ||= File.read(path)
|
44
|
+
def read
|
45
|
+
File.read(path) =~ /^(---\s*\n.*?\n?)^---\s*$\n?(.*)/m
|
46
|
+
data = YAML.load($1) rescue {}
|
47
|
+
data.merge!(:body => $2) if $2
|
48
|
+
data
|
53
49
|
end
|
54
50
|
end
|
55
51
|
end
|
@@ -2,20 +2,19 @@ module Adva
|
|
2
2
|
class Static
|
3
3
|
class Import
|
4
4
|
module Model
|
5
|
-
autoload :Base,
|
6
|
-
autoload :Blog,
|
7
|
-
autoload :Page,
|
8
|
-
autoload :Post,
|
9
|
-
autoload :Section,
|
10
|
-
autoload :Site,
|
5
|
+
autoload :Base, 'adva/static/import/model/base'
|
6
|
+
autoload :Blog, 'adva/static/import/model/blog'
|
7
|
+
autoload :Page, 'adva/static/import/model/page'
|
8
|
+
autoload :Post, 'adva/static/import/model/post'
|
9
|
+
autoload :Section, 'adva/static/import/model/section'
|
10
|
+
autoload :Site, 'adva/static/import/model/site'
|
11
11
|
|
12
12
|
class << self
|
13
|
-
def
|
14
|
-
|
15
|
-
types.map { |type| type.recognize(sources) }.flatten.compact.sort
|
13
|
+
def build(source, *args)
|
14
|
+
const_get(source.model_name).new(source, *args)
|
16
15
|
end
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
21
|
-
end
|
20
|
+
end
|
@@ -8,69 +8,46 @@ module Adva
|
|
8
8
|
attr_reader :source, :attribute_names
|
9
9
|
|
10
10
|
def initialize(source)
|
11
|
-
@source = source
|
12
|
-
load
|
11
|
+
@source = source.is_a?(Source::Base) ? source : Source.build(model_name, source)
|
13
12
|
end
|
14
13
|
|
15
|
-
def
|
16
|
-
|
17
|
-
attributes = Hash[*attributes.compact.flatten_once]
|
18
|
-
record && record.id ? attributes.merge(:id => record.id.to_s) : attributes
|
19
|
-
end
|
20
|
-
|
21
|
-
def attribute_name?(name)
|
22
|
-
attribute_names.include?(name.to_sym)
|
23
|
-
end
|
24
|
-
|
25
|
-
def column_name?(name)
|
26
|
-
model.column_names.include?(name.to_s)
|
14
|
+
def update!
|
15
|
+
updated_record.save!
|
27
16
|
end
|
28
17
|
|
29
18
|
def updated_record
|
30
19
|
record.tap { |record| record.attributes = attributes }
|
31
20
|
end
|
32
21
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
def site_id
|
38
|
-
site.id.to_s
|
39
|
-
end
|
40
|
-
|
41
|
-
def slug
|
42
|
-
source.basename
|
43
|
-
end
|
44
|
-
|
45
|
-
def path
|
46
|
-
source.path
|
22
|
+
def attributes
|
23
|
+
attributes = attribute_names.map { |name| [name, attribute_value(name)] if attribute_value(name) } # attribute?(name)
|
24
|
+
attributes = Hashr.new(Hash[*attributes.compact.flatten_once])
|
25
|
+
record && record.id ? attributes.merge(:id => record.id.to_s) : attributes
|
47
26
|
end
|
48
27
|
|
49
|
-
def
|
50
|
-
|
28
|
+
def attribute_names
|
29
|
+
source.data.keys
|
51
30
|
end
|
52
31
|
|
53
|
-
def
|
54
|
-
source.
|
32
|
+
def attribute_value(name)
|
33
|
+
respond_to?(name) ? self.send(name) : source.data.send(name)
|
55
34
|
end
|
56
35
|
|
57
|
-
def
|
58
|
-
|
36
|
+
def attribute?(name)
|
37
|
+
source.data.key?(name) || respond_to?(name)
|
59
38
|
end
|
60
39
|
|
61
|
-
def
|
62
|
-
|
63
|
-
format = Format.for(loadable) and format.load(self)
|
64
|
-
end
|
40
|
+
def model
|
41
|
+
model_name.constantize
|
65
42
|
end
|
66
43
|
|
67
|
-
def
|
68
|
-
|
44
|
+
def model_name
|
45
|
+
@model_name ||= self.class.name.demodulize
|
69
46
|
end
|
70
47
|
|
71
|
-
def
|
72
|
-
|
73
|
-
end
|
48
|
+
# def updated_at
|
49
|
+
# source.mtime
|
50
|
+
# end
|
74
51
|
end
|
75
52
|
end
|
76
53
|
end
|
@@ -3,28 +3,22 @@ module Adva
|
|
3
3
|
class Import
|
4
4
|
module Model
|
5
5
|
class Blog < Section
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
sources = Array(sources)
|
11
|
-
posts = sources.select { |source| Post.permalink?(source) }
|
12
|
-
posts = sources.map(&:directory).map(&:files).flatten.select { |s| Post.permalink?(s) } if posts.blank?
|
13
|
-
|
14
|
-
blogs = posts.map { |post| Post.new(post).section_source }.flatten.uniq
|
15
|
-
blogs = blogs.map { |blog| sources.detect { |source| blog.path == source.path } || blog }
|
16
|
-
|
17
|
-
sources.replace(sources - blogs - posts.map(&:self_and_parents).flatten)
|
18
|
-
blogs.map { |source| new(source) }
|
19
|
-
end
|
6
|
+
def update!
|
7
|
+
super
|
8
|
+
categories.each { |category| category.save! }
|
9
|
+
posts.each { |post| post.update! }
|
20
10
|
end
|
21
11
|
|
22
12
|
def attribute_names
|
23
|
-
@attribute_names ||= super
|
13
|
+
@attribute_names ||= super - [:categories, :posts]
|
14
|
+
end
|
15
|
+
|
16
|
+
def categories
|
17
|
+
@categories ||= source.categories.map { |category| Category.new(:name => category, :section => record) }
|
24
18
|
end
|
25
19
|
|
26
|
-
def
|
27
|
-
|
20
|
+
def posts
|
21
|
+
@posts ||= source.posts.map { |post| Post.new(post, self) }
|
28
22
|
end
|
29
23
|
end
|
30
24
|
end
|
@@ -3,23 +3,8 @@ module Adva
|
|
3
3
|
class Import
|
4
4
|
module Model
|
5
5
|
class Page < Section
|
6
|
-
PATTERN = %r([\w-]+\.(#{Source::TYPES.join('|')})$)
|
7
|
-
|
8
|
-
class << self
|
9
|
-
def recognize(sources)
|
10
|
-
return [] if sources.blank?
|
11
|
-
|
12
|
-
pages = sources.select { |source| source.to_s =~ PATTERN }
|
13
|
-
sources.replace(sources - pages)
|
14
|
-
|
15
|
-
pages = pages.map { |source| source.self_and_parents.map(&:find_or_self) }.flatten.uniq
|
16
|
-
pages = pages.map { |source| new(source) }
|
17
|
-
pages
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
6
|
def attribute_names
|
22
|
-
@attribute_names ||= super
|
7
|
+
@attribute_names ||= super | [:body]
|
23
8
|
end
|
24
9
|
end
|
25
10
|
end
|
@@ -3,73 +3,46 @@ module Adva
|
|
3
3
|
class Import
|
4
4
|
module Model
|
5
5
|
class Post < Base
|
6
|
-
|
6
|
+
delegate :permalink, :published_at, :to => :source
|
7
7
|
|
8
|
-
|
9
|
-
def recognize(sources)
|
10
|
-
posts = sources.select { |source| source.path =~ PERMALINK }
|
11
|
-
sources.replace(sources - posts.map(&:self_and_parents).flatten)
|
12
|
-
posts.map { |post| new(post) }
|
13
|
-
end
|
8
|
+
attr_reader :section
|
14
9
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
def strip_permalink(source)
|
20
|
-
Source.new(source.to_s.gsub(Post::PERMALINK, ''), source.root)
|
21
|
-
end
|
10
|
+
def initialize(source, section = nil)
|
11
|
+
super(source)
|
12
|
+
@section = section
|
22
13
|
end
|
23
14
|
|
24
|
-
def
|
25
|
-
|
15
|
+
def update!
|
16
|
+
super
|
17
|
+
record.update_attributes!(:categories => categories)
|
26
18
|
end
|
27
19
|
|
28
20
|
def record
|
29
|
-
@record ||=
|
30
|
-
end
|
31
|
-
|
32
|
-
def site_id
|
33
|
-
section.site_id.to_s
|
34
|
-
end
|
35
|
-
|
36
|
-
def section
|
37
|
-
@section ||= Blog.new(section_source).record
|
21
|
+
@record ||= ::Post.by_permalink(*permalink).first || ::Post.new
|
38
22
|
end
|
39
23
|
|
40
|
-
def
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
def section_source
|
45
|
-
@section_source ||= begin
|
46
|
-
source = self.class.strip_permalink(self.source)
|
47
|
-
if source.path.present?
|
48
|
-
source.find_or_self
|
49
|
-
else
|
50
|
-
Source.new(source.join('index'), source.root).find_or_self
|
51
|
-
end
|
52
|
-
end
|
24
|
+
def attribute_names
|
25
|
+
@attribute_names ||= (super | [:site_id, :section_id, :title, :body, :slug, :published_at, :filter]) - [:categories]
|
53
26
|
end
|
54
27
|
|
55
|
-
def
|
56
|
-
|
28
|
+
def site
|
29
|
+
section.try(:site)
|
57
30
|
end
|
58
31
|
|
59
|
-
def
|
60
|
-
|
32
|
+
def site_id
|
33
|
+
site ? site.record.id.to_s : nil
|
61
34
|
end
|
62
35
|
|
63
|
-
def
|
64
|
-
@
|
36
|
+
def section
|
37
|
+
@section ||= Section.new(source.strip_permalink)
|
65
38
|
end
|
66
39
|
|
67
|
-
def
|
68
|
-
|
40
|
+
def section_id
|
41
|
+
section ? section.record.id.to_s : nil
|
69
42
|
end
|
70
43
|
|
71
|
-
def
|
72
|
-
@
|
44
|
+
def categories
|
45
|
+
@categories ||= source.data.categories.map { |name| Category.find_or_create_by_name(name, :section_id => section.record.id) }
|
73
46
|
end
|
74
47
|
end
|
75
48
|
end
|