gumdrop 0.5.2 → 0.6.0
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/ChangeLog.md +3 -0
- data/License +1 -1
- data/Notes.md +9 -1
- data/gumdrop.gemspec +4 -4
- data/lib/gumdrop/cli.rb +13 -3
- data/lib/gumdrop/content.rb +17 -15
- data/lib/gumdrop/context.rb +116 -111
- data/lib/gumdrop/data_manager.rb +93 -71
- data/lib/gumdrop/generator.rb +23 -18
- data/lib/gumdrop/server.rb +62 -110
- data/lib/gumdrop/site.rb +295 -0
- data/lib/gumdrop/version.rb +1 -1
- data/lib/gumdrop/view_helpers.rb +1 -1
- data/lib/gumdrop.rb +7 -114
- data/templates/backbone/Gumdrop +8 -8
- data/templates/backbone/config.ru +0 -4
- data/templates/backbone/source/default.htaccess.erb +2 -1
- data/templates/backbone/source/index.html.erb +1 -1
- data/templates/backbone/source/theme/templates/site.template.slim +1 -1
- data/templates/default/Gumdrop +7 -5
- data/templates/default/config.ru +0 -3
- data/templates/default/source/default.htaccess.erb +2 -1
- data/templates/default/source/theme/templates/site.template.slim +1 -1
- metadata +100 -97
- data/lib/gumdrop/build.rb +0 -116
- data/lib/gumdrop/dsl.rb +0 -30
- data/lib/gumdrop/logging.rb +0 -35
- data/lib/gumdrop/pager.rb +0 -49
- data/lib/gumdrop/utils.rb +0 -20
data/ChangeLog.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# v0.6
|
2
|
+
- Extracted Gumdrop::Build into Gumdrop::Site. Removed static Gumdrop#site.
|
3
|
+
|
1
4
|
# v0.5.2
|
2
5
|
- DeferredLoader changed to DataManager
|
3
6
|
- Added YamlDoc support to data collections -- a data format (.yamldoc) that strips YAML front matter and puts the content under the key 'content', or it will use a custom key from the front matter if the value of the pair is '_YAMLDOC_'
|
data/License
CHANGED
data/Notes.md
CHANGED
@@ -6,14 +6,22 @@
|
|
6
6
|
- What would happen with conflicts, last one in wins?
|
7
7
|
- Multiple data_dir too?
|
8
8
|
- Refactor code to not use Gumdrop as a singleton (static really)
|
9
|
-
- Add YamlDoc support for nodes?
|
9
|
+
- Add YamlDoc support for nodes? (Tilt compiler? or in Content)
|
10
10
|
|
11
11
|
|
12
|
+
- `Gumdrop.mode` :build, :serve (other?)
|
13
|
+
- `Gumdrop.env` (specified via -e on cli, default: production)
|
14
|
+
- Easy access to ENV in RenderingContext (MODE as well)
|
15
|
+
|
16
|
+
- configure block for each env/mode?
|
17
|
+
|
12
18
|
# TODO:
|
13
19
|
- New/Update Doc Site
|
14
20
|
- API for retrieving pages and pages under a path (simple query)
|
15
21
|
- Need test coverage.
|
16
22
|
|
23
|
+
- Extract Build class into a Site class that can be instansiated (so multiple site can be loaded/run in memory)
|
24
|
+
|
17
25
|
|
18
26
|
# Possible New Internals
|
19
27
|
- Gumdrop (module)
|
data/gumdrop.gemspec
CHANGED
@@ -13,9 +13,9 @@ Gem::Specification.new do |s|
|
|
13
13
|
|
14
14
|
s.authors = ["Matt McCray"]
|
15
15
|
s.email = %q{matt@elucidata.net}
|
16
|
-
s.summary = %q{A simple cms/prototyping tool.}
|
16
|
+
s.summary = %q{A sweet 'n simple cms/prototyping tool.}
|
17
17
|
s.homepage = %q{https://github.com/darthapo/gumdrop}
|
18
|
-
s.description = %q{A simple cms/prototyping tool.}
|
18
|
+
s.description = %q{A sweet 'n simple cms/prototyping tool for creating static html websites and webapps.}
|
19
19
|
|
20
20
|
s.files = `git ls-files`.split("\n")
|
21
21
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
@@ -26,8 +26,8 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_dependency 'tilt'
|
27
27
|
s.add_dependency 'active_support'
|
28
28
|
s.add_dependency 'trollop'
|
29
|
-
s.add_dependency 'haml'
|
30
|
-
s.add_dependency 'sass'
|
29
|
+
# s.add_dependency 'haml'
|
30
|
+
# s.add_dependency 'sass'
|
31
31
|
s.add_dependency 'i18n'
|
32
32
|
s.add_dependency 'bundle'
|
33
33
|
|
data/lib/gumdrop/cli.rb
CHANGED
@@ -49,6 +49,7 @@ EOS
|
|
49
49
|
|
50
50
|
end
|
51
51
|
|
52
|
+
# NO COMMANDS GIVEN
|
52
53
|
|
53
54
|
unless opts[:create_given] or opts[:build_given] or opts[:server_given] or opts[:new_given] or opts[:template_given] or opts[:list_given]
|
54
55
|
puts banner_text
|
@@ -56,19 +57,22 @@ unless opts[:create_given] or opts[:build_given] or opts[:server_given] or opts[
|
|
56
57
|
end
|
57
58
|
|
58
59
|
|
60
|
+
# BUILD
|
59
61
|
|
60
62
|
if opts[:build_given]
|
61
63
|
puts banner_text unless opts[:quiet_given]
|
62
64
|
Gumdrop.run(opts)
|
63
65
|
|
64
66
|
|
67
|
+
# SERVER
|
68
|
+
|
65
69
|
elsif opts[:server_given]
|
66
70
|
puts banner_text unless opts[:quiet_given]
|
67
|
-
Gumdrop.config.auto_run= true
|
68
|
-
Gumdrop.config.force_reload= opts[:reload_given]
|
69
71
|
Gumdrop::Server
|
70
72
|
|
71
73
|
|
74
|
+
# LIST TEMPLATES
|
75
|
+
|
72
76
|
elsif opts[:list_given]
|
73
77
|
# List templates
|
74
78
|
puts banner_text unless opts[:quiet_given]
|
@@ -85,11 +89,15 @@ elsif opts[:list_given]
|
|
85
89
|
end
|
86
90
|
|
87
91
|
|
92
|
+
# NEW DATA COLLECTION ITEM
|
93
|
+
|
88
94
|
elsif opts[:new_given]
|
89
95
|
puts banner_text unless opts[:quiet_given]
|
90
96
|
puts "Not implemented yet..."
|
91
97
|
|
92
98
|
|
99
|
+
# CREATE NEW SITE
|
100
|
+
|
93
101
|
elsif opts[:create_given]
|
94
102
|
puts banner_text unless opts[:quiet_given]
|
95
103
|
|
@@ -127,6 +135,8 @@ elsif opts[:create_given]
|
|
127
135
|
end
|
128
136
|
|
129
137
|
|
138
|
+
# SAVE CURRENT SITE AS TEMPLATE
|
139
|
+
|
130
140
|
elsif opts[:template_given]
|
131
141
|
# Save as template...
|
132
142
|
puts banner_text unless opts[:quiet_given]
|
@@ -145,7 +155,7 @@ elsif opts[:template_given]
|
|
145
155
|
end
|
146
156
|
|
147
157
|
|
148
|
-
|
158
|
+
# UNKNOWN COMMAND
|
149
159
|
|
150
160
|
else
|
151
161
|
puts banner_text
|
data/lib/gumdrop/content.rb
CHANGED
@@ -3,13 +3,15 @@ module Gumdrop
|
|
3
3
|
|
4
4
|
class Content
|
5
5
|
|
6
|
-
attr_accessor :path, :level, :filename, :source_filename, :type, :ext, :uri, :slug, :template, :params
|
6
|
+
attr_accessor :path, :level, :filename, :source_filename, :type, :ext, :uri, :slug, :template, :params, :site, :ignored
|
7
7
|
|
8
|
-
def initialize(path, params={})
|
8
|
+
def initialize(path, site, params={})
|
9
|
+
@site= site
|
9
10
|
@params= HashObject.new params
|
10
11
|
@path= path
|
11
12
|
@level= (@path.split('/').length - 2)
|
12
13
|
@source_filename= File.basename path
|
14
|
+
@ignored= false
|
13
15
|
|
14
16
|
filename_parts= @source_filename.split('.')
|
15
17
|
ext= filename_parts.pop
|
@@ -35,27 +37,27 @@ module Gumdrop
|
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
|
-
def render(ignore_layout=false, reset_context=true, locals={})
|
40
|
+
def render(context=nil, ignore_layout=false, reset_context=true, locals={})
|
41
|
+
context= @site.render_context if context.nil?
|
39
42
|
if reset_context
|
40
|
-
|
41
43
|
default_layout= (@ext == '.css' or @ext == '.js' or @ext == '.xml') ? nil : 'site'
|
42
|
-
|
44
|
+
context.reset_data 'current_depth'=>@level, 'current_slug'=>@slug, 'page'=>self, 'layout'=>default_layout, 'params'=>self.params
|
43
45
|
end
|
44
|
-
|
45
|
-
content= @template.render(
|
46
|
+
context.set_content self, locals
|
47
|
+
content= @template.render(context)
|
46
48
|
return content if ignore_layout
|
47
|
-
layout=
|
49
|
+
layout= context.get_template()
|
48
50
|
while !layout.nil?
|
49
|
-
content = layout.template.render(
|
50
|
-
layout=
|
51
|
+
content = layout.template.render(context, content:content) { content }
|
52
|
+
layout= context.get_template()
|
51
53
|
end
|
52
54
|
content
|
53
55
|
end
|
54
56
|
|
55
|
-
def renderTo(output_path, filters=[], opts={})
|
57
|
+
def renderTo(context, output_path, filters=[], opts={})
|
56
58
|
return copyTo(output_path, opts) unless useLayout?
|
57
|
-
|
58
|
-
output= render()
|
59
|
+
@site.report " Rendering: #{@uri}", :warning
|
60
|
+
output= render(context)
|
59
61
|
filters.each {|f| output= f.call(output, self) }
|
60
62
|
File.open output_path, 'w' do |f|
|
61
63
|
f.write output
|
@@ -70,10 +72,10 @@ module Gumdrop
|
|
70
72
|
true
|
71
73
|
end
|
72
74
|
if do_copy
|
73
|
-
|
75
|
+
@site.report " Copying: #{@uri}", :warning
|
74
76
|
FileUtils.cp_r @path, output, opts
|
75
77
|
else
|
76
|
-
|
78
|
+
@site.report " (same): #{@uri}", :info
|
77
79
|
end
|
78
80
|
end
|
79
81
|
|
data/lib/gumdrop/context.rb
CHANGED
@@ -1,130 +1,135 @@
|
|
1
1
|
|
2
2
|
module Gumdrop
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
include ::Gumdrop::ViewHelpers
|
8
|
-
|
9
|
-
attr_accessor :state
|
10
|
-
#attr_reader :data
|
11
|
-
|
12
|
-
def uri(path, opts={})
|
13
|
-
path= path[1..-1] if path.starts_with?('/') # and path != "/"
|
14
|
-
uri_string= if !Gumdrop.config.relative_paths or Context.force_absolute
|
15
|
-
"/#{path}"
|
16
|
-
else
|
17
|
-
"#{'../'*@state['current_depth']}#{path}"
|
18
|
-
end
|
19
|
-
if opts[:fresh] and Gumdrop.site.has_key?(path)
|
20
|
-
uri_string += "?v=#{ Gumdrop.site[path].mtime.to_i }"
|
21
|
-
end
|
22
|
-
uri_string = "/" if uri_string == ""
|
23
|
-
uri_string
|
24
|
-
end
|
25
|
-
|
26
|
-
def url(path)
|
27
|
-
path= path[1..-1] if path.starts_with?('/')
|
28
|
-
"#{Gumdrop.config.site_url}/#{path}"
|
29
|
-
end
|
4
|
+
class Context
|
5
|
+
include ::Gumdrop::ViewHelpers
|
30
6
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
7
|
+
attr_accessor :state
|
8
|
+
|
9
|
+
def initialize(site)
|
10
|
+
@site= site
|
11
|
+
# puts "NEW CONTEXT!!!"
|
12
|
+
end
|
13
|
+
|
14
|
+
def uri(path, opts={})
|
15
|
+
path= path[1..-1] if path.starts_with?('/') # and path != "/"
|
16
|
+
uri_string= if !@site.config.relative_paths or force_absolute
|
17
|
+
"/#{path}"
|
18
|
+
else
|
19
|
+
"#{'../'*@state['current_depth']}#{path}"
|
43
20
|
end
|
44
|
-
|
45
|
-
|
46
|
-
@state['layout']= name
|
21
|
+
if opts[:fresh] and @site.node_tree.has_key?(path)
|
22
|
+
uri_string += "?v=#{ @site.node_tree[path].mtime.to_i }"
|
47
23
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
24
|
+
uri_string = "/" if uri_string == ""
|
25
|
+
uri_string
|
26
|
+
end
|
27
|
+
|
28
|
+
def url(path)
|
29
|
+
path= path[1..-1] if path.starts_with?('/')
|
30
|
+
"#{@site.config.site_url}/#{path}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def slug
|
34
|
+
@state['current_slug']
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_template
|
38
|
+
layout= @state['layout']
|
39
|
+
@state['layout']= nil
|
40
|
+
unless layout.nil?
|
41
|
+
@site.layouts["#{layout}.template"]
|
42
|
+
else
|
43
|
+
nil
|
60
44
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
45
|
+
end
|
46
|
+
|
47
|
+
def use_template(name)
|
48
|
+
@state['layout']= name
|
49
|
+
end
|
50
|
+
alias_method :use_layout, :use_template
|
51
|
+
|
52
|
+
def render(path, opts={})
|
53
|
+
page= get_page path
|
54
|
+
unless page.nil?
|
55
|
+
#TODO: nested state for an inline rendered page?
|
56
|
+
old_layout= @state['layout']
|
57
|
+
content= page.render(nil, true, false, opts)
|
58
|
+
old_layout= @state['layout']
|
59
|
+
content
|
60
|
+
else
|
61
|
+
""
|
64
62
|
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def data
|
66
|
+
@site.data
|
67
|
+
end
|
65
68
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
+
def site
|
70
|
+
@site
|
71
|
+
end
|
72
|
+
|
73
|
+
# Access to settings from configure block
|
74
|
+
def config
|
75
|
+
@site.config
|
76
|
+
end
|
77
|
+
|
78
|
+
def reset_data(preset={})
|
79
|
+
# TODO: Add a setting for reloading data on every request/page
|
80
|
+
# was this for the server?
|
81
|
+
# @site.data.reset if !Gumdrop.config.cache_data
|
82
|
+
@state = preset
|
83
|
+
end
|
84
|
+
|
85
|
+
def method_missing(name, value=nil)
|
86
|
+
@state= Hash.new {|h,k| h[k]= nil } if @state.nil?
|
87
|
+
# puts "Looking for >> #{name} in #{@state.keys}"
|
88
|
+
unless value.nil?
|
89
|
+
@state[name.to_s]= value
|
90
|
+
else
|
91
|
+
@state[name.to_s]
|
69
92
|
end
|
93
|
+
end
|
70
94
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
95
|
+
def params
|
96
|
+
@content.params
|
97
|
+
end
|
98
|
+
|
99
|
+
def set_content(content, locals)
|
100
|
+
@content= content
|
101
|
+
@state= @state.reverse_merge(content.params).merge(locals)
|
102
|
+
end
|
103
|
+
|
104
|
+
def content_for(key, &block)
|
105
|
+
keyname= "_content_#{key}"
|
106
|
+
if block_given?
|
107
|
+
@state[keyname]= block
|
108
|
+
nil
|
109
|
+
else
|
110
|
+
if @state.has_key?(keyname)
|
111
|
+
@state[keyname].call
|
83
112
|
else
|
84
|
-
@state[name.to_s]
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def params
|
89
|
-
@content.params
|
90
|
-
end
|
91
|
-
|
92
|
-
def set_content(content, locals)
|
93
|
-
@content= content
|
94
|
-
@state= @state.reverse_merge(content.params).merge(locals)
|
95
|
-
end
|
96
|
-
|
97
|
-
def content_for(key, &block)
|
98
|
-
keyname= "_content_#{key}"
|
99
|
-
if block_given?
|
100
|
-
@state[keyname]= block
|
101
113
|
nil
|
102
|
-
else
|
103
|
-
if @state.has_key?(keyname)
|
104
|
-
@state[keyname].call
|
105
|
-
else
|
106
|
-
nil
|
107
|
-
end
|
108
114
|
end
|
109
115
|
end
|
110
|
-
|
111
|
-
def content_for?(key)
|
112
|
-
keyname= "_content_#{key}"
|
113
|
-
@state.has_key?(keyname)
|
114
|
-
end
|
115
|
-
|
116
|
-
protected
|
117
|
-
|
118
|
-
def get_page(path)
|
119
|
-
page= Gumdrop.site[path]
|
120
|
-
page= Gumdrop.site["#{path}.html"] if page.nil? # Bit of a hack...
|
121
|
-
page= Gumdrop.partials[path] if page.nil?
|
122
|
-
page= Gumdrop.layouts[path] if page.nil? # ???
|
123
|
-
page
|
124
|
-
end
|
125
|
-
|
126
116
|
end
|
117
|
+
|
118
|
+
def content_for?(key)
|
119
|
+
keyname= "_content_#{key}"
|
120
|
+
@state.has_key?(keyname)
|
121
|
+
end
|
122
|
+
|
123
|
+
protected
|
124
|
+
|
125
|
+
def get_page(path)
|
126
|
+
page= @site.node_tree[path]
|
127
|
+
page= @site.node_tree["#{path}.html"] if page.nil? # Bit of a hack...
|
128
|
+
page= @site.partials[path] if page.nil?
|
129
|
+
page= @site.layouts[path] if page.nil? # ???
|
130
|
+
page
|
131
|
+
end
|
132
|
+
|
127
133
|
end
|
128
134
|
|
129
|
-
|
130
135
|
end
|
data/lib/gumdrop/data_manager.rb
CHANGED
@@ -1,78 +1,42 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'ostruct'
|
3
3
|
|
4
|
-
def hashes2ostruct(object)
|
5
|
-
return case object
|
6
|
-
when Hash
|
7
|
-
object = object.clone
|
8
|
-
object.each do |key, value|
|
9
|
-
object[key] = hashes2ostruct(value)
|
10
|
-
end
|
11
|
-
OpenStruct.new(object)
|
12
|
-
when Array
|
13
|
-
object = object.clone
|
14
|
-
object.map! { |i| hashes2ostruct(i) }
|
15
|
-
else
|
16
|
-
object
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
4
|
module Gumdrop
|
21
|
-
|
5
|
+
|
6
|
+
# Supported Data File Types:
|
7
|
+
DATA_DOC_EXTS= %w(json yml yaml ymldb yamldb yamldoc ymldoc)
|
8
|
+
|
22
9
|
class DataManager
|
23
10
|
attr_reader :cache
|
24
11
|
|
25
|
-
def initialize(data_dir="data")
|
26
|
-
@
|
12
|
+
def initialize(site, data_dir="./data")
|
13
|
+
@site= site
|
14
|
+
@dir= File.expand_path data_dir
|
27
15
|
@cache= {}
|
28
|
-
@persisted= {}
|
29
16
|
end
|
30
17
|
|
31
18
|
def method_missing(key, value=nil)
|
32
|
-
|
19
|
+
cache_dataset(key)
|
33
20
|
@cache[key]
|
34
21
|
end
|
35
22
|
|
36
|
-
def set(key, value
|
23
|
+
def set(key, value)
|
37
24
|
@cache[key]= value
|
38
|
-
@persisted[key]= value #unless opts[:persist] == false
|
39
25
|
end
|
40
26
|
|
41
|
-
def reset
|
42
|
-
|
43
|
-
@cache={}
|
44
|
-
@persisted={}
|
45
|
-
else
|
46
|
-
@cache= @persisted.clone #Hash.new(@persisted) #{|h,k| h[k]= load_data(k) }
|
47
|
-
end
|
27
|
+
def reset
|
28
|
+
@cache={}
|
48
29
|
end
|
49
30
|
|
50
|
-
|
51
|
-
|
52
|
-
def site
|
53
|
-
site= Hash.new {|h,k| h[k]= nil }
|
54
|
-
Gumdrop.site.keys.sort.each do |path|
|
55
|
-
unless Gumdrop.greylist.any? {|pattern| path_match path, pattern }
|
56
|
-
site[path]= Gumdrop.site[path]
|
57
|
-
end
|
58
|
-
end
|
59
|
-
site
|
60
|
-
end
|
61
|
-
# Oh dear god! This belongs elsewhere!
|
62
|
-
def path_match(path, pattern)
|
63
|
-
File.fnmatch pattern, path, File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_CASEFOLD
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
|
-
def site_all
|
68
|
-
Gumdrop.site
|
31
|
+
def site(pattern=nil, opts={})
|
32
|
+
@site.contents(pattern, opts)
|
69
33
|
end
|
70
34
|
|
71
35
|
def pager_for(key, opts={})
|
72
36
|
base_path= opts.fetch(:base_path, 'page')
|
73
37
|
page_size= opts.fetch(:page_size, 5)
|
74
38
|
data= if key.is_a? Symbol
|
75
|
-
|
39
|
+
cache_dataset(key)
|
76
40
|
@cache[key]
|
77
41
|
else
|
78
42
|
key
|
@@ -83,17 +47,14 @@ module Gumdrop
|
|
83
47
|
|
84
48
|
private
|
85
49
|
|
86
|
-
def
|
50
|
+
def cache_dataset(key)
|
87
51
|
@cache[key]= load_data(key) unless @cache.has_key? key
|
88
|
-
@persisted[key]= @cache[key] # New persist data loaded from file?
|
89
52
|
end
|
90
53
|
|
91
54
|
def load_data(key)
|
92
|
-
path=get_filename
|
55
|
+
path=get_filename key
|
93
56
|
return nil if path.nil?
|
94
|
-
if File.
|
95
|
-
load_from_yamldb path
|
96
|
-
elsif File.extname(path) == ""
|
57
|
+
if File.directory? path
|
97
58
|
load_from_directory path
|
98
59
|
else
|
99
60
|
load_from_file path
|
@@ -104,10 +65,14 @@ module Gumdrop
|
|
104
65
|
ext=File.extname(filename)
|
105
66
|
if ext == '.yamldoc' or ext == '.ymldoc'
|
106
67
|
load_from_yamldoc filename
|
68
|
+
elsif ext == '.yamldb' or ext == '.ymldb'
|
69
|
+
load_from_yamldb filename
|
107
70
|
elsif ext == '.yaml' or ext == '.yml' or ext == '.json'
|
108
71
|
hashes2ostruct( YAML.load_file(filename) )
|
109
72
|
else
|
110
|
-
raise "Unknown data type (#{ext}) for #{filename}"
|
73
|
+
# raise "Unknown data type (#{ext}) for #{filename}"
|
74
|
+
Gumdrop.report "Unknown data type (#{ext}) for #{filename}", :warning
|
75
|
+
nil
|
111
76
|
end
|
112
77
|
end
|
113
78
|
|
@@ -148,7 +113,7 @@ module Gumdrop
|
|
148
113
|
|
149
114
|
def load_from_directory( filepath )
|
150
115
|
all=[]
|
151
|
-
Dir[ File.join
|
116
|
+
Dir[ File.join "#{filepath}", "{*.#{ DATA_DOC_EXTS.join ',*.'}}" ].each do |filename|
|
152
117
|
# Gumdrop.report ">> Loading data file: #{filename}"
|
153
118
|
id= File.basename filename
|
154
119
|
obj_hash= load_from_file filename
|
@@ -159,19 +124,14 @@ module Gumdrop
|
|
159
124
|
end
|
160
125
|
|
161
126
|
def get_filename(path)
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
local_path_to "#{path}.yml"
|
166
|
-
elsif File.exists? local_path_to("#{path}.yaml")
|
167
|
-
local_path_to "#{path}.yaml"
|
168
|
-
elsif File.exists? local_path_to("#{path}.yamldb")
|
169
|
-
local_path_to "#{path}.yamldb"
|
170
|
-
elsif File.directory? local_path_to(path)
|
171
|
-
local_path_to(path)
|
127
|
+
lpath= local_path_to(path)
|
128
|
+
if File.directory? lpath
|
129
|
+
lpath
|
172
130
|
else
|
173
|
-
|
174
|
-
|
131
|
+
DATA_DOC_EXTS.each do |ext|
|
132
|
+
lpath= local_path_to("#{path}.#{ext}")
|
133
|
+
return lpath if File.exists? lpath
|
134
|
+
end
|
175
135
|
Gumdrop.report "No data found for #{path}", :warning
|
176
136
|
nil
|
177
137
|
end
|
@@ -180,9 +140,71 @@ module Gumdrop
|
|
180
140
|
def local_path_to(filename)
|
181
141
|
File.join(@dir.to_s, filename.to_s)
|
182
142
|
end
|
143
|
+
|
144
|
+
def hashes2ostruct(object)
|
145
|
+
return case object
|
146
|
+
when Hash
|
147
|
+
object = object.clone
|
148
|
+
object.each do |key, value|
|
149
|
+
object[key] = hashes2ostruct(value)
|
150
|
+
end
|
151
|
+
OpenStruct.new(object)
|
152
|
+
when Array
|
153
|
+
object = object.clone
|
154
|
+
object.map! { |i| hashes2ostruct(i) }
|
155
|
+
else
|
156
|
+
object
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
183
160
|
end
|
184
161
|
|
185
|
-
class
|
162
|
+
class Pager
|
163
|
+
attr_reader :all, :pages, :base_url, :current_page, :page_sets
|
164
|
+
|
165
|
+
def initialize(articles, base_path="/page", page_size=5)
|
166
|
+
@all= articles
|
167
|
+
@page_size= page_size
|
168
|
+
@base_path= base_path
|
169
|
+
@page_sets= @all.in_groups_of(page_size, false)
|
170
|
+
@pages= []
|
171
|
+
@current_page=1
|
172
|
+
@page_sets.each do |art_ary|
|
173
|
+
@pages << HashObject.new({
|
174
|
+
items: art_ary,
|
175
|
+
page: @current_page,
|
176
|
+
uri: "#{base_path}/#{current_page}",
|
177
|
+
pager: self
|
178
|
+
})
|
179
|
+
@current_page += 1
|
180
|
+
end
|
181
|
+
@current_page= nil
|
182
|
+
end
|
183
|
+
|
184
|
+
def length
|
185
|
+
@pages.length
|
186
|
+
end
|
186
187
|
|
188
|
+
def first
|
189
|
+
@pages.first
|
190
|
+
end
|
191
|
+
|
192
|
+
def last
|
193
|
+
@pages.last
|
194
|
+
end
|
195
|
+
|
196
|
+
def each
|
197
|
+
@current_page=1
|
198
|
+
@pages.each do |page_set|
|
199
|
+
yield page_set
|
200
|
+
@current_page += 1
|
201
|
+
end
|
202
|
+
@current_page= nil
|
203
|
+
end
|
204
|
+
|
205
|
+
def [](key)
|
206
|
+
@pages[key]
|
207
|
+
end
|
187
208
|
end
|
209
|
+
|
188
210
|
end
|