scaffnew 1.0.0.rc
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/.gitignore +38 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +13 -0
- data/LICENSE +675 -0
- data/README.md +48 -0
- data/Rakefile +1 -0
- data/bin/scaff +4 -0
- data/bin/scaffnew +4 -0
- data/docs/plan.md +47 -0
- data/lib/scaffnew.rb +1 -0
- data/lib/scaffnew/add.rb +54 -0
- data/lib/scaffnew/cli.rb +50 -0
- data/lib/scaffnew/command.rb +30 -0
- data/lib/scaffnew/io.rb +114 -0
- data/lib/scaffnew/list.rb +15 -0
- data/lib/scaffnew/new.rb +26 -0
- data/lib/scaffnew/package.rb +52 -0
- data/lib/scaffnew/params.rb +12 -0
- data/lib/scaffnew/remove.rb +29 -0
- data/scaffnew.gemspec +29 -0
- data/vagrantfile +40 -0
- metadata +104 -0
data/README.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# scaffnew
|
|
2
|
+
A simple scaffold for many purposes
|
|
3
|
+
|
|
4
|
+
## Comandos
|
|
5
|
+
|
|
6
|
+
### repository
|
|
7
|
+
|
|
8
|
+
#### scaff repository
|
|
9
|
+
__Alias:__ scaff repo
|
|
10
|
+
|
|
11
|
+
Alias for scaffn repository list
|
|
12
|
+
|
|
13
|
+
#### scaff repository list
|
|
14
|
+
__Alias:__ scaff repo list
|
|
15
|
+
|
|
16
|
+
List all repositories
|
|
17
|
+
|
|
18
|
+
#### scaff repository add <url> [name]
|
|
19
|
+
__Alias:__ scaff repo add <url> [name]
|
|
20
|
+
|
|
21
|
+
Add a new repository
|
|
22
|
+
|
|
23
|
+
* __url__ : The url of repository file
|
|
24
|
+
* __name__ (optional) : A optional intenal name for this repository. Used de name of repository file if not informed
|
|
25
|
+
|
|
26
|
+
#### scaff repository remove <name>
|
|
27
|
+
__Alias:__ scaff repo remove <name>
|
|
28
|
+
|
|
29
|
+
Remove a repository
|
|
30
|
+
|
|
31
|
+
* __name__ : The repository name to be deleted
|
|
32
|
+
|
|
33
|
+
#### scaff repository packages <repository>
|
|
34
|
+
__Alias:__ scaff repo packages <repository>
|
|
35
|
+
|
|
36
|
+
List a packages of the repository or all repositories.
|
|
37
|
+
|
|
38
|
+
* __repository__ (optional) : Repository name to show packages, if suppressed, show packages for all repositories
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
### new
|
|
42
|
+
|
|
43
|
+
#### scaff new
|
|
44
|
+
|
|
45
|
+
Create scaffold from a package
|
|
46
|
+
|
|
47
|
+
* __repository__ : The package repository name
|
|
48
|
+
* __package__ : The package name
|
data/Rakefile
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/scaff
ADDED
data/bin/scaffnew
ADDED
data/docs/plan.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Plano de ataque
|
|
2
|
+
|
|
3
|
+
## Comandos
|
|
4
|
+
|
|
5
|
+
### repository
|
|
6
|
+
|
|
7
|
+
#### scaff repository
|
|
8
|
+
__Alias:__ scaff repo
|
|
9
|
+
|
|
10
|
+
Alias for scaffn repository list
|
|
11
|
+
|
|
12
|
+
#### scaff repository list
|
|
13
|
+
__Alias:__ scaff repo list
|
|
14
|
+
|
|
15
|
+
List all repositories
|
|
16
|
+
|
|
17
|
+
#### scaff repository add <url> [name]
|
|
18
|
+
__Alias:__ scaff repo add <url> [name]
|
|
19
|
+
|
|
20
|
+
Add a new repository
|
|
21
|
+
|
|
22
|
+
* __url__ : The url of repository file
|
|
23
|
+
* __name__ (optional) : A optional intenal name for this repository. Used de name of repository file if not informed
|
|
24
|
+
|
|
25
|
+
#### scaff repository remove <name>
|
|
26
|
+
__Alias:__ scaff repo remove <name>
|
|
27
|
+
|
|
28
|
+
Remove a repository
|
|
29
|
+
|
|
30
|
+
* __name__ : The repository name to be deleted
|
|
31
|
+
|
|
32
|
+
#### scaff repository packages <repository>
|
|
33
|
+
__Alias:__ scaff repo packages <repository>
|
|
34
|
+
|
|
35
|
+
List a packages of the repository or all repositories.
|
|
36
|
+
|
|
37
|
+
* __repository__ (optional) : Repository name to show packages, if suppressed, show packages for all repositories
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
### new
|
|
41
|
+
|
|
42
|
+
#### scaff new
|
|
43
|
+
|
|
44
|
+
Create scaffold from a package
|
|
45
|
+
|
|
46
|
+
* __repository__ : The package repository name
|
|
47
|
+
* __package__ : The package name
|
data/lib/scaffnew.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require_relative 'scaffnew/cli'
|
data/lib/scaffnew/add.rb
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require_relative "command"
|
|
2
|
+
|
|
3
|
+
module Scaffnew
|
|
4
|
+
|
|
5
|
+
class Add < Command
|
|
6
|
+
|
|
7
|
+
def command (params)
|
|
8
|
+
|
|
9
|
+
p_url = params[0]
|
|
10
|
+
p_name = params[1]
|
|
11
|
+
|
|
12
|
+
error "Package url is required" if p_url.nil?
|
|
13
|
+
|
|
14
|
+
@workPath = @io.createWorkFolder()
|
|
15
|
+
|
|
16
|
+
begin
|
|
17
|
+
metadata = @io.downloadRemotePack(p_url, @workPath)
|
|
18
|
+
rescue Exception => e
|
|
19
|
+
roolback e.message
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
rollback "Invalid package metadata format" unless validateDataPack(metadata)
|
|
23
|
+
|
|
24
|
+
p_name ||= metadata['name']
|
|
25
|
+
|
|
26
|
+
roolback "'#{p_name}' already exist. Please change name or delete the current package" if @io.getPackage(p_name)
|
|
27
|
+
|
|
28
|
+
@io.moveWorkToPackage(@workPath, p_name)
|
|
29
|
+
|
|
30
|
+
success "Package #{p_name} successful instaled XD"
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def roolback (message)
|
|
37
|
+
@io.removeWorkFolder(@workPath)
|
|
38
|
+
error message
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def validateDataPack (metadata)
|
|
42
|
+
required = ['name', 'description', 'version'];
|
|
43
|
+
|
|
44
|
+
required.each do |needed|
|
|
45
|
+
if metadata[needed].nil? then
|
|
46
|
+
return false
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
return true
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
end
|
data/lib/scaffnew/cli.rb
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'thor'
|
|
2
|
+
|
|
3
|
+
require_relative 'params'
|
|
4
|
+
require_relative 'add'
|
|
5
|
+
require_relative 'list'
|
|
6
|
+
require_relative 'remove'
|
|
7
|
+
require_relative 'new'
|
|
8
|
+
require_relative 'package'
|
|
9
|
+
|
|
10
|
+
module Scaffnew
|
|
11
|
+
|
|
12
|
+
class Cli < Thor
|
|
13
|
+
|
|
14
|
+
def self.exit_on_failure?
|
|
15
|
+
true
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
desc('add URL [NAME]', "Add a new package")
|
|
19
|
+
def add (*params)
|
|
20
|
+
Add.new(self, params)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
desc('list', "List all packages")
|
|
24
|
+
def list (*params)
|
|
25
|
+
List.new(self, params)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
desc('remove NAME', "Remove a package")
|
|
29
|
+
def remove (*params)
|
|
30
|
+
Remove.new(self, params)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
desc('new NAME', "Extract a package into the current folder")
|
|
34
|
+
def new (*params)
|
|
35
|
+
New.new(self, params)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
desc('package', "Create a package from current folder")
|
|
39
|
+
def package (*params)
|
|
40
|
+
Package.new(self, params)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
desc('version', "Display scaffnew version")
|
|
44
|
+
map %w[-v --version] => :version
|
|
45
|
+
def version
|
|
46
|
+
say "Scaffnew version #{VERSION}"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require_relative "io"
|
|
2
|
+
|
|
3
|
+
module Scaffnew
|
|
4
|
+
|
|
5
|
+
class Command
|
|
6
|
+
|
|
7
|
+
def initialize (cli, param=nil)
|
|
8
|
+
@cli = cli
|
|
9
|
+
@io = IO.new()
|
|
10
|
+
|
|
11
|
+
command(param)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def command (param)
|
|
15
|
+
@cli.say "method \"command\" not found"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def say (message)
|
|
19
|
+
@cli.say message
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def success (message)
|
|
23
|
+
@cli.say message
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def error (message)
|
|
27
|
+
raise Thor::Error, "Error: #{message}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
data/lib/scaffnew/io.rb
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
require 'open-uri'
|
|
2
|
+
require 'yaml'
|
|
3
|
+
require 'yaml/store'
|
|
4
|
+
require 'time'
|
|
5
|
+
#require 'dir'
|
|
6
|
+
|
|
7
|
+
require_relative 'params.rb'
|
|
8
|
+
|
|
9
|
+
module Scaffnew
|
|
10
|
+
class IO
|
|
11
|
+
|
|
12
|
+
def initialize ()
|
|
13
|
+
prepareLocalFolder()
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# WORK TOOLS
|
|
17
|
+
|
|
18
|
+
def createWorkFolder ()
|
|
19
|
+
path = "#{LOCAL_WORK_PATH}/work_#{Time.now.getutc.to_i}";
|
|
20
|
+
FileUtils.mkdir_p(path)
|
|
21
|
+
return path
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def removeWorkFolder (path)
|
|
25
|
+
FileUtils.rm_rf(path)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def downloadRemotePack (url, workPath)
|
|
29
|
+
`wget -q #{url} -O #{workPath}/package.scaff`
|
|
30
|
+
`tar -xvf #{workPath}/package.scaff -C #{workPath}`
|
|
31
|
+
|
|
32
|
+
return YAML.load_file("#{workPath}/metadata")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def moveWorkToPackage (workPath, packageName)
|
|
36
|
+
FileUtils.rm("#{workPath}/package.scaff")
|
|
37
|
+
FileUtils.mv(workPath, "#{LOCAL_REPO_PATH}/#{packageName}")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def createData (path, workPath)
|
|
41
|
+
files = (Dir.entries(path) - ['.', '..']) * ' '
|
|
42
|
+
`tar -zcf #{workPath}/data.tar.gz -C #{path} #{files}`
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def createMetadata (metadata, workPath)
|
|
46
|
+
store = YAML::Store.new("#{workPath}/metadata")
|
|
47
|
+
store.transaction do
|
|
48
|
+
metadata.each do |key, value|
|
|
49
|
+
store[key.to_s] = value
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def packageWork (name, workPath)
|
|
55
|
+
`tar -cf #{name}.scaff -C #{workPath} data.tar.gz metadata`
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# PACKAGE MANIPULATION
|
|
59
|
+
|
|
60
|
+
def getPackage (name)
|
|
61
|
+
return packageInfo(name)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def getAllPackages ()
|
|
65
|
+
packages = []
|
|
66
|
+
|
|
67
|
+
Dir.glob("#{LOCAL_REPO_PATH}/*") do |path|
|
|
68
|
+
if File.directory?(path) then
|
|
69
|
+
packages << packageInfo(File.basename(path))
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
return packages
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def extractPackage (name, dest)
|
|
77
|
+
path = "#{LOCAL_REPO_PATH}/#{name}/#{PACKAGE_DATA_NAME}"
|
|
78
|
+
`tar -zxf #{path} -C #{dest}`
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def removePackageFolder (name)
|
|
82
|
+
FileUtils.rm_rf("#{LOCAL_REPO_PATH}/#{name}")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
def createLocalFolders ()
|
|
88
|
+
FileUtils.mkdir_p(LOCAL_REPO_PATH)
|
|
89
|
+
FileUtils.mkdir_p(LOCAL_WORK_PATH)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def prepareLocalFolder ()
|
|
93
|
+
if !File.directory?(LOCAL_PATH) then
|
|
94
|
+
createLocalFolders()
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def packageInfo (name)
|
|
99
|
+
path = "#{LOCAL_REPO_PATH}/#{name}"
|
|
100
|
+
|
|
101
|
+
begin
|
|
102
|
+
return {
|
|
103
|
+
name: name,
|
|
104
|
+
meta: YAML.load_file("#{path}/#{PACKAGE_METADATA_NAME}"),
|
|
105
|
+
data: "#{path}/#{PACKAGE_DATA_NAME}"
|
|
106
|
+
}
|
|
107
|
+
rescue
|
|
108
|
+
return nil
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
end
|
data/lib/scaffnew/new.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require_relative "command"
|
|
2
|
+
|
|
3
|
+
module Scaffnew
|
|
4
|
+
|
|
5
|
+
class New < Command
|
|
6
|
+
|
|
7
|
+
def command (params)
|
|
8
|
+
|
|
9
|
+
p_name = params[0]
|
|
10
|
+
p_dest = "."
|
|
11
|
+
|
|
12
|
+
error "Package name param uninformed" if p_name.nil?
|
|
13
|
+
|
|
14
|
+
metadata = @io.getPackage(p_name)
|
|
15
|
+
|
|
16
|
+
error "Package '#{p_name}' not found" if metadata.nil?
|
|
17
|
+
|
|
18
|
+
@io.extractPackage(p_name, p_dest)
|
|
19
|
+
|
|
20
|
+
success "Package #{p_name} successful extracted"
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require_relative "command"
|
|
2
|
+
|
|
3
|
+
module Scaffnew
|
|
4
|
+
|
|
5
|
+
class Package < Command
|
|
6
|
+
|
|
7
|
+
def command (params)
|
|
8
|
+
|
|
9
|
+
p_path = "."
|
|
10
|
+
|
|
11
|
+
answer_name = @cli.ask("Package name (without spaces)")
|
|
12
|
+
answer_description = @cli.ask("Package description")
|
|
13
|
+
answer_version = @cli.ask("Package version")
|
|
14
|
+
|
|
15
|
+
@workPath = @io.createWorkFolder()
|
|
16
|
+
|
|
17
|
+
begin
|
|
18
|
+
@io.createData(p_path, @workPath)
|
|
19
|
+
rescue Exception => e
|
|
20
|
+
roolback e.message
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
metadata = {
|
|
24
|
+
name: answer_name,
|
|
25
|
+
description: answer_description,
|
|
26
|
+
version: answer_version
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
begin
|
|
30
|
+
@io.createMetadata(metadata, @workPath)
|
|
31
|
+
rescue Exception => e
|
|
32
|
+
roolback e.message
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
begin
|
|
36
|
+
@io.packageWork("#{answer_name}", @workPath)
|
|
37
|
+
rescue Exception => e
|
|
38
|
+
roolback e.message
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
@io.removeWorkFolder(@workPath)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def roolback (message)
|
|
47
|
+
@io.removeWorkFolder(@workPath)
|
|
48
|
+
error message
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|