siteleaf 2.0.0.pre.beta7 → 2.0.0.pre.beta9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +43 -19
- data/bin/siteleaf +96 -225
- data/lib/siteleaf.rb +3 -5
- data/lib/siteleaf/client.rb +8 -3
- data/lib/siteleaf/collection.rb +17 -4
- data/lib/siteleaf/content.rb +5 -17
- data/lib/siteleaf/document.rb +7 -3
- data/lib/siteleaf/entity.rb +22 -14
- data/lib/siteleaf/file.rb +22 -3
- data/lib/siteleaf/git_hash.rb +14 -0
- data/lib/siteleaf/page.rb +1 -1
- data/lib/siteleaf/site.rb +28 -46
- data/lib/siteleaf/source_file.rb +26 -0
- data/lib/siteleaf/version.rb +1 -1
- metadata +4 -6
- data/lib/patches/time_with_zone_encode_with.rb +0 -12
- data/lib/siteleaf/asset.rb +0 -43
- data/lib/siteleaf/post.rb +0 -11
- data/lib/siteleaf/upload.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffdf39daf59542b67cb85f8953690eed8e4878f6
|
4
|
+
data.tar.gz: cefb58dc50c17b2704cda475ace5d0c6aa35ccf6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b817f87f1733ef8aacfe0199dd0aab699ab04ecd6e1179094905743637213ef4dfefd4b09bdc5b5c5226cb27a0399ccd58509e94a5770095041e6a2b0474a8d8
|
7
|
+
data.tar.gz: d11c229b37885a7a89c166c24c81f0225058953f0bfee21161f2d653d34b2238f695a83376554440b210687b1487600109b49b22b5637f265140ff993c9183e3
|
data/README.md
CHANGED
@@ -118,44 +118,68 @@ site.publish
|
|
118
118
|
# delete site
|
119
119
|
site.delete
|
120
120
|
|
121
|
-
# delete site by id
|
122
|
-
Siteleaf::Site.delete('5196f137cc8591956b000001')
|
123
|
-
|
124
121
|
# get all pages in site
|
125
122
|
pages = site.pages
|
126
123
|
|
127
124
|
# create new page in site
|
128
125
|
page = Siteleaf::Page.create({
|
129
|
-
:site_id => site.id,
|
130
126
|
:title => 'My Page',
|
131
|
-
:body => 'This is my first page.'
|
127
|
+
:body => 'This is my first page.',
|
128
|
+
:site_id => site.id
|
132
129
|
})
|
133
130
|
|
134
131
|
# get page by id
|
135
132
|
page = Siteleaf::Page.find('519719ddcc85910626000001')
|
136
133
|
|
137
|
-
#
|
138
|
-
|
139
|
-
|
140
|
-
|
134
|
+
# delete page by id
|
135
|
+
Siteleaf::Page.delete('519719ddcc85910626000001')
|
136
|
+
|
137
|
+
# get posts
|
138
|
+
posts = site.posts # or Collection.new(path: 'posts', site_id: site.id).documents
|
139
|
+
|
140
|
+
# create new post
|
141
|
+
post = Siteleaf::Documents.create({
|
142
|
+
:title => 'My Post',
|
143
|
+
:body => 'This is my first post.',
|
144
|
+
:collection_path => 'posts',
|
145
|
+
:site_id => site.id
|
141
146
|
})
|
142
147
|
|
143
|
-
# update
|
148
|
+
# update post, add metadata
|
144
149
|
post.title = 'New Title'
|
145
|
-
post.
|
150
|
+
post.metadata = {'foo' => 'bar'}
|
146
151
|
post.save
|
147
152
|
|
148
|
-
# upload file
|
149
|
-
asset = Siteleaf::File.create({
|
150
|
-
:file => File.open("~/image.png"),
|
151
|
-
:path => "image.png"
|
152
|
-
})
|
153
|
-
|
154
153
|
# delete post
|
155
154
|
post.delete
|
156
155
|
|
157
|
-
#
|
158
|
-
|
156
|
+
# get files in "uploads" collection
|
157
|
+
files = site.uploads # or Collection.new(path: 'uploads', site_id: site.id).files
|
158
|
+
|
159
|
+
# upload image into "uploads" collection
|
160
|
+
file = Siteleaf::File.create({
|
161
|
+
:file => File.new('~/image.png'),
|
162
|
+
:path => 'image.png'
|
163
|
+
:collection_path => 'uploads',
|
164
|
+
:site_id => site.id
|
165
|
+
})
|
166
|
+
|
167
|
+
# get source files
|
168
|
+
files = site.source_files
|
169
|
+
|
170
|
+
# upload source file
|
171
|
+
file = Siteleaf::SourceFile.create({
|
172
|
+
:file => File.new('~/foo.html'),
|
173
|
+
:name => '_includes/foo.html',
|
174
|
+
:site_id => site.id
|
175
|
+
})
|
176
|
+
|
177
|
+
# delete file
|
178
|
+
file.delete
|
179
|
+
|
180
|
+
# delete file by name
|
181
|
+
Siteleaf::SourceFile.new(name: '_includes/foo.html', site_id: site.id).delete
|
182
|
+
|
159
183
|
```
|
160
184
|
|
161
185
|
Troubleshooting
|
data/bin/siteleaf
CHANGED
@@ -52,102 +52,77 @@ def auth(re_auth = false)
|
|
52
52
|
return false
|
53
53
|
end
|
54
54
|
end
|
55
|
-
|
56
|
-
|
57
|
-
def config(site)
|
58
|
-
Siteleaf.save_settings({site_id: site.id}, '.siteleaf.yml')
|
59
|
-
puts "=> Site configured."
|
60
|
-
end
|
61
|
-
|
62
|
-
def get_site_id
|
63
|
-
# check env vars
|
64
|
-
[:api_key, :api_secret, :api_base, :api_version].each do |key|
|
65
|
-
if value = ENV['SITELEAF_'+key.to_s.upcase]
|
66
|
-
Siteleaf.send "#{key}=", value
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
ENV['SITELEAF_SITE_ID'] || if settings = Siteleaf.load_settings('.siteleaf.yml')
|
71
|
-
settings[:site_id]
|
72
|
-
end
|
55
|
+
rescue Exception => e
|
56
|
+
print "Error: #{e.message}\n"
|
73
57
|
end
|
74
58
|
|
75
59
|
def pull(site_id)
|
60
|
+
print "Reading site...\n"
|
61
|
+
|
76
62
|
# get all the things
|
77
63
|
site = Siteleaf::Site.find(site_id)
|
78
|
-
|
79
|
-
uploads = site.uploads
|
80
|
-
pages = site.pages
|
81
|
-
posts = site.posts
|
82
|
-
collections = site.collections
|
83
|
-
documents = collections.map{ |collection| collection.documents }.flatten
|
84
|
-
|
85
|
-
assets = [site] + files + uploads + pages + posts + documents
|
86
|
-
|
64
|
+
site_files = site.source_tree
|
87
65
|
updated_count = 0
|
88
66
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
::File.open(asset.filename, 'w:UTF-8') { |f| f.write(asset.to_file) }
|
67
|
+
# download unmatched files
|
68
|
+
site_files.each do |file|
|
69
|
+
sha = ::File.exist?(file.name) && Siteleaf::GitHash.file(file.name)
|
70
|
+
if file.sha != sha
|
71
|
+
print "Downloading #{file.name}..."
|
72
|
+
FileUtils.mkdir_p(::File.dirname(file.name))
|
73
|
+
::File.open(file.name, 'w') { |f| f.write(file.to_file) }
|
97
74
|
updated_count += 1
|
98
75
|
print "complete.\n"
|
99
76
|
end
|
100
77
|
end
|
101
78
|
|
102
|
-
|
79
|
+
# check for old files
|
80
|
+
local_files = read_dir
|
81
|
+
missing_files = []
|
82
|
+
local_files.each do |path|
|
83
|
+
missing_files << path if !site_files.find{|a| a.name.casecmp(path) == 0 }
|
84
|
+
end
|
85
|
+
if missing_files.empty?
|
86
|
+
puts "=> #{updated_count} file(s) downloaded.\n"
|
87
|
+
else
|
88
|
+
print "=> #{updated_count} file(s) downloaded. Delete the following #{missing_files.size} unmatched local file(s)?\n"
|
89
|
+
missing_files.each do |path|
|
90
|
+
puts path
|
91
|
+
end
|
92
|
+
print '(y/n)? '
|
93
|
+
if $stdin.gets.chomp == 'y'
|
94
|
+
missing_files.each do |path|
|
95
|
+
print "Deleting #{path}..."
|
96
|
+
::File.delete(path)
|
97
|
+
print "complete.\n"
|
98
|
+
end
|
99
|
+
puts "=> #{missing_files.size} file(s) deleted.\n"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
rescue Exception => e
|
103
|
+
print "Error: #{e.message}\n"
|
103
104
|
end
|
104
105
|
|
105
106
|
def push(site_id)
|
106
|
-
|
107
|
-
config = ::File.exist?('_config.yml') ? YAML::load(::File.read('_config.yml')) : {}
|
108
|
-
markdown_ext = (config['markdown_ext'] || 'markdown,mdw,mdwn,md,text').split(',')
|
107
|
+
print "Reading site...\n"
|
109
108
|
|
110
109
|
# get all the things
|
111
110
|
site = Siteleaf::Site.find(site_id)
|
112
|
-
|
113
|
-
|
114
|
-
pages = site.pages
|
115
|
-
posts = site.posts
|
116
|
-
collections = site.collections
|
117
|
-
documents = []
|
118
|
-
collections.each do |collection|
|
119
|
-
documents += collection.documents
|
120
|
-
end
|
121
|
-
|
122
|
-
assets = files + uploads + pages + posts + documents
|
123
|
-
|
111
|
+
site_files = site.source_tree
|
112
|
+
local_files = read_dir
|
124
113
|
updated_count = 0
|
125
|
-
ignore_paths = ['_config.yml', 'config.ru', '.*', '_site/*', 'Gemfile', 'Gemfile.lock']
|
126
|
-
ignore_paths += ::File.read('.siteleafignore').split(/\r?\n/) if ::File.exists?('.siteleafignore')
|
127
|
-
ignore_paths += config['exclude'] if config['exclude'].is_a? Array
|
128
114
|
|
129
|
-
#
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
attrs['defaults'] = metadata.delete('defaults').map{|default|
|
141
|
-
{
|
142
|
-
'path' => default['scope']['path'],
|
143
|
-
'type' => default['scope']['type'],
|
144
|
-
'values' => default['values']
|
145
|
-
}
|
146
|
-
} if metadata['defaults']
|
147
|
-
attrs['metadata'] = metadata
|
148
|
-
|
149
|
-
response = Siteleaf::Site.new(attrs).save
|
150
|
-
|
115
|
+
# find changed files
|
116
|
+
changed_files = local_files.reject do |path|
|
117
|
+
file = site_files.find{|a| a.name.casecmp(path) == 0 }
|
118
|
+
file && Siteleaf::GitHash.file(path) == file.sha
|
119
|
+
end
|
120
|
+
changed_files.unshift('_config.yml') if changed_files.delete('_config.yml')
|
121
|
+
|
122
|
+
# upload changed files
|
123
|
+
changed_files.each do |path|
|
124
|
+
print "Uploading #{path}..."
|
125
|
+
response = Siteleaf::SourceFile.create(site_id: site_id, name: path, file: ::File.new(path))
|
151
126
|
if error = !response || response.error || response.message
|
152
127
|
print (error) ? "error: #{error}\n" : "error.\n"
|
153
128
|
return
|
@@ -157,153 +132,30 @@ def push(site_id)
|
|
157
132
|
end
|
158
133
|
end
|
159
134
|
|
160
|
-
# create collections
|
161
|
-
collection_paths = []
|
162
|
-
collections_config = config['collections'] || {}
|
163
|
-
collections_config.each do |path, metadata|
|
164
|
-
path = path.gsub(/[^a-z0-9_\-\.]/i, '')
|
165
|
-
collection_paths << "_#{path}"
|
166
|
-
collection = collections.find{|c| c.path.casecmp(path) == 0 }
|
167
|
-
title = metadata.delete('title') || path
|
168
|
-
output = metadata.delete('output')
|
169
|
-
permalink = metadata.delete('permalink')
|
170
|
-
|
171
|
-
if !collection
|
172
|
-
# create any new collections
|
173
|
-
collections << Siteleaf::Collection.create(site_id: site.id, title: title, path: path, output: output, permalink: permalink, metadata: metadata)
|
174
|
-
elsif collection.title != title || collection.output != output || collection.permalink != permalink || collection.metadata != metadata
|
175
|
-
# update any changed collections
|
176
|
-
collections.delete(collection)
|
177
|
-
colllection = Siteleaf::Collection.new(id: collection.id, title: title, path: path, output: output, permalink: permalink, metadata: metadata).save
|
178
|
-
collections << colllection
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
# upload files
|
183
|
-
paths = Dir.glob("**/*")
|
184
|
-
paths.each do |path|
|
185
|
-
if !::File.directory?(path) && !ignore_paths.any?{|i| ::File.fnmatch?(i, path, File::FNM_CASEFOLD) || ::File.fnmatch?(i, ::File.basename(path), File::FNM_CASEFOLD) }
|
186
|
-
|
187
|
-
asset = assets.find{|a| a.filename.casecmp(path) == 0 }
|
188
|
-
basedir = ::File.dirname(path).split('/').first
|
189
|
-
basename = ::File.basename(path)
|
190
|
-
ext = ::File.extname(path).sub('.', '')
|
191
|
-
sha = Digest::SHA1.hexdigest(::File.read(path))
|
192
|
-
static = !has_yaml_header?(path)
|
193
|
-
collection_id = nil
|
194
|
-
|
195
|
-
model = if ['_drafts', '_posts'].include?(basedir)
|
196
|
-
Siteleaf::Post
|
197
|
-
elsif basedir == '_uploads'
|
198
|
-
Siteleaf::Upload
|
199
|
-
elsif collection_paths.include?(basedir) && (collection = collections.find {|c| basedir == "_#{c.path}" })
|
200
|
-
collection_id = collection.id
|
201
|
-
Siteleaf::Document
|
202
|
-
elsif !static && markdown_ext.include?(ext)
|
203
|
-
Siteleaf::Page
|
204
|
-
else
|
205
|
-
Siteleaf::File
|
206
|
-
end
|
207
|
-
|
208
|
-
if asset.nil? || asset.sha != sha || !asset.is_a?(model) || asset.filename != path
|
209
|
-
|
210
|
-
print "Uploading #{path}..."
|
211
|
-
|
212
|
-
response = if [Siteleaf::Post, Siteleaf::Document, Siteleaf::Page].include?(model)
|
213
|
-
|
214
|
-
# handle content
|
215
|
-
metadata = {}
|
216
|
-
unless static
|
217
|
-
body, metadata = read_frontmatter(path)
|
218
|
-
end
|
219
|
-
|
220
|
-
clean_path = path.sub("#{basedir}/",'').sub(".#{ext}",'')
|
221
|
-
title = metadata.delete('title') || ::File.basename(clean_path)
|
222
|
-
|
223
|
-
attrs = {site_id: site.id, title: title, path: clean_path, static: static}
|
224
|
-
attrs[:body] = body if body && body != ""
|
225
|
-
attrs[:metadata] = metadata if metadata && !metadata.empty?
|
226
|
-
|
227
|
-
if basedir == '_drafts'
|
228
|
-
attrs[:visibility] = 'draft'
|
229
|
-
elsif basedir == '_posts'
|
230
|
-
attrs[:visibility] = (metadata['published'].delete == false) ? 'hidden' : 'visible'
|
231
|
-
elsif model == Siteleaf::Document
|
232
|
-
attrs[:collection_id] = collection_id
|
233
|
-
else
|
234
|
-
attrs[:path] = path.sub(".#{ext}",'')
|
235
|
-
end
|
236
|
-
|
237
|
-
if asset && asset.is_a?(model)
|
238
|
-
attrs[:id] = asset.id
|
239
|
-
asset = model.new(attrs).save
|
240
|
-
else
|
241
|
-
asset.delete if asset
|
242
|
-
asset = model.create(attrs)
|
243
|
-
end
|
244
|
-
|
245
|
-
else
|
246
|
-
|
247
|
-
# handle assets
|
248
|
-
file = path
|
249
|
-
metadata = {}
|
250
|
-
unless static
|
251
|
-
body, metadata = read_frontmatter(path)
|
252
|
-
file = Tempfile.new(basename)
|
253
|
-
::File.open(file, 'w:UTF-8') { |f| f.write(body) }
|
254
|
-
end
|
255
|
-
|
256
|
-
attrs = {site_id: site.id, file: ::File.new(file), path: path, static: static}
|
257
|
-
if basedir == '_uploads'
|
258
|
-
attrs[:path] = path.sub("#{basedir}/",'')
|
259
|
-
end
|
260
|
-
|
261
|
-
asset.delete if asset
|
262
|
-
asset = model.create(attrs)
|
263
|
-
if metadata && !metadata.empty?
|
264
|
-
asset = model.new(id: asset.id, metadata: metadata).save
|
265
|
-
end
|
266
|
-
asset
|
267
|
-
|
268
|
-
end
|
269
|
-
|
270
|
-
if error = !response || response.error || response.message
|
271
|
-
print (error) ? "error: #{error}\n" : "error.\n"
|
272
|
-
return
|
273
|
-
else
|
274
|
-
updated_count += 1
|
275
|
-
print "complete.\n"
|
276
|
-
end
|
277
|
-
|
278
|
-
end
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
135
|
# check for old files
|
283
136
|
missing_assets = []
|
284
|
-
|
285
|
-
missing_assets <<
|
286
|
-
end
|
287
|
-
assets.each do |asset|
|
288
|
-
missing_assets << asset if !paths.find{|p| p.casecmp(asset.filename) == 0 }
|
137
|
+
site_files.each do |asset|
|
138
|
+
missing_assets << asset if !local_files.find{|p| p.casecmp(asset.name) == 0 }
|
289
139
|
end
|
290
140
|
if missing_assets.empty?
|
291
141
|
puts "=> #{updated_count} file(s) uploaded.\n"
|
292
142
|
else
|
293
|
-
print "=> #{updated_count} file(s) uploaded. Delete the following #{missing_assets.size} unmatched file(s)?\n"
|
143
|
+
print "=> #{updated_count} file(s) uploaded. Delete the following #{missing_assets.size} unmatched remote file(s)?\n"
|
294
144
|
missing_assets.each do |asset|
|
295
|
-
puts asset.
|
145
|
+
puts asset.name
|
296
146
|
end
|
297
147
|
print '(y/n)? '
|
298
148
|
if $stdin.gets.chomp == 'y'
|
299
149
|
missing_assets.each do |asset|
|
300
|
-
print "Deleting #{asset.
|
150
|
+
print "Deleting #{asset.name}..."
|
301
151
|
asset.delete
|
302
152
|
print "complete.\n"
|
303
153
|
end
|
304
154
|
puts "=> #{missing_assets.size} file(s) deleted.\n"
|
305
155
|
end
|
306
156
|
end
|
157
|
+
rescue Exception => e
|
158
|
+
print "Error: #{e.message}\n"
|
307
159
|
end
|
308
160
|
|
309
161
|
def import(file, quiet = true)
|
@@ -321,6 +173,8 @@ def import(file, quiet = true)
|
|
321
173
|
end
|
322
174
|
puts "=> Import completed.\n"
|
323
175
|
end
|
176
|
+
rescue Exception => e
|
177
|
+
print "Error: #{e.message}\n"
|
324
178
|
end
|
325
179
|
|
326
180
|
def publish(site_id, quiet = true)
|
@@ -339,20 +193,39 @@ def publish(site_id, quiet = true)
|
|
339
193
|
end
|
340
194
|
puts "=> Publish completed.\n"
|
341
195
|
end
|
196
|
+
rescue Exception => e
|
197
|
+
print "Error: #{e.message}\n"
|
198
|
+
end
|
199
|
+
|
200
|
+
def config(site)
|
201
|
+
Siteleaf.save_settings({site_id: site.id}, '.siteleaf.yml')
|
202
|
+
puts "=> Site configured."
|
342
203
|
end
|
343
204
|
|
344
|
-
def
|
345
|
-
|
205
|
+
def get_site_id
|
206
|
+
# check env vars
|
207
|
+
[:api_key, :api_secret, :api_base, :api_version].each do |key|
|
208
|
+
if value = ENV['SITELEAF_'+key.to_s.upcase]
|
209
|
+
Siteleaf.send "#{key}=", value
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
ENV['SITELEAF_SITE_ID'] || if settings = Siteleaf.load_settings('.siteleaf.yml')
|
214
|
+
settings[:site_id]
|
215
|
+
end
|
346
216
|
end
|
347
217
|
|
348
|
-
def
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
218
|
+
def read_dir
|
219
|
+
jekyll_config = ::File.exist?('_config.yml') ? YAML::load(::File.read('_config.yml')) : {}
|
220
|
+
|
221
|
+
ignore_paths = ['config.ru', '.*', '_site/*', 'Gemfile', 'Gemfile.lock']
|
222
|
+
ignore_paths += ::File.read('.siteleafignore').split(/\r?\n/) if ::File.exists?('.siteleafignore')
|
223
|
+
ignore_paths += jekyll_config['exclude'] if jekyll_config['exclude'].is_a? Array
|
224
|
+
|
225
|
+
Dir.glob("**/*").reject do |path|
|
226
|
+
::File.directory?(path) ||
|
227
|
+
ignore_paths.any? {|i| ::File.fnmatch?(i, path, File::FNM_CASEFOLD) || ::File.fnmatch?(i, ::File.basename(path), File::FNM_CASEFOLD) }
|
354
228
|
end
|
355
|
-
return content, metadata
|
356
229
|
end
|
357
230
|
|
358
231
|
case ARGV[0]
|
@@ -382,8 +255,7 @@ when 'n', 'new'
|
|
382
255
|
end
|
383
256
|
end
|
384
257
|
when 'pull'
|
385
|
-
|
386
|
-
#when 'theme'
|
258
|
+
if ARGV.size == 1
|
387
259
|
site_id = get_site_id
|
388
260
|
if auth != false
|
389
261
|
if site_id
|
@@ -392,12 +264,11 @@ when 'pull'
|
|
392
264
|
puts "Site not configured, run `siteleaf config yoursite.com`.\n"
|
393
265
|
end
|
394
266
|
end
|
395
|
-
|
396
|
-
|
397
|
-
|
267
|
+
else
|
268
|
+
puts "`#{ARGV.join(' ')}` command not found.\n"
|
269
|
+
end
|
398
270
|
when 'push'
|
399
|
-
|
400
|
-
#when 'theme'
|
271
|
+
if ARGV.size == 1
|
401
272
|
site_id = get_site_id
|
402
273
|
if auth != false
|
403
274
|
if site_id
|
@@ -406,9 +277,9 @@ when 'push'
|
|
406
277
|
puts "Site not configured, run `siteleaf config yoursite.com`.\n"
|
407
278
|
end
|
408
279
|
end
|
409
|
-
|
410
|
-
|
411
|
-
|
280
|
+
else
|
281
|
+
puts "`#{ARGV.join(' ')}` command not found.\n"
|
282
|
+
end
|
412
283
|
when 'publish'
|
413
284
|
site_id = get_site_id
|
414
285
|
if auth != false
|
data/lib/siteleaf.rb
CHANGED
@@ -2,20 +2,18 @@ libdir = ::File.dirname(__FILE__)
|
|
2
2
|
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
3
3
|
|
4
4
|
require 'siteleaf/version'
|
5
|
+
require 'siteleaf/git_hash'
|
5
6
|
require 'siteleaf/client'
|
6
7
|
require 'siteleaf/entity'
|
7
|
-
require 'siteleaf/asset'
|
8
8
|
require 'siteleaf/file'
|
9
|
-
require 'siteleaf/upload'
|
10
9
|
require 'siteleaf/job'
|
11
10
|
require 'siteleaf/content'
|
12
11
|
require 'siteleaf/page'
|
13
|
-
require 'siteleaf/post'
|
14
12
|
require 'siteleaf/collection'
|
15
13
|
require 'siteleaf/document'
|
16
14
|
require 'siteleaf/site'
|
15
|
+
require 'siteleaf/source_file'
|
17
16
|
require 'siteleaf/user'
|
18
|
-
require 'patches/time_with_zone_encode_with'
|
19
17
|
require 'digest/sha1'
|
20
18
|
require 'rbconfig'
|
21
19
|
require 'uri'
|
@@ -25,7 +23,7 @@ module Siteleaf
|
|
25
23
|
|
26
24
|
@api_key = ENV['SITELEAF_API_KEY']
|
27
25
|
@api_secret = ENV['SITELEAF_API_SECRET']
|
28
|
-
@api_base = 'https://api.
|
26
|
+
@api_base = 'https://api.siteleaf.com'
|
29
27
|
@api_version = 'v2'
|
30
28
|
|
31
29
|
class << self
|
data/lib/siteleaf/client.rb
CHANGED
@@ -5,7 +5,8 @@ module Siteleaf
|
|
5
5
|
def self.auth(email, password)
|
6
6
|
begin
|
7
7
|
request = HTTParty.post(Siteleaf.api_url('auth'), {
|
8
|
-
:basic_auth => {:username => email, :password => password}
|
8
|
+
:basic_auth => {:username => email, :password => password},
|
9
|
+
:headers => {"User-Agent" => "Siteleaf Gem/#{Siteleaf::VERSION}"}
|
9
10
|
})
|
10
11
|
return request.parsed_response # parse JSON
|
11
12
|
rescue => e
|
@@ -14,7 +15,7 @@ module Siteleaf
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def self.get(path, params = {})
|
17
|
-
params['
|
18
|
+
params['per_page'] = 9999 # todo: paginate
|
18
19
|
self.execute(:get, path, params)
|
19
20
|
end
|
20
21
|
|
@@ -35,15 +36,19 @@ module Siteleaf
|
|
35
36
|
begin
|
36
37
|
if (method == :post || method == :put) && !params.has_key?('file') && !params.has_key?(:file)
|
37
38
|
request = HTTParty.send(method, Siteleaf.api_url(path), {
|
38
|
-
:headers => { 'Content-Type' => 'application/json' },
|
39
39
|
:body => params.to_json,
|
40
40
|
:basic_auth => {:username => Siteleaf.api_key, :password => Siteleaf.api_secret},
|
41
|
+
:headers => {
|
42
|
+
"Content-Type" => "application/json",
|
43
|
+
"User-Agent" => "Siteleaf Gem/#{Siteleaf::VERSION}"
|
44
|
+
},
|
41
45
|
:timeout => 300
|
42
46
|
})
|
43
47
|
else
|
44
48
|
request = HTTMultiParty.send(method, Siteleaf.api_url(path), {
|
45
49
|
:query => params,
|
46
50
|
:basic_auth => {:username => Siteleaf.api_key, :password => Siteleaf.api_secret},
|
51
|
+
:headers => {"User-Agent" => "Siteleaf Gem/#{Siteleaf::VERSION}"},
|
47
52
|
:timeout => 300
|
48
53
|
})
|
49
54
|
end
|
data/lib/siteleaf/collection.rb
CHANGED
@@ -1,22 +1,35 @@
|
|
1
1
|
module Siteleaf
|
2
2
|
class Collection < Entity
|
3
3
|
|
4
|
-
attr_accessor :title, :path, :permalink, :output, :site_id, :metadata
|
4
|
+
attr_accessor :title, :path, :permalink, :output, :site_id, :user_id, :metadata
|
5
5
|
attr_reader :id, :directory, :created_at, :updated_at
|
6
6
|
|
7
7
|
def create_endpoint
|
8
|
-
"sites
|
8
|
+
::File.join("sites", site_id, "collections")
|
9
|
+
end
|
10
|
+
|
11
|
+
def entity_endpoint
|
12
|
+
::File.join(create_endpoint, identifier)
|
13
|
+
end
|
14
|
+
|
15
|
+
def identifier
|
16
|
+
path
|
9
17
|
end
|
10
18
|
|
11
19
|
def site
|
12
|
-
Site.find(
|
20
|
+
Site.find(site_id)
|
13
21
|
end
|
14
22
|
|
15
23
|
def documents
|
16
|
-
result = Client.get "
|
24
|
+
result = Client.get "#{entity_endpoint}/documents"
|
17
25
|
result.map { |r| Document.new(r) } if result.is_a? Array
|
18
26
|
end
|
19
27
|
|
28
|
+
def files
|
29
|
+
result = Client.get "#{entity_endpoint}/files"
|
30
|
+
result.map { |r| File.new(r) } if result.is_a? Array
|
31
|
+
end
|
32
|
+
|
20
33
|
def output?
|
21
34
|
output == true
|
22
35
|
end
|
data/lib/siteleaf/content.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module Siteleaf
|
2
2
|
class Content < Entity
|
3
3
|
|
4
|
-
attr_accessor :title, :body, :path, :permalink, :visibility, :
|
5
|
-
attr_reader :id, :filename, :basename, :directory, :url, :
|
4
|
+
attr_accessor :title, :body, :path, :permalink, :visibility, :date, :user_id, :site_id, :metadata
|
5
|
+
attr_reader :id, :filename, :basename, :directory, :url, :sha, :created_at, :updated_at
|
6
6
|
|
7
7
|
def site
|
8
|
-
Site.find(
|
8
|
+
Site.find(site_id) if site_id
|
9
9
|
end
|
10
10
|
|
11
11
|
def draft?
|
@@ -20,21 +20,9 @@ module Siteleaf
|
|
20
20
|
visibility == 'visible'
|
21
21
|
end
|
22
22
|
alias_method :published?, :visible?
|
23
|
-
|
23
|
+
|
24
24
|
def to_file
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
protected
|
29
|
-
|
30
|
-
def frontmatter
|
31
|
-
attrs = metadata || {}
|
32
|
-
attrs['title'] = title
|
33
|
-
attrs['date'] = Time.parse(published_at).utc unless published_at.nil?
|
34
|
-
attrs['published'] = false if hidden?
|
35
|
-
attrs['permalink'] = permalink unless permalink.nil?
|
36
|
-
|
37
|
-
attrs.empty? ? "---\n".freeze : attrs.to_yaml
|
25
|
+
SourceFile.new(site_id: site_id, name: filename).to_file
|
38
26
|
end
|
39
27
|
|
40
28
|
end
|
data/lib/siteleaf/document.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
module Siteleaf
|
2
2
|
class Document < Content
|
3
3
|
|
4
|
-
attr_accessor :
|
4
|
+
attr_accessor :collection_path
|
5
5
|
|
6
6
|
def create_endpoint
|
7
|
-
"collections
|
7
|
+
::File.join("sites", site_id, "collections", collection_identifier, "documents")
|
8
8
|
end
|
9
9
|
|
10
10
|
def collection
|
11
|
-
Collection.find(
|
11
|
+
Collection.find(collection_identifier)
|
12
|
+
end
|
13
|
+
|
14
|
+
def collection_identifier
|
15
|
+
collection_path || directory.match(/_(.*)/).try(:last)
|
12
16
|
end
|
13
17
|
|
14
18
|
end
|
data/lib/siteleaf/entity.rb
CHANGED
@@ -8,24 +8,28 @@ module Siteleaf
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.all
|
11
|
-
result = Client.get
|
12
|
-
result.map { |r|
|
11
|
+
result = Client.get endpoint
|
12
|
+
result.map { |r| new(r) } if result.is_a? Array
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.find(
|
16
|
-
result = Client.get "#{
|
17
|
-
|
15
|
+
def self.find(identifier)
|
16
|
+
result = Client.get "#{endpoint}/#{identifier}"
|
17
|
+
new(result) if result
|
18
18
|
end
|
19
19
|
|
20
20
|
def self.create(attributes = {})
|
21
|
-
|
21
|
+
new(attributes).save
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.delete(identifier)
|
25
|
+
Client.delete "#{endpoint}/#{identifier}"
|
22
26
|
end
|
23
27
|
|
24
28
|
def save
|
25
|
-
if
|
26
|
-
result = Client.put
|
29
|
+
if identifier
|
30
|
+
result = Client.put entity_endpoint, attributes
|
27
31
|
else
|
28
|
-
result = Client.post
|
32
|
+
result = Client.post create_endpoint, attributes
|
29
33
|
end
|
30
34
|
if result
|
31
35
|
self.attributes = result
|
@@ -33,12 +37,8 @@ module Siteleaf
|
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
36
|
-
def self.delete(id)
|
37
|
-
Client.delete "#{self.endpoint}/#{id}"
|
38
|
-
end
|
39
|
-
|
40
40
|
def delete
|
41
|
-
Client.delete
|
41
|
+
Client.delete entity_endpoint
|
42
42
|
end
|
43
43
|
|
44
44
|
def attributes
|
@@ -60,6 +60,14 @@ module Siteleaf
|
|
60
60
|
def create_endpoint
|
61
61
|
self.class.endpoint
|
62
62
|
end
|
63
|
+
|
64
|
+
def entity_endpoint
|
65
|
+
"#{self.class.endpoint}/#{identifier}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def identifier
|
69
|
+
id
|
70
|
+
end
|
63
71
|
|
64
72
|
end
|
65
73
|
end
|
data/lib/siteleaf/file.rb
CHANGED
@@ -1,8 +1,27 @@
|
|
1
1
|
module Siteleaf
|
2
|
-
class File <
|
3
|
-
|
2
|
+
class File < Entity
|
3
|
+
|
4
|
+
attr_accessor :file, :filename, :path, :collection_path, :site_id, :user_id
|
5
|
+
attr_reader :id, :basename, :directory, :url, :download_url, :thumbnail_url, :content_type, :filesize, :sha, :created_at, :updated_at
|
6
|
+
|
4
7
|
def create_endpoint
|
5
|
-
"sites
|
8
|
+
::File.join("sites", site_id, "collections", collection_identifier, "files")
|
9
|
+
end
|
10
|
+
|
11
|
+
def site
|
12
|
+
Site.find(site_id) if site_id
|
13
|
+
end
|
14
|
+
|
15
|
+
def collection
|
16
|
+
Collection.find(collection_identifier)
|
17
|
+
end
|
18
|
+
|
19
|
+
def collection_identifier
|
20
|
+
collection_path || (directory && directory.match(/_(.*)/).try(:last))
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_file
|
24
|
+
SourceFile.new(site_id: site_id, name: filename).to_file
|
6
25
|
end
|
7
26
|
|
8
27
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Siteleaf
|
2
|
+
module GitHash
|
3
|
+
# equivalent of `git hash-object file.txt`
|
4
|
+
def self.file(filename)
|
5
|
+
::File.open(filename, 'r') do |f|
|
6
|
+
Digest::SHA1.hexdigest("blob #{f.size}\0#{f.read}")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.string(str)
|
11
|
+
Digest::SHA1.hexdigest("blob #{str.bytesize}\0#{str}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/siteleaf/page.rb
CHANGED
data/lib/siteleaf/site.rb
CHANGED
@@ -15,33 +15,31 @@ module Siteleaf
|
|
15
15
|
Job.new(id: result["job_id"]) if result
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
result = Client.get
|
20
|
-
result.map { |r|
|
21
|
-
end
|
22
|
-
|
23
|
-
def uploads
|
24
|
-
result = Client.get "sites/#{self.id}/uploads"
|
25
|
-
result.map { |r| Upload.new(r) } if result.is_a? Array
|
18
|
+
def source_files(dir = '.')
|
19
|
+
result = Client.get ::File.join(entity_endpoint, "source", dir)
|
20
|
+
result.map { |r| SourceFile.new(r.merge('site_id' => id)) } if result.is_a? Array
|
26
21
|
end
|
27
22
|
|
28
23
|
def pages
|
29
|
-
result = Client.get "
|
24
|
+
result = Client.get "#{entity_endpoint}/pages"
|
30
25
|
result.map { |r| Page.new(r) } if result.is_a? Array
|
26
|
+
end
|
27
|
+
|
28
|
+
def collections
|
29
|
+
result = Client.get "#{entity_endpoint}/collections"
|
30
|
+
result.map { |r| Collection.new(r) } if result.is_a? Array
|
31
31
|
end
|
32
32
|
|
33
33
|
def posts
|
34
|
-
|
35
|
-
result.map { |r| Post.new(r) } if result.is_a? Array
|
34
|
+
Collection.new(path: 'posts', site_id: id).documents
|
36
35
|
end
|
37
36
|
|
38
|
-
def
|
39
|
-
|
40
|
-
result.map { |r| Collection.new(r) } if result.is_a? Array
|
37
|
+
def uploads
|
38
|
+
Collection.new(path: 'uploads', site_id: id).files
|
41
39
|
end
|
42
40
|
|
43
41
|
def publish
|
44
|
-
result = Client.post "
|
42
|
+
result = Client.post "#{entity_endpoint}/publish", {}
|
45
43
|
Job.new(id: result["job_id"]) if result
|
46
44
|
end
|
47
45
|
|
@@ -54,46 +52,30 @@ module Siteleaf
|
|
54
52
|
end
|
55
53
|
|
56
54
|
def sha
|
57
|
-
|
55
|
+
Siteleaf::GitHash.string(to_file)
|
58
56
|
end
|
59
57
|
|
60
|
-
def
|
61
|
-
|
58
|
+
def source_tree(dir = '.')
|
59
|
+
@tree_files = []
|
60
|
+
@tree_dirs = []
|
61
|
+
recursive_source_files(dir)
|
62
|
+
@tree_files
|
62
63
|
end
|
63
64
|
|
64
65
|
protected
|
65
66
|
|
66
|
-
def
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
67
|
+
def recursive_source_files(dir = '.')
|
68
|
+
source_files(dir).each do |file|
|
69
|
+
if file.type == 'directory'
|
70
|
+
unless @tree_dirs.include?(file.name)
|
71
|
+
@tree_dirs << file.name
|
72
|
+
recursive_source_files(file.name)
|
73
|
+
end
|
74
|
+
else
|
75
|
+
@tree_files << file
|
75
76
|
end
|
76
77
|
end
|
77
78
|
end
|
78
79
|
|
79
|
-
def collections_config
|
80
|
-
collections.unshift(uploads_collection).each_with_object({}) do |collection, hash|
|
81
|
-
hash[collection.path] = collection.metadata || {}
|
82
|
-
hash[collection.path]['title'] = collection.title
|
83
|
-
hash[collection.path]['output'] = collection.output
|
84
|
-
hash[collection.path]['permalink'] = collection.permalink unless collection.permalink.nil?
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def config
|
89
|
-
attrs = metadata || {}
|
90
|
-
attrs['title'] = title
|
91
|
-
attrs['url'] = full_url
|
92
|
-
attrs['timezone'] = timezone
|
93
|
-
attrs['collections'] = collections_config
|
94
|
-
attrs['defaults'] = defaults_config unless defaults.empty?
|
95
|
-
attrs.to_yaml
|
96
|
-
end
|
97
|
-
|
98
80
|
end
|
99
81
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Siteleaf
|
2
|
+
class SourceFile < Entity
|
3
|
+
|
4
|
+
attr_accessor :file, :name, :site_id
|
5
|
+
attr_reader :name, :url, :download_url, :type, :filesize, :sha, :created_at, :updated_at, :user_id
|
6
|
+
|
7
|
+
def create_endpoint
|
8
|
+
::File.join("sites", site_id, "source", URI.escape(identifier))
|
9
|
+
end
|
10
|
+
|
11
|
+
def entity_endpoint
|
12
|
+
create_endpoint
|
13
|
+
end
|
14
|
+
|
15
|
+
def identifier
|
16
|
+
name
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_file
|
20
|
+
response = Client.get(::File.join("sites", site_id, "source", "#{URI.escape(identifier)}?download"))
|
21
|
+
raise response['message'] if response['message'] # indicates API error
|
22
|
+
response.body
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
data/lib/siteleaf/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: siteleaf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.pre.
|
4
|
+
version: 2.0.0.pre.beta9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Siteleaf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -80,20 +80,18 @@ files:
|
|
80
80
|
- README.md
|
81
81
|
- Rakefile
|
82
82
|
- bin/siteleaf
|
83
|
-
- lib/patches/time_with_zone_encode_with.rb
|
84
83
|
- lib/siteleaf.rb
|
85
|
-
- lib/siteleaf/asset.rb
|
86
84
|
- lib/siteleaf/client.rb
|
87
85
|
- lib/siteleaf/collection.rb
|
88
86
|
- lib/siteleaf/content.rb
|
89
87
|
- lib/siteleaf/document.rb
|
90
88
|
- lib/siteleaf/entity.rb
|
91
89
|
- lib/siteleaf/file.rb
|
90
|
+
- lib/siteleaf/git_hash.rb
|
92
91
|
- lib/siteleaf/job.rb
|
93
92
|
- lib/siteleaf/page.rb
|
94
|
-
- lib/siteleaf/post.rb
|
95
93
|
- lib/siteleaf/site.rb
|
96
|
-
- lib/siteleaf/
|
94
|
+
- lib/siteleaf/source_file.rb
|
97
95
|
- lib/siteleaf/user.rb
|
98
96
|
- lib/siteleaf/version.rb
|
99
97
|
- siteleaf.gemspec
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class Time
|
2
|
-
def encode_with(coder)
|
3
|
-
label =
|
4
|
-
if utc?
|
5
|
-
usec.zero? ? '%Y-%m-%d %H:%M:%S Z' : '%Y-%m-%d %H:%M:%S.%9N Z'
|
6
|
-
else
|
7
|
-
usec.zero? ? '%Y-%m-%d %H:%M:%S %:z' : '%Y-%m-%d %H:%M:%S.%9N %:z'
|
8
|
-
end
|
9
|
-
|
10
|
-
coder.represent_scalar(nil, strftime(label))
|
11
|
-
end
|
12
|
-
end
|
data/lib/siteleaf/asset.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module Siteleaf
|
2
|
-
class Asset < Entity
|
3
|
-
|
4
|
-
attr_accessor :file, :filename, :path, :basename, :directory, :permalink, :replace, :site_id, :metadata
|
5
|
-
attr_reader :id, :basename, :directory, :url, :content_type, :filesize, :sha, :static, :created_at, :updated_at
|
6
|
-
|
7
|
-
def site
|
8
|
-
Site.find(self.site_id) if self.site_id
|
9
|
-
end
|
10
|
-
|
11
|
-
def filename
|
12
|
-
# todo: temporary fix
|
13
|
-
(directory == '.') ? basename : ::File.join(directory, basename)
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_file
|
17
|
-
if static?
|
18
|
-
body
|
19
|
-
else
|
20
|
-
[frontmatter, "---\n\n".freeze, body].join('')
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
protected
|
25
|
-
|
26
|
-
def frontmatter
|
27
|
-
attrs = metadata || {}
|
28
|
-
attrs.delete('name') # todo: temporary fix
|
29
|
-
attrs['permalink'] = permalink unless permalink.nil?
|
30
|
-
|
31
|
-
attrs.empty? ? "---\n".freeze : attrs.to_yaml
|
32
|
-
end
|
33
|
-
|
34
|
-
def body
|
35
|
-
open(file['url'], 'r:UTF-8') { |f| f.read }
|
36
|
-
end
|
37
|
-
|
38
|
-
def static?
|
39
|
-
static == true
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
end
|
data/lib/siteleaf/post.rb
DELETED