scms 4.2.6 → 4.3.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.
- checksums.yaml +8 -8
- data/Gemfile.lock +52 -0
- data/bin/scms +17 -5
- data/lib/scms/deploy-ftp.rb +139 -0
- data/lib/scms/{s3deploy.rb → deploy-s3.rb} +0 -0
- data/lib/scms/extensions.rb +21 -0
- data/lib/scms/scms-watcher.rb +1 -1
- data/lib/scms/version.rb +1 -1
- data/lib/scms.rb +25 -25
- data/scms.gemspec +1 -0
- data/setup.cmd +4 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
M2Q5Yjg1ZTM4OGM2YWYxN2FlZjM3NGY5NjdjZmFjY2NkM2FkMzEyYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZTFhMTIwMzFjZjYxZThiN2UyMmQzMDA4NGY3ZjYwM2M2YWJkMGY2Nw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
M2Y2YWM4NGE3Zjk2MDk0MWYyMDhlZTQ4NzYwOWVmZTAzMTMxYjUzMGY3ZDYy
|
10
|
+
MmNiNzFlY2JiY2JlMjU4ZWY4N2ZiNzMwZGUwMTVhYTMzZTk5MzI5YWM5YTI2
|
11
|
+
ZDYxMmI2MWQ2Y2VhZmQxZmMwNTk5OGYyOTViMTdjYzhmN2QwMDg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
M2Y0NTAyYmI3ZmY0YmU2ZTI0OThiMTZhYjVkOGExMThiZGFmY2NmMzBhNWYx
|
14
|
+
MGMyNzMxZWI1M2VhNDk5MDQ0ZDU5NDUzY2FmOTI2ZDFiMmExNjc4OWQ3ODI4
|
15
|
+
Mzc2Nzc4MjM4ZmI4NWYwZmY5NjczMjI1Yjg1NjdiMWU3M2M3MzY=
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
scms (4.2.6)
|
5
|
+
cprobert-s3sync
|
6
|
+
filewatcher
|
7
|
+
launchy
|
8
|
+
listen
|
9
|
+
maruku
|
10
|
+
nokogiri
|
11
|
+
packr
|
12
|
+
sass
|
13
|
+
webrick
|
14
|
+
|
15
|
+
GEM
|
16
|
+
remote: https://rubygems.org/
|
17
|
+
specs:
|
18
|
+
addressable (2.3.5)
|
19
|
+
celluloid (0.15.2)
|
20
|
+
timers (~> 1.1.0)
|
21
|
+
cprobert-s3sync (1.4.1)
|
22
|
+
ffi (1.9.3-x86-mingw32)
|
23
|
+
filewatcher (0.3.2)
|
24
|
+
trollop (>= 1.16.2)
|
25
|
+
launchy (2.4.2)
|
26
|
+
addressable (~> 2.3)
|
27
|
+
listen (2.4.0)
|
28
|
+
celluloid (>= 0.15.2)
|
29
|
+
rb-fsevent (>= 0.9.3)
|
30
|
+
rb-inotify (>= 0.9)
|
31
|
+
maruku (0.7.1)
|
32
|
+
mini_portile (0.5.2)
|
33
|
+
nokogiri (1.6.1-x86-mingw32)
|
34
|
+
mini_portile (~> 0.5.0)
|
35
|
+
oyster (0.9.5)
|
36
|
+
packr (3.2.1)
|
37
|
+
oyster (>= 0.9.5)
|
38
|
+
rake (10.1.1)
|
39
|
+
rb-fsevent (0.9.4)
|
40
|
+
rb-inotify (0.9.3)
|
41
|
+
ffi (>= 0.5.0)
|
42
|
+
sass (3.2.13)
|
43
|
+
timers (1.1.0)
|
44
|
+
trollop (2.0)
|
45
|
+
webrick (1.3.1)
|
46
|
+
|
47
|
+
PLATFORMS
|
48
|
+
x86-mingw32
|
49
|
+
|
50
|
+
DEPENDENCIES
|
51
|
+
rake
|
52
|
+
scms!
|
data/bin/scms
CHANGED
@@ -14,6 +14,9 @@ require "scms/version"
|
|
14
14
|
require 'scms/scms-watcher.rb'
|
15
15
|
require 'scms/scms-httpserver.rb'
|
16
16
|
|
17
|
+
require 'scms/deploy-s3.rb'
|
18
|
+
require 'scms/deploy-ftp.rb'
|
19
|
+
|
17
20
|
class String
|
18
21
|
def to_path(end_slash=false)
|
19
22
|
"#{'/' if self[0]=='\\'}#{self.split('\\').join('/')}#{'/' if end_slash}"
|
@@ -75,7 +78,11 @@ optparse = OptionParser.new do|opts|
|
|
75
78
|
# This displays the help screen, all programs are assumed to have this option.
|
76
79
|
opts.on( '-h', '--help', 'Display this help screen' ) do
|
77
80
|
puts "Default action = build; default website directory = current working directory"
|
81
|
+
puts ""
|
78
82
|
puts opts
|
83
|
+
puts ""
|
84
|
+
puts "Get the lowdown at: http://cprobert.github.io/Static-CMS"
|
85
|
+
puts ""
|
79
86
|
exit
|
80
87
|
end
|
81
88
|
end
|
@@ -96,11 +103,11 @@ $website = Folders[:website]
|
|
96
103
|
$watch = options[:watch]
|
97
104
|
$cmsmode = options[:mode] == "cms"
|
98
105
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
106
|
+
ScmsUtils.log "System root folder = #{Folders[:root]}"
|
107
|
+
ScmsUtils.log "Website folder = #{Folders[:website]}"
|
108
|
+
ScmsUtils.log "Destination dir = #{Folders[:destination]}"
|
109
|
+
ScmsUtils.log "Config dir = #{Folders[:config]}"
|
110
|
+
ScmsUtils.log "Mode = #{options[:mode]}"
|
104
111
|
|
105
112
|
raise "Invalid working directory! #{Folders[:website]}" if !File::directory?(Folders[:website])
|
106
113
|
Dir.chdir Folders[:website]
|
@@ -151,4 +158,9 @@ if options[:publish]
|
|
151
158
|
mimetypefile = File.join(Folders[:assets], "mime.types")
|
152
159
|
S3Deploy.sync(Folders[:website], Folders[:config], mimetypefile)
|
153
160
|
end
|
161
|
+
|
162
|
+
if File.exists?(File.join(Folders[:config], "_ftpconfig.yml"))
|
163
|
+
puts "Deploying to FTP"
|
164
|
+
FtpDeploy.sync(Folders[:website], Folders[:config])
|
165
|
+
end
|
154
166
|
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
require 'scms/extensions.rb'
|
5
|
+
require 'scms/scms-utils.rb'
|
6
|
+
|
7
|
+
module FtpDeploy
|
8
|
+
|
9
|
+
# yml file example:
|
10
|
+
|
11
|
+
# host: localhost
|
12
|
+
# port: 21
|
13
|
+
# username: exampleuser
|
14
|
+
# password: seCre7Squr1al
|
15
|
+
# passive: true
|
16
|
+
# directory: /htdocs
|
17
|
+
|
18
|
+
def FtpDeploy.sync(website, config)
|
19
|
+
|
20
|
+
ftpYamlPath=File.join(config, "_ftpconfig.yml")
|
21
|
+
settings = YAML.load_file(ftpYamlPath)
|
22
|
+
throw "No gost defined in _ftpconfig.yml settings file" if settings['host'] == nil
|
23
|
+
|
24
|
+
host = settings['host']
|
25
|
+
port = (settings['port'] || 21).to_i
|
26
|
+
passive = settings['passive'] || true
|
27
|
+
remote_dir = settings['directory'] || "/"
|
28
|
+
|
29
|
+
ScmsUtils.boldlog("Sending site over FTP (host: #{host}, port: #{port})")
|
30
|
+
begin
|
31
|
+
if settings['username'].nil?
|
32
|
+
print "FTP Username: "
|
33
|
+
username = $stdin.gets.chomp
|
34
|
+
else
|
35
|
+
username = settings['username']
|
36
|
+
end
|
37
|
+
|
38
|
+
if settings['password'].nil?
|
39
|
+
print "FTP Password: "
|
40
|
+
# We hide the entered characters before to ask for the password
|
41
|
+
system "stty -echo"
|
42
|
+
password = $stdin.gets.chomp
|
43
|
+
system "stty echo"
|
44
|
+
else
|
45
|
+
password = settings['password']
|
46
|
+
end
|
47
|
+
rescue NoMethodError, Interrupt
|
48
|
+
# When the process is exited, we display the characters again
|
49
|
+
# And we exit
|
50
|
+
system "stty echo"
|
51
|
+
exit
|
52
|
+
end
|
53
|
+
|
54
|
+
ftp = FtpDeploy::Ftp.new(host, port, {:username => username, :password => password, :passive => passive})
|
55
|
+
puts "\r\nConnected to server. Sending site"
|
56
|
+
ftp.sync(website, remote_dir)
|
57
|
+
puts "Successfully sent site"
|
58
|
+
end
|
59
|
+
|
60
|
+
class Ftp
|
61
|
+
attr_reader :host, :port, :username, :password, :passive
|
62
|
+
|
63
|
+
def initialize(host, port = 21, options = Hash.new)
|
64
|
+
options = {:username => nil, :password => nil}.merge(options)
|
65
|
+
@host, @port = host, port
|
66
|
+
@username, @password = options[:username], options[:password]
|
67
|
+
@passive = options[:passive]
|
68
|
+
end
|
69
|
+
|
70
|
+
def sync(local, distant)
|
71
|
+
connect do |ftp|
|
72
|
+
send_dir(ftp, local, distant)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
def connect
|
78
|
+
begin
|
79
|
+
Net::FTP.open(host) do |ftp|
|
80
|
+
ftp.passive = @passive
|
81
|
+
#ftp.debug_mode = true
|
82
|
+
ftp.connect(host, port)
|
83
|
+
ftp.login(username, password)
|
84
|
+
puts ftp.welcome
|
85
|
+
yield ftp
|
86
|
+
end
|
87
|
+
rescue Exception=>e
|
88
|
+
ScmsUtils.errLog(e.message)
|
89
|
+
ScmsUtils.log(e.backtrace.inspect)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def send_dir(ftp, local, distant)
|
94
|
+
begin
|
95
|
+
ftp.mkdir(distant)
|
96
|
+
rescue Net::FTPPermError
|
97
|
+
# We don't do anything. The directory already exists.
|
98
|
+
# TODO : this is also risen if we don't have write access. Then, we need to raise.
|
99
|
+
end
|
100
|
+
Dir.foreach(local) do |file_name|
|
101
|
+
|
102
|
+
# If the file/directory is hidden (first character is a dot), we ignore it
|
103
|
+
next if file_name =~ /^(\.|\.\.)$/
|
104
|
+
next if file_name =~ /^(\.)/
|
105
|
+
next if file_name =~ /^_/
|
106
|
+
|
107
|
+
#puts file_name
|
108
|
+
|
109
|
+
if ::File.stat(local + "/" + file_name).directory?
|
110
|
+
# It is a directory, we recursively send it
|
111
|
+
begin
|
112
|
+
ftp.mkdir(distant + "/" + file_name)
|
113
|
+
rescue Net::FTPPermError
|
114
|
+
# We don't do anything. The directory already exists.
|
115
|
+
# TODO : this is also risen if we don't have write access. Then, we need to raise.
|
116
|
+
end
|
117
|
+
send_dir(ftp, local + "/" + file_name, distant + "/" + file_name)
|
118
|
+
else
|
119
|
+
# It's a file, we just send it
|
120
|
+
localFilePath = local + "/" + file_name
|
121
|
+
remoteFilePath = distant + "/" + file_name
|
122
|
+
|
123
|
+
if File.binary?(local + "/" + file_name)
|
124
|
+
puts "#{file_name} (binary)"
|
125
|
+
ftp.putbinaryfile(localFilePath, remoteFilePath)
|
126
|
+
else
|
127
|
+
puts "#{file_name} (text)"
|
128
|
+
ftp.puttextfile(localFilePath, remoteFilePath)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
private
|
135
|
+
def host_with_port
|
136
|
+
"#{host}:#{port}"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
File without changes
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class File
|
2
|
+
|
3
|
+
# def self.is_bin?(f)
|
4
|
+
# file_test = %x(file #{f})
|
5
|
+
|
6
|
+
# # http://stackoverflow.com/a/8873922
|
7
|
+
# file_test = file_test.encode('UTF-16', 'UTF-8', :invalid => :replace, :replace => '').encode('UTF-8', 'UTF-16')
|
8
|
+
|
9
|
+
# file_test !~ /text/
|
10
|
+
# end
|
11
|
+
|
12
|
+
def File.binary? name
|
13
|
+
open name do |f|
|
14
|
+
while (b=f.read(256)) do
|
15
|
+
return true if b[ "\0"]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/lib/scms/scms-watcher.rb
CHANGED
@@ -61,7 +61,7 @@ module ScmsWatcher
|
|
61
61
|
# Listen to changed to folders that start with an underscore (_)
|
62
62
|
folders = []
|
63
63
|
Dir.glob('*').select { |fn| File.directory?(fn) and (fn.match(/^_/) ) }.each do|f|
|
64
|
-
folders.push(f)
|
64
|
+
folders.push(f)
|
65
65
|
end
|
66
66
|
puts "Listening to #{folders}"
|
67
67
|
listener = Listen.to(folders, force_polling: true) do |modified, added, removed|
|
data/lib/scms/version.rb
CHANGED
data/lib/scms.rb
CHANGED
@@ -6,7 +6,6 @@ module Scms
|
|
6
6
|
require 'scms/scms-bundler.rb'
|
7
7
|
require 'scms/scms-parser.rb'
|
8
8
|
require 'scms/scms-xmlhandler.rb'
|
9
|
-
require 'scms/s3deploy.rb'
|
10
9
|
|
11
10
|
require 'fileutils'
|
12
11
|
require 'pathname'
|
@@ -50,6 +49,7 @@ module Scms
|
|
50
49
|
ScmsUtils.writelog("type NUL > #{bootstrap}", website)
|
51
50
|
end
|
52
51
|
end
|
52
|
+
ScmsUtils.log("Generating pages")
|
53
53
|
Scms.generatePages(website, settings, options)
|
54
54
|
else
|
55
55
|
ScmsUtils.errLog("Config is empty")
|
@@ -60,10 +60,32 @@ module Scms
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def Scms.generatePages(website, settings, options)
|
63
|
-
# build pages defined in config file
|
64
|
-
Scms.generatePagesFromSettings(website, settings, options)
|
65
63
|
# build pages pased on _pages folder
|
66
64
|
Scms.generatePagesFromFolder(website, settings, options)
|
65
|
+
# build pages defined in config file
|
66
|
+
Scms.generatePagesFromSettings(website, settings, options)
|
67
|
+
end
|
68
|
+
|
69
|
+
def Scms.generatePagesFromFolder(website, settings, options)
|
70
|
+
pagesFolder = File.join(website, "_pages")
|
71
|
+
Dir.glob("#{pagesFolder}/**/*/").each do |pageFolder|
|
72
|
+
pagename = File.basename(pageFolder, ".*")
|
73
|
+
pageconfig = nil
|
74
|
+
pageconfig = Scms.getSettings(pageFolder) if File.exists?(File.join(pageFolder, "_config.yml"))
|
75
|
+
pageOptions = PageOptions.new(pagename, website, pageconfig, settings)
|
76
|
+
views = Hash.new {}
|
77
|
+
if pageconfig != nil
|
78
|
+
views = Scms.getSettingsViews(pageconfig["views"], website, pageOptions, options) if pageconfig["views"] != nil
|
79
|
+
end
|
80
|
+
|
81
|
+
Dir.glob(File.join(pageFolder, "*")).reject { |f| f =~ /\.yml$/ || File.directory?(f) }.each do |view|
|
82
|
+
viewname = File.basename(view, ".*")
|
83
|
+
viewpath = Pathname.new(view).relative_path_from(Pathname.new(website)).to_s
|
84
|
+
viewmodel = Scms.getViewModel(viewname, viewpath, website, pageOptions, options)
|
85
|
+
views[viewname] = Scms.renderView(viewpath, viewmodel)
|
86
|
+
end
|
87
|
+
Scms.savePage(settings, website, pageOptions, views, options)
|
88
|
+
end
|
67
89
|
end
|
68
90
|
|
69
91
|
def Scms.generatePagesFromSettings(website, settings, options)
|
@@ -105,28 +127,6 @@ module Scms
|
|
105
127
|
return views
|
106
128
|
end
|
107
129
|
|
108
|
-
def Scms.generatePagesFromFolder(website, settings, options)
|
109
|
-
pagesFolder = File.join(website, "_pages")
|
110
|
-
Dir.glob("#{pagesFolder}/**/*/").each do |pageFolder|
|
111
|
-
pagename = File.basename(pageFolder, ".*")
|
112
|
-
pageconfig = nil
|
113
|
-
pageconfig = Scms.getSettings(pageFolder) if File.exists?(File.join(pageFolder, "_config.yml"))
|
114
|
-
pageOptions = PageOptions.new(pagename, website, pageconfig, settings)
|
115
|
-
views = Hash.new {}
|
116
|
-
if pageconfig != nil
|
117
|
-
views = Scms.getSettingsViews(pageconfig["views"], website, pageOptions, options) if pageconfig["views"] != nil
|
118
|
-
end
|
119
|
-
|
120
|
-
Dir.glob(File.join(pageFolder, "*")).reject { |f| f =~ /\.yml$/ || File.directory?(f) }.each do |view|
|
121
|
-
viewname = File.basename(view, ".*")
|
122
|
-
viewpath = Pathname.new(view).relative_path_from(Pathname.new(website)).to_s
|
123
|
-
viewmodel = Scms.getViewModel(viewname, viewpath, website, pageOptions, options)
|
124
|
-
views[viewname] = Scms.renderView(viewpath, viewmodel)
|
125
|
-
end
|
126
|
-
Scms.savePage(settings, website, pageOptions, views, options)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
130
|
def Scms.getViewModel(viewname, viewpath, website, pageOptions, options, viewData = nil)
|
131
131
|
#puts "parsing view: #{viewname}"
|
132
132
|
|
data/scms.gemspec
CHANGED
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_dependency "webrick"
|
37
37
|
spec.add_dependency "launchy"
|
38
38
|
spec.add_dependency "nokogiri"
|
39
|
+
#spec.add_dependency "ptools"
|
39
40
|
|
40
41
|
#spec.add_development_dependency "bundler", "~> 1.3"
|
41
42
|
spec.add_development_dependency "rake"
|
data/setup.cmd
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Courtenay Probert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cprobert-s3sync
|
@@ -162,6 +162,7 @@ files:
|
|
162
162
|
- .gitattributes
|
163
163
|
- .gitignore
|
164
164
|
- Gemfile
|
165
|
+
- Gemfile.lock
|
165
166
|
- LICENSE.txt
|
166
167
|
- README.md
|
167
168
|
- Rakefile
|
@@ -224,7 +225,9 @@ files:
|
|
224
225
|
- bin/scms-server
|
225
226
|
- build commands.txt
|
226
227
|
- lib/scms.rb
|
227
|
-
- lib/scms/
|
228
|
+
- lib/scms/deploy-ftp.rb
|
229
|
+
- lib/scms/deploy-s3.rb
|
230
|
+
- lib/scms/extensions.rb
|
228
231
|
- lib/scms/scms-bundler.rb
|
229
232
|
- lib/scms/scms-customHandler.rb
|
230
233
|
- lib/scms/scms-helpers.rb
|
@@ -237,6 +240,7 @@ files:
|
|
237
240
|
- lib/scms/version.rb
|
238
241
|
- lib/scms/yui.rb
|
239
242
|
- scms.gemspec
|
243
|
+
- setup.cmd
|
240
244
|
homepage: http://cprobert.github.io/Static-CMS/
|
241
245
|
licenses:
|
242
246
|
- MIT
|