gumdrop 0.5.1 → 0.5.2

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 CHANGED
@@ -1,3 +1,9 @@
1
+ # v0.5.2
2
+ - DeferredLoader changed to DataManager
3
+ - 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_'
4
+ - Templates are stored under their short name and full path now.
5
+ - skip/ignore (blacklist and greylist) now use File.fnmatch instead of starts_with? for matching paths
6
+
1
7
  # v0.5.1
2
8
  - Bugfix: dev server was rescanning source files multiple times per pages load if build time exceeded 2 seconds... Will now wait 10 seconds before rescanning source.
3
9
 
data/Notes.md CHANGED
@@ -1,15 +1,37 @@
1
1
  # Future Features/Changes
2
- - HTML Manifest generation??
3
2
  - Some kind of admin? What would that even do?
4
3
  - If you could specify a 'prototype' for data collections, could be cool.
5
4
  - Multiple source_dir?
6
5
  - `set :source_dir, ['./source/a', './source/b']
7
6
  - What would happen with conflicts, last one in wins?
8
7
  - Multiple data_dir too?
8
+ - Refactor code to not use Gumdrop as a singleton (static really)
9
+ - Add YamlDoc support for nodes?
10
+
9
11
 
10
12
  # TODO:
11
13
  - New/Update Doc Site
12
14
  - API for retrieving pages and pages under a path (simple query)
13
- - Cleanup api and verbiage around blacklisting and ignoring
14
- - YamlDoc support (in data anyway)
15
- - Templates should be stored as short name/path and full path (like partials)
15
+ - Need test coverage.
16
+
17
+
18
+ # Possible New Internals
19
+ - Gumdrop (module)
20
+ - Site (class)
21
+ - SiteFileDSL (was DSL)
22
+ - Node (was Content)
23
+ - NodeGenerator (was Generator)
24
+ - Data (module)
25
+ - Manager (was DataManager)
26
+ - Collection
27
+ - Object
28
+ - Pager
29
+ - Server (module)
30
+ - NodeHandler
31
+ - ProxyHandler
32
+ - Render (module)
33
+ - Context
34
+ - ViewHelpers
35
+ - StitchCompilers
36
+ - Utils (module)
37
+ - Logging
data/lib/gumdrop/build.rb CHANGED
@@ -36,6 +36,7 @@ module Gumdrop
36
36
 
37
37
  # Sort out Layouts, Generators, and Partials
38
38
  if File.extname(path) == ".template"
39
+ Gumdrop.layouts[path]= node
39
40
  Gumdrop.layouts[File.basename(path)]= node
40
41
 
41
42
  elsif File.extname(path) == ".generator"
@@ -62,10 +63,11 @@ module Gumdrop
62
63
  end
63
64
  end
64
65
 
66
+ # Expunge blacklisted files
65
67
  def filter_tree
66
- Gumdrop.blacklist.each do |skip_path|
68
+ Gumdrop.blacklist.each do |blacklist_pattern|
67
69
  Gumdrop.site.keys.each do |source_path|
68
- if source_path.starts_with? skip_path
70
+ if path_match source_path, blacklist_pattern
69
71
  Gumdrop.report "-excluding: #{source_path}", :info
70
72
  Gumdrop.site.delete source_path
71
73
  end
@@ -78,7 +80,7 @@ module Gumdrop
78
80
  output_base_path= File.expand_path(Gumdrop.config.output_dir)
79
81
  Gumdrop.report "[Compiling to #{output_base_path}]", :info
80
82
  Gumdrop.site.keys.sort.each do |path|
81
- unless Gumdrop.greylist.any? {|p| path.starts_with?(p) }
83
+ unless Gumdrop.greylist.any? {|pattern| path_match path, pattern }
82
84
  node= Gumdrop.site[path]
83
85
  output_path= File.join(output_base_path, node.to_s)
84
86
  FileUtils.mkdir_p File.dirname(output_path)
@@ -98,6 +100,12 @@ module Gumdrop
98
100
  self
99
101
  end
100
102
 
103
+ # Match a path using a glob-like file pattern
104
+ def path_match(path, pattern)
105
+ File.fnmatch pattern, path, File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_CASEFOLD
106
+ end
107
+
108
+
101
109
  class << self
102
110
  def run(root, src, opts={})
103
111
  new(root, src, opts).run()
@@ -70,7 +70,7 @@ module Gumdrop
70
70
 
71
71
  def reset_data(preset={})
72
72
  # TODO: Add a setting for reloading data on every request/page
73
- #@data= DeferredLoader.new if @data.nil? or !Gumdrop.config.cache_data
73
+ # was this for the server?
74
74
  Gumdrop.data.reset if !Gumdrop.config.cache_data
75
75
  @state = preset
76
76
  end
@@ -19,11 +19,10 @@ end
19
19
 
20
20
  module Gumdrop
21
21
 
22
- class DeferredLoader
22
+ class DataManager
23
23
  attr_reader :cache
24
24
 
25
25
  def initialize(data_dir="data")
26
- #puts "@!@"
27
26
  @dir= data_dir
28
27
  @cache= {}
29
28
  @persisted= {}
@@ -48,16 +47,22 @@ module Gumdrop
48
47
  end
49
48
  end
50
49
 
50
+ # TODO: This is not a great place for this. MOVE IT!
51
+ # This'll go on the Site class for query support: .find()/.all()/.paths()/.nodes()
51
52
  def site
52
- # TODO: This is not a great place for this!
53
53
  site= Hash.new {|h,k| h[k]= nil }
54
54
  Gumdrop.site.keys.sort.each do |path|
55
- unless Gumdrop.greylist.any? {|p| path.starts_with?(p) }
55
+ unless Gumdrop.greylist.any? {|pattern| path_match path, pattern }
56
56
  site[path]= Gumdrop.site[path]
57
57
  end
58
58
  end
59
59
  site
60
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
+
61
66
 
62
67
  def site_all
63
68
  Gumdrop.site
@@ -87,27 +92,70 @@ module Gumdrop
87
92
  path=get_filename(key)
88
93
  return nil if path.nil?
89
94
  if File.extname(path) == ".yamldb"
90
- docs=[]
91
- File.open(path, 'r') do |f|
92
- YAML.load_documents(f) do |doc|
93
- docs << hashes2ostruct( doc ) unless doc.has_key?("__proto__")
94
- end
95
- end
96
- docs
95
+ load_from_yamldb path
97
96
  elsif File.extname(path) == ""
98
- all=[]
99
- Dir[ File.join( "#{path}", "{*.yaml,*.json,*.yml}" ) ].each do |filename|
100
- # Gumdrop.report ">> Loading data file: #{filename}"
101
- id= File.basename filename
102
- raw_hash= YAML.load_file(filename)
103
- raw_hash['_id']= id
104
- obj_hash= hashes2ostruct( raw_hash )
105
- all << obj_hash
97
+ load_from_directory path
98
+ else
99
+ load_from_file path
100
+ end
101
+ end
102
+
103
+ def load_from_file( filename )
104
+ ext=File.extname(filename)
105
+ if ext == '.yamldoc' or ext == '.ymldoc'
106
+ load_from_yamldoc filename
107
+ elsif ext == '.yaml' or ext == '.yml' or ext == '.json'
108
+ hashes2ostruct( YAML.load_file(filename) )
109
+ else
110
+ raise "Unknown data type (#{ext}) for #{filename}"
111
+ end
112
+ end
113
+
114
+ def load_from_yamldb( filename )
115
+ docs=[]
116
+ File.open(filename, 'r') do |f|
117
+ YAML.load_documents(f) do |doc|
118
+ docs << hashes2ostruct( doc ) unless doc.has_key?("__proto__")
106
119
  end
107
- all
120
+ end
121
+ docs
122
+ end
123
+
124
+ def load_from_yamldoc( filename )
125
+ source = File.read(filename)
126
+
127
+ if source =~ /^(\s*---(.+)---\s*)/m
128
+ yaml = $2.strip
129
+ content = source.sub($1, '')
130
+ data= YAML.load(yaml)
108
131
  else
109
- hashes2ostruct( YAML.load_file(path) )
132
+ content= source
133
+ data={}
134
+ end
135
+
136
+ content_set= false
137
+ data.each_pair do |key, value|
138
+ if value == '_YAMLDOC_'
139
+ data[key]= content
140
+ content_set= true
141
+ end
142
+ end
143
+
144
+ data['content']= content unless content_set
145
+
146
+ hashes2ostruct(data)
147
+ end
148
+
149
+ def load_from_directory( filepath )
150
+ all=[]
151
+ Dir[ File.join( "#{filepath}", "{*.yaml,*.json,*.yml,*.yamldoc,*.ymldoc}" ) ].each do |filename|
152
+ # Gumdrop.report ">> Loading data file: #{filename}"
153
+ id= File.basename filename
154
+ obj_hash= load_from_file filename
155
+ obj_hash._id = id
156
+ all << obj_hash
110
157
  end
158
+ all
111
159
  end
112
160
 
113
161
  def get_filename(path)
@@ -133,4 +181,8 @@ module Gumdrop
133
181
  File.join(@dir.to_s, filename.to_s)
134
182
  end
135
183
  end
184
+
185
+ class YamlDoc
186
+
187
+ end
136
188
  end
@@ -1,5 +1,5 @@
1
1
  module Gumdrop
2
2
 
3
- VERSION = "0.5.1" unless defined?(::Gumdrop::VERSION)
3
+ VERSION = "0.5.2" unless defined?(::Gumdrop::VERSION)
4
4
 
5
5
  end
data/lib/gumdrop.rb CHANGED
@@ -29,7 +29,7 @@ module Gumdrop
29
29
  autoload :Build, "gumdrop/build"
30
30
  autoload :Context, "gumdrop/context"
31
31
  autoload :Content, "gumdrop/content"
32
- autoload :DeferredLoader, "gumdrop/deferred_loader"
32
+ autoload :DataManager, "gumdrop/data_manager"
33
33
  autoload :DSL, "gumdrop/dsl"
34
34
  autoload :Generator, "gumdrop/generator"
35
35
  autoload :GeneratedrContent, "gumdrop/generator"
@@ -84,7 +84,7 @@ module Gumdrop
84
84
  @site = Hash.new {|h,k| h[k]= nil }
85
85
  @layouts = Hash.new {|h,k| h[k]= nil }
86
86
  @partials = Hash.new {|h,k| h[k]= nil }
87
- @data = Gumdrop::DeferredLoader.new( Gumdrop.config.data_dir )
87
+ @data = Gumdrop::DataManager.new( Gumdrop.config.data_dir )
88
88
  @last_run = Time.now
89
89
 
90
90
  begin
@@ -27,9 +27,8 @@ end
27
27
  # Ignores source file(s) from compilation, but does load the content into memory
28
28
  # ignore 'pages/'
29
29
 
30
- # NOTE: Skipping and ignoring matches simply with starts_with?... So if a path, from the
31
- # source directory, starts with the specified string, it'll skip or ignor it. (this
32
- # doesn't work for files detected by stitch)
30
+ # NOTE: Skipping and ignoring matches like a file glob (it use File.fnmatch in fact)
31
+ # (this doesn't work for files detected by stitch)
33
32
 
34
33
 
35
34
  # Example site-level generator
@@ -21,14 +21,13 @@ end
21
21
 
22
22
  # Skipping files entirely from build process... Like they don't exist.
23
23
  # skip 'file-to-ignore.html'
24
- # skip 'dont-show/'
24
+ # skip 'dont-show/**/*'
25
25
 
26
26
  # Ignores source file(s) from compilation, but does load the content into memory
27
- # ignore 'pages/'
27
+ # ignore 'pages/**/*.*'
28
28
 
29
- # NOTE: Skipping and ignoring matches simply with starts_with?... So if a path, from the
30
- # source directory, starts with the specified string, it'll skip or ignor it. (this
31
- # doesn't work for files detected by stitch)
29
+ # NOTE: Skipping and ignoring matches like a file glob (it use File.fnmatch in fact)
30
+ # (this doesn't work for files detected by stitch)
32
31
 
33
32
 
34
33
  # Example site-level generator
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gumdrop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-07-22 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
16
- requirement: &70144022144960 !ruby/object:Gem::Requirement
16
+ requirement: &70136900293340 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70144022144960
24
+ version_requirements: *70136900293340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: tilt
27
- requirement: &70144022143820 !ruby/object:Gem::Requirement
27
+ requirement: &70136900292760 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70144022143820
35
+ version_requirements: *70136900292760
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: active_support
38
- requirement: &70144022142220 !ruby/object:Gem::Requirement
38
+ requirement: &70136900292200 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70144022142220
46
+ version_requirements: *70136900292200
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: trollop
49
- requirement: &70144022140860 !ruby/object:Gem::Requirement
49
+ requirement: &70136900291500 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70144022140860
57
+ version_requirements: *70136900291500
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: haml
60
- requirement: &70144022139160 !ruby/object:Gem::Requirement
60
+ requirement: &70136900291040 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70144022139160
68
+ version_requirements: *70136900291040
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sass
71
- requirement: &70144022138500 !ruby/object:Gem::Requirement
71
+ requirement: &70136900290620 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70144022138500
79
+ version_requirements: *70136900290620
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: i18n
82
- requirement: &70144022137500 !ruby/object:Gem::Requirement
82
+ requirement: &70136900290080 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70144022137500
90
+ version_requirements: *70136900290080
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: bundle
93
- requirement: &70144022136600 !ruby/object:Gem::Requirement
93
+ requirement: &70136900289660 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: '0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70144022136600
101
+ version_requirements: *70136900289660
102
102
  description: A simple cms/prototyping tool.
103
103
  email: matt@elucidata.net
104
104
  executables:
@@ -120,7 +120,7 @@ files:
120
120
  - lib/gumdrop/cli.rb
121
121
  - lib/gumdrop/content.rb
122
122
  - lib/gumdrop/context.rb
123
- - lib/gumdrop/deferred_loader.rb
123
+ - lib/gumdrop/data_manager.rb
124
124
  - lib/gumdrop/dsl.rb
125
125
  - lib/gumdrop/generator.rb
126
126
  - lib/gumdrop/hash_object.rb