siteleaf 2.0.0 → 2.1.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.
- checksums.yaml +5 -5
- data/CNAME +1 -0
- data/README.md +17 -5
- data/bin/siteleaf +129 -102
- data/lib/siteleaf/client.rb +30 -35
- data/lib/siteleaf/collection.rb +10 -10
- data/lib/siteleaf/content.rb +6 -6
- data/lib/siteleaf/entity.rb +7 -5
- data/lib/siteleaf/site.rb +20 -37
- data/lib/siteleaf/source_file.rb +11 -11
- data/lib/siteleaf/version.rb +1 -1
- data/siteleaf.gemspec +6 -6
- metadata +18 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7632e9291c8a7111f572ac0380262e85d8ed86791fad2baa9ac7ef4bdea37973
|
4
|
+
data.tar.gz: 280efe8fe737f575fee142871d0b77334f5ee03e84e3d1613b42b5daa65c08c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d641ff9b139f5ea7c49beb1bcab152fe19dde0996e3043cf3e137d0ba41488ff4f8250e47bd41042d0e5d35c36b9df11df845981cfc55438ba4d90e35a4c260
|
7
|
+
data.tar.gz: fe6f49d7ad52adce8522b35c77775e85b2170e327dd442fba6a043cf2b0f4482008643a3be544641e1480ae47293fec544e316feeb928bb503f00d94814d06f6
|
data/CNAME
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
gem.siteleaf.net
|
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
Siteleaf
|
1
|
+
<img alt="Siteleaf" src="https://learn.siteleaf.com/assets/images/logo.svg" width="10%">
|
2
|
+
|
3
|
+
Siteleaf v2 Gem
|
2
4
|
===============
|
3
5
|
|
6
|
+
- [Prerequisites](#prerequisites)
|
4
7
|
- [Installation](#installation)
|
5
8
|
- [Using the CLI](#using-the-cli)
|
6
9
|
- [Using this gem in your application](#using-this-gem-in-your-application)
|
@@ -8,14 +11,23 @@ Siteleaf Gem V2
|
|
8
11
|
- [Troubleshooting](#troubleshooting)
|
9
12
|
- [Contributing](#contributing)
|
10
13
|
|
14
|
+
|
15
|
+
Prerequisites
|
16
|
+
-------------
|
17
|
+
|
18
|
+
Install Ruby and RubyGems: https://jekyllrb.com/docs/installation/
|
19
|
+
|
20
|
+
|
11
21
|
Installation
|
12
22
|
------------
|
13
23
|
|
14
|
-
The Siteleaf gem is available for installation on [
|
24
|
+
The [Siteleaf](https://www.siteleaf.com) gem is available for installation on [RubyGems](https://rubygems.org/gems/siteleaf). To install run:
|
15
25
|
|
16
|
-
gem install siteleaf
|
26
|
+
gem install siteleaf
|
17
27
|
|
18
|
-
|
28
|
+
**Note:** the v2 gem only works with v2 sites. For documentation on v1 see: https://github.com/siteleaf/siteleaf-gem/tree/v1
|
29
|
+
|
30
|
+
If maintaining sites with multiple versions, we recommend using a [Gemfile](#using-this-gem-in-your-application).
|
19
31
|
|
20
32
|
|
21
33
|
Using the CLI
|
@@ -78,7 +90,7 @@ Using this gem in your application
|
|
78
90
|
|
79
91
|
To use this gem in your application, add the following to your Gemfile:
|
80
92
|
|
81
|
-
gem 'siteleaf',
|
93
|
+
gem 'siteleaf', '~>2'
|
82
94
|
|
83
95
|
|
84
96
|
Using the API
|
data/bin/siteleaf
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'siteleaf'
|
4
|
+
require 'jekyll'
|
4
5
|
require 'fileutils'
|
6
|
+
require 'pathutil'
|
5
7
|
require 'open-uri'
|
6
8
|
require 'tempfile'
|
7
9
|
require 'yaml'
|
@@ -17,6 +19,7 @@ Commands:
|
|
17
19
|
pull Pulls files for configured site from Siteleaf
|
18
20
|
push Pushes all files in dir to configured site
|
19
21
|
publish Publish website to hosting provider
|
22
|
+
preview Generate cloud preview
|
20
23
|
help Prints this help document
|
21
24
|
version Prints the siteleaf gem version
|
22
25
|
|
@@ -30,9 +33,9 @@ See https://github.com/siteleaf/siteleaf-gem for additional documentation.
|
|
30
33
|
end
|
31
34
|
|
32
35
|
def auth(re_auth = false)
|
33
|
-
Siteleaf.load_settings if !re_auth && !Siteleaf.api_key
|
36
|
+
Siteleaf.load_settings if !re_auth && !(Siteleaf.api_key && Siteleaf.api_secret)
|
34
37
|
|
35
|
-
if re_auth or !Siteleaf.api_key
|
38
|
+
if re_auth or !(Siteleaf.api_key && Siteleaf.api_secret)
|
36
39
|
print 'Enter your Siteleaf email: '
|
37
40
|
email = $stdin.gets.chomp
|
38
41
|
|
@@ -42,28 +45,28 @@ def auth(re_auth = false)
|
|
42
45
|
system 'stty echo'
|
43
46
|
|
44
47
|
puts "\nAuthorizing..."
|
45
|
-
|
46
|
-
|
48
|
+
|
49
|
+
auth = Siteleaf::Client.auth(email, password)
|
50
|
+
if auth.is_a?(Hash) && auth.has_key?('api_key')
|
47
51
|
Siteleaf.save_settings({api_key: auth['api_key'], api_secret: auth['api_secret']})
|
48
|
-
|
52
|
+
Siteleaf.load_settings
|
53
|
+
puts "=> Account authorized." if re_auth
|
49
54
|
return true
|
50
55
|
else
|
51
|
-
|
52
|
-
return false
|
56
|
+
raise "Could not authorize, check your email or password."
|
53
57
|
end
|
54
58
|
end
|
55
|
-
rescue Exception => e
|
56
|
-
print "Error: #{e.message}\n"
|
57
59
|
end
|
58
60
|
|
59
61
|
def pull(site_id)
|
60
62
|
print "Reading site...\n"
|
61
|
-
|
63
|
+
|
62
64
|
# get all the things
|
63
65
|
site = Siteleaf::Site.find(site_id)
|
64
|
-
site_files = site.
|
66
|
+
site_files = site.source_files('.', recursive: true)
|
67
|
+
|
65
68
|
updated_count = 0
|
66
|
-
|
69
|
+
|
67
70
|
# download unmatched files
|
68
71
|
site_files.each do |file|
|
69
72
|
sha = ::File.exist?(file.name) && Siteleaf::GitHash.file(file.name)
|
@@ -75,11 +78,11 @@ def pull(site_id)
|
|
75
78
|
print "complete.\n"
|
76
79
|
end
|
77
80
|
end
|
78
|
-
|
81
|
+
|
79
82
|
# check for old files
|
80
83
|
local_files = read_dir
|
81
84
|
missing_files = []
|
82
|
-
local_files.each do |path|
|
85
|
+
local_files.each do |path|
|
83
86
|
missing_files << path if !site_files.find{|a| a.name.casecmp(path) == 0 }
|
84
87
|
end
|
85
88
|
if missing_files.empty?
|
@@ -99,42 +102,40 @@ def pull(site_id)
|
|
99
102
|
puts "=> #{missing_files.size} file(s) deleted.\n"
|
100
103
|
end
|
101
104
|
end
|
102
|
-
rescue Exception => e
|
103
|
-
print "Error: #{e.message}\n"
|
104
105
|
end
|
105
106
|
|
106
107
|
def push(site_id)
|
107
108
|
print "Reading site...\n"
|
108
|
-
|
109
|
+
|
109
110
|
# get all the things
|
110
111
|
site = Siteleaf::Site.find(site_id)
|
111
|
-
|
112
|
+
|
113
|
+
site_files = site.source_files('.', recursive: true)
|
112
114
|
local_files = read_dir
|
113
115
|
updated_count = 0
|
114
|
-
|
116
|
+
|
115
117
|
# find changed files
|
116
118
|
changed_files = local_files.reject do |path|
|
117
119
|
file = site_files.find{|a| a.name.casecmp(path) == 0 }
|
118
120
|
file && Siteleaf::GitHash.file(path) == file.sha
|
119
121
|
end
|
120
|
-
changed_files.unshift('_config.yml') if changed_files.delete('_config.yml')
|
121
|
-
|
122
|
+
changed_files.unshift('_config.yml') if changed_files.delete('_config.yml')
|
123
|
+
|
122
124
|
# upload changed files
|
123
|
-
changed_files.each do |path|
|
124
|
-
print "Uploading #{path}..."
|
125
|
+
changed_files.each do |path|
|
126
|
+
print "Uploading #{path}..."
|
125
127
|
response = Siteleaf::SourceFile.create(site_id: site_id, name: path, file: ::File.new(path))
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
print "complete.\n"
|
128
|
+
updated_count += 1
|
129
|
+
print "complete.\n"
|
130
|
+
if response.name && response.name != path
|
131
|
+
local_files.push(response.name)
|
132
|
+
puts "Warning: Remote filename has been normalized to `#{response.name}`."
|
132
133
|
end
|
133
134
|
end
|
134
|
-
|
135
|
+
|
135
136
|
# check for old files
|
136
137
|
missing_assets = []
|
137
|
-
site_files.each do |asset|
|
138
|
+
site_files.each do |asset|
|
138
139
|
missing_assets << asset if !local_files.find{|p| p.casecmp(asset.name) == 0 }
|
139
140
|
end
|
140
141
|
if missing_assets.empty?
|
@@ -154,13 +155,11 @@ def push(site_id)
|
|
154
155
|
puts "=> #{missing_assets.size} file(s) deleted.\n"
|
155
156
|
end
|
156
157
|
end
|
157
|
-
rescue Exception => e
|
158
|
-
print "Error: #{e.message}\n"
|
159
158
|
end
|
160
159
|
|
161
160
|
def import(file, quiet = true)
|
162
161
|
job = Siteleaf::Site.import(file: ::File.new(file))
|
163
|
-
|
162
|
+
|
164
163
|
if quiet
|
165
164
|
puts "=> Import queued.\n"
|
166
165
|
else
|
@@ -173,14 +172,12 @@ def import(file, quiet = true)
|
|
173
172
|
end
|
174
173
|
puts "=> Import completed.\n"
|
175
174
|
end
|
176
|
-
rescue Exception => e
|
177
|
-
print "Error: #{e.message}\n"
|
178
175
|
end
|
179
176
|
|
180
177
|
def publish(site_id, quiet = true)
|
181
178
|
site = Siteleaf::Site.new(id: site_id)
|
182
179
|
job = site.publish
|
183
|
-
|
180
|
+
|
184
181
|
if quiet
|
185
182
|
puts "=> Publish queued.\n"
|
186
183
|
else
|
@@ -193,8 +190,24 @@ def publish(site_id, quiet = true)
|
|
193
190
|
end
|
194
191
|
puts "=> Publish completed.\n"
|
195
192
|
end
|
196
|
-
|
197
|
-
|
193
|
+
end
|
194
|
+
|
195
|
+
def preview(site_id, quiet = true)
|
196
|
+
site = Siteleaf::Site.new(id: site_id)
|
197
|
+
job = site.preview
|
198
|
+
|
199
|
+
if quiet
|
200
|
+
puts "=> Preview queued.\n"
|
201
|
+
else
|
202
|
+
last_msg = nil
|
203
|
+
job.stream do |s|
|
204
|
+
if (msg = s["message"]) && (msg != last_msg)
|
205
|
+
puts msg
|
206
|
+
last_msg = msg
|
207
|
+
end
|
208
|
+
end
|
209
|
+
puts "=> Preview completed: https://#{site_id}.cloud-preview.siteleaf.com\n"
|
210
|
+
end
|
198
211
|
end
|
199
212
|
|
200
213
|
def config(site)
|
@@ -209,101 +222,115 @@ def get_site_id
|
|
209
222
|
Siteleaf.send "#{key}=", value
|
210
223
|
end
|
211
224
|
end
|
212
|
-
|
225
|
+
|
213
226
|
ENV['SITELEAF_SITE_ID'] || if settings = Siteleaf.load_settings('.siteleaf.yml')
|
214
227
|
settings[:site_id]
|
215
228
|
end
|
216
229
|
end
|
217
230
|
|
218
231
|
def read_dir
|
219
|
-
|
220
|
-
|
232
|
+
jekyll_site = Jekyll::Site.new(Jekyll.configuration(quiet: true))
|
233
|
+
|
221
234
|
ignore_paths = ['config.ru', '.*', '_site/*', 'Gemfile', 'Gemfile.lock']
|
222
235
|
ignore_paths += ::File.read('.siteleafignore').split(/\r?\n/) if ::File.exists?('.siteleafignore')
|
223
|
-
ignore_paths +=
|
236
|
+
ignore_paths += jekyll_site.exclude
|
224
237
|
|
238
|
+
entry_filter = Jekyll::EntryFilter.new(jekyll_site)
|
239
|
+
|
225
240
|
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) }
|
241
|
+
::File.directory?(path) || entry_filter.glob_include?(ignore_paths, path)
|
228
242
|
end
|
229
243
|
end
|
230
244
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
auth
|
238
|
-
|
239
|
-
|
240
|
-
if
|
241
|
-
|
242
|
-
|
243
|
-
|
245
|
+
begin
|
246
|
+
case ARGV[0]
|
247
|
+
when '-v', '--version', 'version'
|
248
|
+
puts Siteleaf::VERSION
|
249
|
+
when '-h', '--help', 'help'
|
250
|
+
puts help
|
251
|
+
when 'auth'
|
252
|
+
auth true
|
253
|
+
when 'c', 'config', 'setup'
|
254
|
+
if auth != false
|
255
|
+
if site = Siteleaf::Site.find_by_domain(ARGV[1])
|
256
|
+
config site
|
257
|
+
else
|
258
|
+
raise "No site found for `#{ARGV[1]}`, run `siteleaf new #{ARGV[1]}` to create it.\n"
|
259
|
+
end
|
244
260
|
end
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
if (site = Siteleaf::Site.create(:title => ARGV[1], :domain => ARGV[1])) && (!site.error)
|
261
|
+
when 'n', 'new'
|
262
|
+
if auth != false
|
263
|
+
site = Siteleaf::Site.create(:title => ARGV[1], :domain => ARGV[1])
|
249
264
|
dir = ARGV.size >= 3 ? ARGV[2] : ARGV[1]
|
250
265
|
Dir.mkdir(dir) unless ::File.directory?(dir)
|
251
266
|
Dir.chdir(dir)
|
252
267
|
config site
|
268
|
+
end
|
269
|
+
when 'pull'
|
270
|
+
if ARGV.size == 1
|
271
|
+
site_id = get_site_id
|
272
|
+
if auth != false
|
273
|
+
if site_id
|
274
|
+
pull(site_id)
|
275
|
+
else
|
276
|
+
raise "Site not configured, run `siteleaf config yoursite.com`.\n"
|
277
|
+
end
|
278
|
+
end
|
253
279
|
else
|
254
|
-
|
280
|
+
raise "`#{ARGV.join(' ')}` command not found.\n"
|
255
281
|
end
|
256
|
-
|
257
|
-
|
258
|
-
|
282
|
+
when 'push'
|
283
|
+
if ARGV.size == 1
|
284
|
+
site_id = get_site_id
|
285
|
+
if auth != false
|
286
|
+
if site_id
|
287
|
+
push(site_id)
|
288
|
+
else
|
289
|
+
raise "Site not configured, run `siteleaf config yoursite.com`.\n"
|
290
|
+
end
|
291
|
+
end
|
292
|
+
else
|
293
|
+
raise "`#{ARGV.join(' ')}` command not found.\n"
|
294
|
+
end
|
295
|
+
when 'publish'
|
259
296
|
site_id = get_site_id
|
260
297
|
if auth != false
|
298
|
+
quiet = %w[-q --quiet].include?(ARGV[1]) && ARGV[1]
|
261
299
|
if site_id
|
262
|
-
|
300
|
+
publish(site_id, quiet)
|
263
301
|
else
|
264
|
-
|
302
|
+
raise "Site not configured, run `siteleaf config yoursite.com`.\n"
|
265
303
|
end
|
266
304
|
end
|
267
|
-
|
268
|
-
puts "`#{ARGV.join(' ')}` command not found.\n"
|
269
|
-
end
|
270
|
-
when 'push'
|
271
|
-
if ARGV.size == 1
|
305
|
+
when 'preview'
|
272
306
|
site_id = get_site_id
|
273
307
|
if auth != false
|
308
|
+
quiet = %w[-q --quiet].include?(ARGV[1]) && ARGV[1]
|
274
309
|
if site_id
|
275
|
-
|
310
|
+
preview(site_id, quiet)
|
276
311
|
else
|
277
|
-
|
312
|
+
raise "Site not configured, run `siteleaf config yoursite.com`.\n"
|
278
313
|
end
|
279
314
|
end
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
end
|
293
|
-
when 'import'
|
294
|
-
site_id = get_site_id
|
295
|
-
if auth != false
|
296
|
-
file = ARGV[1]
|
297
|
-
if File.extname(file) != '.zip'
|
298
|
-
puts "Import file must be ZIP format.\n"
|
299
|
-
elsif !File.exist?(file)
|
300
|
-
puts "Import file not found.\n"
|
301
|
-
else
|
302
|
-
quiet = %w[-q --quiet].include?(ARGV[2]) && ARGV[2]
|
303
|
-
import(file, quiet)
|
315
|
+
when 'import'
|
316
|
+
site_id = get_site_id
|
317
|
+
if auth != false
|
318
|
+
file = ARGV[1]
|
319
|
+
if File.extname(file) != '.zip'
|
320
|
+
raise "Import file must be ZIP format.\n"
|
321
|
+
elsif !File.exist?(file)
|
322
|
+
raise "Import file not found.\n"
|
323
|
+
else
|
324
|
+
quiet = %w[-q --quiet].include?(ARGV[2]) && ARGV[2]
|
325
|
+
import(file, quiet)
|
326
|
+
end
|
304
327
|
end
|
328
|
+
else
|
329
|
+
puts "Error: `#{ARGV[0]}` command not found.\n"
|
330
|
+
puts help
|
331
|
+
exit(1)
|
305
332
|
end
|
306
|
-
|
307
|
-
puts "
|
308
|
-
|
333
|
+
rescue Exception => e
|
334
|
+
puts "Error: #{e.message}\n"
|
335
|
+
exit(1)
|
309
336
|
end
|
data/lib/siteleaf/client.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
require '
|
1
|
+
require 'httparty'
|
2
2
|
|
3
3
|
module Siteleaf
|
4
4
|
class Client
|
5
5
|
def self.auth(email, password)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
return 'error' => e.message # error
|
6
|
+
request = HTTParty.post(Siteleaf.api_url('auth'), {
|
7
|
+
:basic_auth => {:username => email, :password => password},
|
8
|
+
:headers => {"User-Agent" => "Siteleaf Gem/#{Siteleaf::VERSION}"}
|
9
|
+
})
|
10
|
+
response = request.parsed_response
|
11
|
+
if response.is_a?(Hash) && error = response['message'] || response['error']
|
12
|
+
raise error
|
14
13
|
end
|
14
|
+
response
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.get(path, params = {})
|
@@ -33,33 +33,28 @@ module Siteleaf
|
|
33
33
|
|
34
34
|
def self.execute(method, path, params = nil)
|
35
35
|
Siteleaf.load_settings if !Siteleaf.api_key
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
:basic_auth => {:username => Siteleaf.api_key, :password => Siteleaf.api_secret},
|
51
|
-
:headers => {"User-Agent" => "Siteleaf Gem/#{Siteleaf::VERSION}"},
|
52
|
-
:timeout => 300
|
53
|
-
})
|
54
|
-
end
|
55
|
-
if request.respond_to?('parsed_response')
|
56
|
-
return request.parsed_response # parse JSON
|
57
|
-
else
|
58
|
-
return request # raw
|
59
|
-
end
|
60
|
-
rescue => e
|
61
|
-
return 'error' => e.message # error
|
36
|
+
|
37
|
+
options = {
|
38
|
+
:basic_auth => {:username => Siteleaf.api_key, :password => Siteleaf.api_secret},
|
39
|
+
:headers => {"User-Agent" => "Siteleaf Gem/#{Siteleaf::VERSION}"},
|
40
|
+
:timeout => 300
|
41
|
+
}
|
42
|
+
|
43
|
+
if method == :get || method == :delete
|
44
|
+
options[:query] = params
|
45
|
+
elsif params.has_key?('file') || params.has_key?(:file)
|
46
|
+
options[:body] = params
|
47
|
+
else
|
48
|
+
options[:body] = params.to_json
|
49
|
+
options[:headers]["Content-Type"] = "application/json"
|
62
50
|
end
|
51
|
+
|
52
|
+
request = HTTParty.send(method, Siteleaf.api_url(path), options)
|
53
|
+
response = request.parsed_response
|
54
|
+
if response.is_a?(Hash) && error = response['message'] || response['error']
|
55
|
+
raise error
|
56
|
+
end
|
57
|
+
response
|
63
58
|
end
|
64
59
|
end
|
65
60
|
end
|
data/lib/siteleaf/collection.rb
CHANGED
@@ -3,40 +3,40 @@ module Siteleaf
|
|
3
3
|
|
4
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
8
|
::File.join("sites", site_id, "collections")
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def entity_endpoint
|
12
12
|
::File.join(create_endpoint, identifier)
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def identifier
|
16
16
|
path
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def site
|
20
20
|
Site.find(site_id)
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def documents
|
24
24
|
result = Client.get "#{entity_endpoint}/documents"
|
25
25
|
result.map { |r| Document.new(r) } if result.is_a? Array
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def files
|
29
29
|
result = Client.get "#{entity_endpoint}/files"
|
30
30
|
result.map { |r| File.new(r) } if result.is_a? Array
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def output?
|
34
34
|
output == true
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def filename
|
38
38
|
path
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
end
|
42
|
-
end
|
42
|
+
end
|
data/lib/siteleaf/content.rb
CHANGED
@@ -3,27 +3,27 @@ module Siteleaf
|
|
3
3
|
|
4
4
|
attr_accessor :title, :body, :path, :permalink, :visibility, :date, :user_id, :site_id, :metadata
|
5
5
|
attr_reader :id, :filename, :basename, :directory, :url, :sha, :created_at, :updated_at
|
6
|
-
|
6
|
+
|
7
7
|
def site
|
8
8
|
Site.find(site_id) if site_id
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def draft?
|
12
12
|
visibility == 'draft'
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def hidden?
|
16
16
|
visibility == 'hidden'
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def visible?
|
20
20
|
visibility == 'visible'
|
21
21
|
end
|
22
22
|
alias_method :published?, :visible?
|
23
|
-
|
23
|
+
|
24
24
|
def to_file
|
25
25
|
SourceFile.new(site_id: site_id, name: filename).to_file
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
end
|
29
29
|
end
|
data/lib/siteleaf/entity.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Siteleaf
|
2
2
|
class Entity
|
3
|
-
|
3
|
+
|
4
4
|
attr_reader :error, :message
|
5
5
|
|
6
6
|
def initialize(attributes = {})
|
@@ -20,7 +20,7 @@ module Siteleaf
|
|
20
20
|
def self.create(attributes = {})
|
21
21
|
new(attributes).save
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def self.delete(identifier)
|
25
25
|
Client.delete "#{endpoint}/#{identifier}"
|
26
26
|
end
|
@@ -31,9 +31,11 @@ module Siteleaf
|
|
31
31
|
else
|
32
32
|
result = Client.post create_endpoint, attributes
|
33
33
|
end
|
34
|
-
if result
|
34
|
+
if result.is_a?(Hash)
|
35
35
|
self.attributes = result
|
36
36
|
return self
|
37
|
+
else
|
38
|
+
raise 'Invalid response'
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
@@ -60,11 +62,11 @@ module Siteleaf
|
|
60
62
|
def create_endpoint
|
61
63
|
self.class.endpoint
|
62
64
|
end
|
63
|
-
|
65
|
+
|
64
66
|
def entity_endpoint
|
65
67
|
"#{self.class.endpoint}/#{identifier}"
|
66
68
|
end
|
67
|
-
|
69
|
+
|
68
70
|
def identifier
|
69
71
|
id
|
70
72
|
end
|
data/lib/siteleaf/site.rb
CHANGED
@@ -3,79 +3,62 @@ module Siteleaf
|
|
3
3
|
|
4
4
|
attr_accessor :title, :domain, :timezone, :metadata, :defaults
|
5
5
|
attr_reader :id, :user_id, :created_at, :updated_at
|
6
|
-
|
6
|
+
|
7
7
|
def self.find_by_domain(domain)
|
8
8
|
results = Client.get self.endpoint
|
9
9
|
result = results.find {|d| d['domain'] == domain }
|
10
10
|
self.new(result) if result
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def self.import(attrs)
|
14
14
|
result = Client.post "import", attrs
|
15
15
|
Job.new(id: result["job_id"]) if result
|
16
16
|
end
|
17
|
-
|
18
|
-
def source_files(dir = '.')
|
19
|
-
result = Client.get ::File.join(entity_endpoint, "source", dir)
|
17
|
+
|
18
|
+
def source_files(dir = '.', opts = {})
|
19
|
+
result = Client.get ::File.join(entity_endpoint, "source", dir), opts
|
20
20
|
result.map { |r| SourceFile.new(r.merge('site_id' => id)) } if result.is_a? Array
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def pages
|
24
24
|
result = Client.get "#{entity_endpoint}/pages"
|
25
25
|
result.map { |r| Page.new(r) } if result.is_a? Array
|
26
|
-
end
|
27
|
-
|
26
|
+
end
|
27
|
+
|
28
28
|
def collections
|
29
29
|
result = Client.get "#{entity_endpoint}/collections"
|
30
30
|
result.map { |r| Collection.new(r) } if result.is_a? Array
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def posts
|
34
34
|
Collection.new(path: 'posts', site_id: id).documents
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def uploads
|
38
38
|
Collection.new(path: 'uploads', site_id: id).files
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def publish
|
42
42
|
result = Client.post "#{entity_endpoint}/publish", {}
|
43
43
|
Job.new(id: result["job_id"]) if result
|
44
44
|
end
|
45
45
|
|
46
|
+
def preview
|
47
|
+
result = Client.post "#{entity_endpoint}/preview", {}
|
48
|
+
Job.new(id: result["job_id"]) if result
|
49
|
+
end
|
50
|
+
|
46
51
|
def full_url
|
47
52
|
"http://#{domain}"
|
48
53
|
end
|
49
|
-
|
54
|
+
|
50
55
|
def filename
|
51
56
|
"_config.yml"
|
52
57
|
end
|
53
|
-
|
58
|
+
|
54
59
|
def sha
|
55
60
|
Siteleaf::GitHash.string(to_file)
|
56
61
|
end
|
57
|
-
|
58
|
-
def source_tree(dir = '.')
|
59
|
-
@tree_files = []
|
60
|
-
@tree_dirs = []
|
61
|
-
recursive_source_files(dir)
|
62
|
-
@tree_files
|
63
|
-
end
|
64
|
-
|
65
|
-
protected
|
66
|
-
|
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
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
62
|
+
|
80
63
|
end
|
81
|
-
end
|
64
|
+
end
|
data/lib/siteleaf/source_file.rb
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
module Siteleaf
|
2
2
|
class SourceFile < Entity
|
3
|
-
|
3
|
+
|
4
4
|
attr_accessor :file, :name, :site_id
|
5
5
|
attr_reader :name, :url, :download_url, :type, :filesize, :sha, :created_at, :updated_at, :user_id
|
6
|
-
|
6
|
+
|
7
7
|
def create_endpoint
|
8
|
-
|
8
|
+
uri = URI.encode(identifier)
|
9
|
+
uri = uri.gsub('[', '%5B').gsub(']', '%5D') # workaround for https://bugs.ruby-lang.org/issues/12235
|
10
|
+
::File.join('sites', site_id, 'source', uri)
|
9
11
|
end
|
10
|
-
|
12
|
+
|
11
13
|
def entity_endpoint
|
12
14
|
create_endpoint
|
13
15
|
end
|
14
|
-
|
16
|
+
|
15
17
|
def identifier
|
16
18
|
name
|
17
19
|
end
|
18
|
-
|
20
|
+
|
19
21
|
def to_file
|
20
|
-
|
21
|
-
raise response['message'] if response['message'] # indicates API error
|
22
|
-
response.body
|
22
|
+
Client.get("#{entity_endpoint}?download")
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
end
|
26
|
-
end
|
26
|
+
end
|
data/lib/siteleaf/version.rb
CHANGED
data/siteleaf.gemspec
CHANGED
@@ -11,13 +11,13 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.email = ["api@siteleaf.com"]
|
12
12
|
gem.description = %q{A Ruby interface and command line utility for the Siteleaf API.}
|
13
13
|
gem.summary = "Siteleaf Ruby interface"
|
14
|
-
gem.homepage = "
|
15
|
-
|
14
|
+
gem.homepage = "https://www.siteleaf.com"
|
15
|
+
|
16
16
|
gem.required_ruby_version = '>= 1.9.3'
|
17
|
-
|
18
|
-
gem.add_dependency 'httparty', '>= 0.
|
19
|
-
gem.add_dependency '
|
20
|
-
gem.add_dependency '
|
17
|
+
|
18
|
+
gem.add_dependency 'httparty', '>= 0.16.0'
|
19
|
+
gem.add_dependency 'psych', '>= 2.1.0'
|
20
|
+
gem.add_dependency 'jekyll', '>= 1.4.1'
|
21
21
|
gem.add_dependency 'rack'
|
22
22
|
|
23
23
|
gem.files = `git ls-files`.split($/)
|
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.
|
4
|
+
version: 2.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Siteleaf
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -16,42 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.16.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.16.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: psych
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 2.1.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 2.1.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: jekyll
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.4.1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 1.4.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rack
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,6 +75,7 @@ extensions: []
|
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
77
|
- ".gitignore"
|
78
|
+
- CNAME
|
78
79
|
- Gemfile
|
79
80
|
- LICENSE.txt
|
80
81
|
- README.md
|
@@ -95,11 +96,11 @@ files:
|
|
95
96
|
- lib/siteleaf/user.rb
|
96
97
|
- lib/siteleaf/version.rb
|
97
98
|
- siteleaf.gemspec
|
98
|
-
homepage:
|
99
|
+
homepage: https://www.siteleaf.com
|
99
100
|
licenses:
|
100
101
|
- MIT
|
101
102
|
metadata: {}
|
102
|
-
post_install_message:
|
103
|
+
post_install_message:
|
103
104
|
rdoc_options: []
|
104
105
|
require_paths:
|
105
106
|
- lib
|
@@ -114,9 +115,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
115
|
- !ruby/object:Gem::Version
|
115
116
|
version: '0'
|
116
117
|
requirements: []
|
117
|
-
|
118
|
-
|
119
|
-
signing_key:
|
118
|
+
rubygems_version: 3.1.4
|
119
|
+
signing_key:
|
120
120
|
specification_version: 4
|
121
121
|
summary: Siteleaf Ruby interface
|
122
122
|
test_files: []
|