sitepress-core 2.0.0.beta8 → 2.0.0.beta9
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.
- checksums.yaml +4 -4
- data/lib/sitepress/asset.rb +16 -41
- data/lib/sitepress/formats.rb +2 -0
- data/lib/sitepress/node.rb +1 -1
- data/lib/sitepress/path.rb +112 -16
- data/lib/sitepress/resource.rb +2 -4
- data/lib/sitepress/source_node_mapper.rb +16 -13
- data/lib/sitepress/version.rb +1 -1
- data/sitepress-core.gemspec +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a7a004d33fe5e05c2e1831ebcd902dc9c6bbcbf4650437b6e36984a1eb0e263
|
4
|
+
data.tar.gz: 9bd65a5f76ee6b166337887619e825c48c4580cb082448c63c8d78d1c549759b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 213d67af29c1e88c03f3ad72cb81001a2a938f418ca41717288f757581a409ec6daba877bdca903bb0a650c140d71e7252c113d2b4e0d9334b2e2726122ddb54
|
7
|
+
data.tar.gz: 68e40ac58a005c54262b050a3bc430eb3d2b81124705ce8aca39a87a3f0d07dd0fe9ab43283ead764c8afa9a00bf611fe6a903c2beb24d91b7eced7226b3ca7a
|
data/lib/sitepress/asset.rb
CHANGED
@@ -17,41 +17,13 @@ module Sitepress
|
|
17
17
|
|
18
18
|
extend Forwardable
|
19
19
|
def_delegators :frontmatter, :data, :body
|
20
|
+
def_delegators :path, :handler, :node_name, :format, :exists?
|
20
21
|
|
21
22
|
def initialize(path: , mime_type: nil)
|
22
23
|
# The MIME::Types gem returns an array when types are looked up.
|
23
24
|
# This grabs the first one, which is likely the intent on these lookups.
|
24
25
|
@mime_type = Array(mime_type).first
|
25
|
-
@path =
|
26
|
-
end
|
27
|
-
|
28
|
-
# List of all file extensions.
|
29
|
-
def extensions
|
30
|
-
path.basename.to_s.split(".").drop(1)
|
31
|
-
end
|
32
|
-
|
33
|
-
def basename
|
34
|
-
path.basename.to_s.split(".").first
|
35
|
-
end
|
36
|
-
alias :node_name :basename
|
37
|
-
|
38
|
-
def format_basename
|
39
|
-
[basename, format_extension].join(".")
|
40
|
-
end
|
41
|
-
|
42
|
-
# Returns the format extension.
|
43
|
-
def format_extension
|
44
|
-
extensions.first
|
45
|
-
end
|
46
|
-
|
47
|
-
# The base name with the format extension.
|
48
|
-
def format_name
|
49
|
-
[basename, format_extension].join(".")
|
50
|
-
end
|
51
|
-
|
52
|
-
# Returns a list of the rendering extensions.
|
53
|
-
def template_extensions
|
54
|
-
extensions.drop(1)
|
26
|
+
@path = Path.new path
|
55
27
|
end
|
56
28
|
|
57
29
|
# Treat resources with the same request path as equal.
|
@@ -63,19 +35,22 @@ module Sitepress
|
|
63
35
|
@mime_type ||= inferred_mime_type || DEFAULT_MIME_TYPE
|
64
36
|
end
|
65
37
|
|
66
|
-
|
67
|
-
|
38
|
+
# Used by the Rails controller to short circuit additional processing if the
|
39
|
+
# asset is not renderable (e.g. is it erb or haml?)
|
40
|
+
def renderable?
|
41
|
+
!!handler
|
68
42
|
end
|
69
43
|
|
70
44
|
private
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
45
|
+
def frontmatter
|
46
|
+
Frontmatter.new File.read path
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns the mime type of the file extension. If a type can't
|
50
|
+
# be resolved then we'll just grab the first type.
|
51
|
+
def inferred_mime_type
|
52
|
+
format_extension = path.format&.to_s
|
53
|
+
MIME::Types.type_for(format_extension).first if format_extension
|
54
|
+
end
|
80
55
|
end
|
81
56
|
end
|
data/lib/sitepress/formats.rb
CHANGED
data/lib/sitepress/node.rb
CHANGED
@@ -80,7 +80,7 @@ module Sitepress
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def inspect
|
83
|
-
"<#{self.class}: name=#{name.inspect} formats=#{formats.
|
83
|
+
"<#{self.class}: name=#{name.inspect}, formats=#{formats.extensions.inspect}, children=#{children.map(&:name).inspect}, resource_request_paths=#{formats.map(&:request_path)}>"
|
84
84
|
end
|
85
85
|
|
86
86
|
def dig(*args)
|
data/lib/sitepress/path.rb
CHANGED
@@ -1,31 +1,127 @@
|
|
1
|
+
require "pathname"
|
2
|
+
require "mime-types"
|
3
|
+
|
1
4
|
module Sitepress
|
2
5
|
class Path
|
3
|
-
|
6
|
+
# Default handler extensions. Handlers are anything that render or
|
7
|
+
# manipulate the contents of the file into a different output, like
|
8
|
+
# ERB or HAML.
|
9
|
+
HANDLER_EXTENSIONS = %i[haml erb md markdown]
|
10
|
+
|
11
|
+
# The root node name is a blank string.
|
12
|
+
ROOT_NODE_NAME = "".freeze
|
13
|
+
|
14
|
+
# The name of the root path
|
15
|
+
ROOT_PATH = "/".freeze
|
16
|
+
|
17
|
+
attr_reader :handler, :format, :path, :node_name, :dirname, :basename
|
18
|
+
|
19
|
+
# When Rails boots, it sets the handler extensions so that paths
|
20
|
+
# can be properly parsed.
|
21
|
+
class << self
|
22
|
+
attr_writer :handler_extensions
|
23
|
+
|
24
|
+
def handler_extensions
|
25
|
+
@handler_extensions ||= HANDLER_EXTENSIONS
|
26
|
+
end
|
27
|
+
end
|
4
28
|
|
5
|
-
|
29
|
+
def initialize(path, path_seperator: File::SEPARATOR, handler_extensions: self.class.handler_extensions)
|
30
|
+
@path = path.to_s
|
31
|
+
@path_seperator = Regexp.new(path_seperator)
|
32
|
+
@handler_extensions = handler_extensions
|
33
|
+
parse
|
34
|
+
end
|
35
|
+
|
36
|
+
def node_names
|
37
|
+
@node_names ||= node_name_ancestors.push(node_name)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Necessary for operations like `File.read path` where `path` is an instance
|
41
|
+
# of this object.
|
42
|
+
def to_str
|
43
|
+
@path
|
44
|
+
end
|
45
|
+
alias :to_s :to_str
|
46
|
+
|
47
|
+
def ==(path)
|
48
|
+
to_s == path.to_s
|
49
|
+
end
|
6
50
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
|
51
|
+
def exists?
|
52
|
+
File.exists? path
|
53
|
+
end
|
54
|
+
|
55
|
+
def expand_path
|
56
|
+
File.expand_path path
|
11
57
|
end
|
12
58
|
|
13
59
|
def format
|
14
|
-
|
15
|
-
return nil if format.nil? or format.empty?
|
16
|
-
format.to_sym
|
60
|
+
(handler_is_format? ? handler : @format)&.to_sym
|
17
61
|
end
|
18
62
|
|
19
63
|
private
|
20
|
-
|
21
|
-
|
64
|
+
# TODO: I don't want to look this up everytime I try to figure out the
|
65
|
+
# extension. I'll have to create an extension registry .
|
66
|
+
|
67
|
+
# Rails has handlers, like `:html` and `:raw` that are both
|
68
|
+
# handlers and formats. If we don't account for this, then the object
|
69
|
+
# would return a `nil` for a file named `blah.html`.
|
70
|
+
def handler_is_format?
|
71
|
+
return false if @handler.nil?
|
72
|
+
@format.nil? and MIME::Types.type_for(@handler.to_s).any?
|
73
|
+
end
|
74
|
+
|
75
|
+
def parse
|
76
|
+
@dirname, @basename = File.split(path)
|
77
|
+
parse_basename
|
78
|
+
end
|
79
|
+
|
80
|
+
# Given a filename, this will work out the extensions, formats, and node_name.
|
81
|
+
def parse_basename
|
82
|
+
base = basename
|
83
|
+
filename, extname = split_filename(base)
|
84
|
+
|
85
|
+
# This is a root path, so we have to treat it a little differently
|
86
|
+
# so that the node mapper and node names work properly.
|
87
|
+
if filename == ROOT_PATH and extname.nil?
|
88
|
+
@node_name = ROOT_NODE_NAME
|
89
|
+
elsif extname
|
90
|
+
extname = extname.to_sym
|
91
|
+
|
92
|
+
# We have an extension! Let's figure out if its a handler or not.
|
93
|
+
if @handler_extensions.include? extname
|
94
|
+
# Yup, its a handler. Set those variables accordingly.
|
95
|
+
@handler = extname
|
96
|
+
base = filename
|
97
|
+
end
|
98
|
+
|
99
|
+
# Now let's get the format (e.g. :html, :xml, :json) for the path and
|
100
|
+
# the key, which is just the basename without the format extension.
|
101
|
+
@node_name, format = split_filename(base)
|
102
|
+
@format = format
|
103
|
+
else
|
104
|
+
@node_name = filename
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# If given a path `/a/b/c`, thsi would return `["a", "b", "c"].
|
109
|
+
def node_name_ancestors
|
110
|
+
strip_leading_prefix(File.dirname(path)).split(@path_seperator)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Make it easier to split the last extension off a filename.
|
114
|
+
# For example, if you run `split_filename("c.taco.html")`
|
115
|
+
# it would return `["c.taco", "html"]`. If you ran it against
|
116
|
+
# something like `split_filename("c")`, it would return `["c"]`
|
117
|
+
def split_filename(string)
|
118
|
+
base, _, extension = string.rpartition(".")
|
119
|
+
base.empty? ? [extension] : [base, extension]
|
22
120
|
end
|
23
121
|
|
24
|
-
|
25
|
-
|
26
|
-
@
|
27
|
-
@file = File.basename(file, @ext)
|
28
|
-
@node_names = path.split(@delimiter).push(@file)
|
122
|
+
# Strips leading `/` or leading `.` if the path is relative.
|
123
|
+
def strip_leading_prefix(dirname)
|
124
|
+
dirname.to_s.gsub(/^#{@path_seperator}|\./, "")
|
29
125
|
end
|
30
126
|
end
|
31
127
|
end
|
data/lib/sitepress/resource.rb
CHANGED
@@ -6,7 +6,7 @@ module Sitepress
|
|
6
6
|
# and may be altered by the resource proxy.
|
7
7
|
class Resource
|
8
8
|
extend Forwardable
|
9
|
-
def_delegators :asset, :mime_type
|
9
|
+
def_delegators :asset, :mime_type, :handler
|
10
10
|
|
11
11
|
attr_writer :body, :data
|
12
12
|
attr_reader :node, :asset, :format
|
@@ -14,8 +14,6 @@ module Sitepress
|
|
14
14
|
# Default scope for querying parent/child/sibling resources.
|
15
15
|
DEFAULT_FILTER_SCOPE = :same
|
16
16
|
|
17
|
-
RENDERABLE_MEDIA_TYPE = "text".freeze
|
18
|
-
|
19
17
|
def initialize(asset:, node:, format: nil)
|
20
18
|
@asset = asset
|
21
19
|
@node = node
|
@@ -67,7 +65,7 @@ module Sitepress
|
|
67
65
|
# parse. When this returns true in some cases, a reference to the file will be
|
68
66
|
# passed and skip all the overhead of trying to parse and render.
|
69
67
|
def renderable?
|
70
|
-
asset.
|
68
|
+
asset.renderable?
|
71
69
|
end
|
72
70
|
|
73
71
|
private
|
@@ -4,10 +4,11 @@ module Sitepress
|
|
4
4
|
class SourceNodeMapper
|
5
5
|
# Exclude swap files created by Textmate and vim from being added
|
6
6
|
# to the sitemap.
|
7
|
-
|
8
|
-
"
|
9
|
-
"
|
10
|
-
".DS_Store"
|
7
|
+
IGNORE_FILE_PATTERNS = [
|
8
|
+
"*~", # Created by many editors when things crash
|
9
|
+
"*.swp", # Created by vim
|
10
|
+
".DS_Store", # Created by our friends at Apple
|
11
|
+
"*.orig" # Created when there's a git conflict
|
11
12
|
]
|
12
13
|
|
13
14
|
# Partial rails prefix.
|
@@ -22,12 +23,13 @@ module Sitepress
|
|
22
23
|
|
23
24
|
# Mounts the source files from the path to the given node.
|
24
25
|
def mount(node)
|
25
|
-
paths.each do |path
|
26
|
+
paths.each do |path|
|
26
27
|
if path.directory?
|
28
|
+
name = File.basename path
|
27
29
|
SourceNodeMapper.new(path: path).mount node.add_child(name)
|
28
30
|
else
|
29
31
|
asset = Asset.new(path: path)
|
30
|
-
node.add_child(
|
32
|
+
node.add_child(asset.node_name).formats.add(format: asset.format, asset: asset)
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
@@ -37,21 +39,22 @@ module Sitepress
|
|
37
39
|
def paths
|
38
40
|
Enumerator.new do |y|
|
39
41
|
root.each_child do |path|
|
40
|
-
next if
|
41
|
-
|
42
|
-
|
43
|
-
node_name, node_format, template_handler = path.basename.to_s.split(".")
|
44
|
-
y << [ path, node_name, node_format&.to_sym ]
|
42
|
+
next if ignore_file? path
|
43
|
+
y << path
|
45
44
|
end
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
48
|
+
def ignore_file?(path)
|
49
|
+
is_partial_file?(path) or matches_ignore_file_pattern?(path)
|
50
|
+
end
|
51
|
+
|
49
52
|
def is_partial_file?(path)
|
50
53
|
path.basename.to_s.start_with? PARTIAL_PREFIX
|
51
54
|
end
|
52
55
|
|
53
|
-
def
|
54
|
-
|
56
|
+
def matches_ignore_file_pattern?(path)
|
57
|
+
IGNORE_FILE_PATTERNS.any? { |pattern| path.fnmatch? pattern }
|
55
58
|
end
|
56
59
|
end
|
57
60
|
end
|
data/lib/sitepress/version.rb
CHANGED
data/sitepress-core.gemspec
CHANGED
@@ -8,6 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Sitepress::VERSION
|
9
9
|
spec.authors = ["Brad Gessler"]
|
10
10
|
spec.email = ["bradgessler@gmail.com"]
|
11
|
+
spec.licenses = ["MIT"]
|
11
12
|
|
12
13
|
spec.summary = %q{An embeddable file-backed content management system.}
|
13
14
|
spec.homepage = "https://github.com/sitepress/sitepress"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sitepress-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.beta9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brad Gessler
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -89,7 +89,8 @@ files:
|
|
89
89
|
- lib/sitepress/version.rb
|
90
90
|
- sitepress-core.gemspec
|
91
91
|
homepage: https://github.com/sitepress/sitepress
|
92
|
-
licenses:
|
92
|
+
licenses:
|
93
|
+
- MIT
|
93
94
|
metadata: {}
|
94
95
|
post_install_message:
|
95
96
|
rdoc_options: []
|