qas 1.5.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 +7 -0
- data/exe/qas +52 -0
- data/lib/info.rb +8 -0
- data/lib/qas/archive.rb +59 -0
- data/lib/qas/config.rb +47 -0
- data/lib/qas/grab.rb +32 -0
- data/lib/qas/info.rb +35 -0
- data/lib/qas/main.rb +43 -0
- data/lib/qas/utils.rb +31 -0
- data/lib/qas.rb +8 -0
- metadata +164 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: afc9a95cd6ed2302619ac4f6b3b2faa3c0697ab43b5294aa4e56b3b30e911d00
|
4
|
+
data.tar.gz: bc22a9f7fb23ac3e6ead7b641b9a728c483d36b36f1a96f557065fd1ed376405
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d3e660ed349fd2e51698f908fcb8b3391b5e88ae9bb9d6f2a8bcb0709ddae2883a9095ba93602c473acdb09a843e273957c5a27d214a2d36d76cda7ad876d226
|
7
|
+
data.tar.gz: 113dade5770939ff258ca7f6586bfd92c9e7418085ce9f731fadd1c052cabc8beb41cb19ba498c9b0f5f2489eb6a00a0b3a732b06759434af262a5831ca58f4b
|
data/exe/qas
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative '../lib/info'
|
5
|
+
require_relative '../lib/qas'
|
6
|
+
|
7
|
+
module Cli
|
8
|
+
attr_accessor :action, :args
|
9
|
+
|
10
|
+
def self.options
|
11
|
+
require 'optparse'
|
12
|
+
|
13
|
+
OptionParser.new do |parser|
|
14
|
+
parser.banner = Qas::DESCRIPTION
|
15
|
+
|
16
|
+
parser.on('-v', '--version', 'project information') do
|
17
|
+
print Qas::VERSION
|
18
|
+
exit!
|
19
|
+
end
|
20
|
+
|
21
|
+
parser.on('-g', '--grab', 'grab floss projects') do
|
22
|
+
@action = :grab
|
23
|
+
end
|
24
|
+
|
25
|
+
parser.on('-a', '--archive NAMES', Array, 'archive floss projects listed on NAMES') do |names|
|
26
|
+
@names = names
|
27
|
+
@action = :archive
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.start
|
33
|
+
options.parse! ['--help'] if ARGV.empty?
|
34
|
+
|
35
|
+
begin
|
36
|
+
options.parse!
|
37
|
+
rescue OptionParser::MissingArgument
|
38
|
+
puts <<~ERROR
|
39
|
+
--archive NAMES
|
40
|
+
|
41
|
+
Missing NAMES of projects!'
|
42
|
+
ERROR
|
43
|
+
exit!
|
44
|
+
rescue OptionParser::InvalidOption
|
45
|
+
options.parse! ['--help']
|
46
|
+
end
|
47
|
+
|
48
|
+
Qas::Main.new(@action, @names).run
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
Cli.start
|
data/lib/info.rb
ADDED
data/lib/qas/archive.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
# TODO: if project is not present, clone it!
|
6
|
+
|
7
|
+
module Qas
|
8
|
+
# Archive FLOSS Projects
|
9
|
+
class Archive
|
10
|
+
# Format to be compressed
|
11
|
+
attr_reader :format
|
12
|
+
|
13
|
+
# FLOSS Projects elected to be archived
|
14
|
+
attr_reader :names
|
15
|
+
|
16
|
+
# project
|
17
|
+
attr_reader :project
|
18
|
+
|
19
|
+
# Folder to store compressed projects
|
20
|
+
ARCHIVED = Pathname.new(File.join(Dir.home, 'Downloads', 'archived'))
|
21
|
+
|
22
|
+
def initialize(project, names, fmt = 'tar')
|
23
|
+
@project = project
|
24
|
+
@names = names
|
25
|
+
@format = fmt
|
26
|
+
@fullpath = "#{ARCHIVED.join(project.name)}.#{@format}"
|
27
|
+
end
|
28
|
+
|
29
|
+
# Archiving FLOSS project
|
30
|
+
def archive
|
31
|
+
require 'git'
|
32
|
+
|
33
|
+
Utils.spin(project.name) do
|
34
|
+
repo = Git.open project.folder
|
35
|
+
repo.archive repo.current_branch, @fullpath, format: @format # TODO: fiber/multithread
|
36
|
+
end
|
37
|
+
|
38
|
+
puts # a bit more of space
|
39
|
+
end
|
40
|
+
|
41
|
+
# create archived folder
|
42
|
+
def mkfolder
|
43
|
+
require 'fileutils'
|
44
|
+
FileUtils.mkdir_p ARCHIVED unless ARCHIVED.exist?
|
45
|
+
end
|
46
|
+
|
47
|
+
def info
|
48
|
+
print "#{project.name} > #{@fullpath}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def run
|
52
|
+
return unless names.include? project.name
|
53
|
+
|
54
|
+
mkfolder
|
55
|
+
info
|
56
|
+
archive
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/qas/config.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'csv'
|
4
|
+
require 'pathname'
|
5
|
+
require 'uri'
|
6
|
+
|
7
|
+
# TODO: Delay parsing file till just finally needed
|
8
|
+
# TODO: Check if file match expect structure
|
9
|
+
# TODO: check if file is empty
|
10
|
+
|
11
|
+
module Qas
|
12
|
+
# List all config available
|
13
|
+
class Config
|
14
|
+
def parse(file, lang)
|
15
|
+
[].tap do |x|
|
16
|
+
CSV.read(file, headers: true).by_row.each do |project|
|
17
|
+
name = project['name']
|
18
|
+
branch = project['branch']
|
19
|
+
url = URI project['url']
|
20
|
+
|
21
|
+
x << Info.new(name, branch, url, lang.to_s)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def found
|
27
|
+
files = Pathname.new(File.join(Dir.home, '.config', 'qas'))
|
28
|
+
|
29
|
+
[].tap do |x|
|
30
|
+
# Check if config does not exist if a symlink
|
31
|
+
files.children.each do |y|
|
32
|
+
x << y if y.exist?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# returns all parsed items
|
38
|
+
def items
|
39
|
+
{}.tap do |x|
|
40
|
+
found.each do |file|
|
41
|
+
lang = file.basename.sub_ext('').to_s.to_sym
|
42
|
+
x[lang] = parse file, lang
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/qas/grab.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'git'
|
4
|
+
|
5
|
+
module Qas
|
6
|
+
# Grab FLOSS Projects
|
7
|
+
class Grab
|
8
|
+
attr_reader :project
|
9
|
+
|
10
|
+
def initialize(project)
|
11
|
+
@project = project
|
12
|
+
end
|
13
|
+
|
14
|
+
def pull
|
15
|
+
Utils.spin(project.name) do
|
16
|
+
repo = Git.open project.folder
|
17
|
+
repo.pull 'origin', repo.current_branch
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def clone
|
22
|
+
Utils.spin(project.name) do
|
23
|
+
Git.clone project.url, project.folder
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Cloning/Pulling FLOSS Project
|
28
|
+
def run
|
29
|
+
project.folder.join('.git').exist? ? pull : clone
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/qas/info.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
module Qas
|
6
|
+
# Project Information
|
7
|
+
class Info
|
8
|
+
ROOT = Pathname.new(File.join(Dir.home, 'Projects'))
|
9
|
+
|
10
|
+
# project name
|
11
|
+
attr_reader :name
|
12
|
+
|
13
|
+
# project git branch
|
14
|
+
attr_reader :branch
|
15
|
+
|
16
|
+
# project uri
|
17
|
+
attr_reader :url
|
18
|
+
|
19
|
+
# project folder
|
20
|
+
attr_reader :folder
|
21
|
+
|
22
|
+
def initialize(name, branch, url, language)
|
23
|
+
@name = name
|
24
|
+
@branch = branch
|
25
|
+
@url = url
|
26
|
+
@folder = ROOT.join(language, name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
<<~INFO
|
31
|
+
#{name}
|
32
|
+
INFO
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/qas/main.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Qas
|
4
|
+
# Main start point
|
5
|
+
class Main
|
6
|
+
class GitMustBeAvailable < StandardError; end
|
7
|
+
|
8
|
+
attr_reader :folders, :utils, :command, :projects
|
9
|
+
|
10
|
+
def initialize(command, names = nil)
|
11
|
+
@command = command
|
12
|
+
@names = names
|
13
|
+
end
|
14
|
+
|
15
|
+
def projects
|
16
|
+
c = Config.new
|
17
|
+
c.items
|
18
|
+
end
|
19
|
+
|
20
|
+
def current_project
|
21
|
+
projects.each do |_, repos|
|
22
|
+
repos.each do |project|
|
23
|
+
yield project if block_given?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def actions
|
29
|
+
{
|
30
|
+
grab: ->(project) { Grab.new(project) }.curry,
|
31
|
+
archive: ->(project) { Archive.new(project, @names) }.curry
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def run
|
36
|
+
raise GitMustBeAvailable, 'Git was not found!' unless Utils.which?('git').any?
|
37
|
+
|
38
|
+
current_project do |project|
|
39
|
+
actions[command].call(project).run
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/qas/utils.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Qas
|
4
|
+
# General Utilities.
|
5
|
+
module Utils
|
6
|
+
# Spin for me, dear.
|
7
|
+
def self.spin(project)
|
8
|
+
require 'tty-spinner'
|
9
|
+
|
10
|
+
spinner = TTY::Spinner.new("#{project} :spinner ", format: :dots_6)
|
11
|
+
spinner.auto_spin
|
12
|
+
|
13
|
+
yield
|
14
|
+
|
15
|
+
spinner.success
|
16
|
+
end
|
17
|
+
|
18
|
+
# prints external executable location
|
19
|
+
def self.which?(executable)
|
20
|
+
require 'pathname'
|
21
|
+
|
22
|
+
[].tap do |x|
|
23
|
+
ENV['PATH'].split(File::PATH_SEPARATOR) do |directory|
|
24
|
+
exec = Pathname.new(directory).join executable.to_s
|
25
|
+
|
26
|
+
x << exec.to_path if exec.file?
|
27
|
+
end
|
28
|
+
end.uniq
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/qas.rb
ADDED
metadata
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: qas
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.5.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- easbarba
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-05-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: git
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: tty-spinner
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.9.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.9.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '13.0'
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 13.0.6
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '13.0'
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 13.0.6
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: reek
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '6.1'
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 6.1.1
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '6.1'
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 6.1.1
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rspec
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '3.11'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '3.11'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: rubocop
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '1.29'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '1.29'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: rufo
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 0.13.0
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 0.13.0
|
123
|
+
description:
|
124
|
+
email:
|
125
|
+
- easbarba@outlook.com
|
126
|
+
executables:
|
127
|
+
- qas
|
128
|
+
extensions: []
|
129
|
+
extra_rdoc_files: []
|
130
|
+
files:
|
131
|
+
- exe/qas
|
132
|
+
- lib/info.rb
|
133
|
+
- lib/qas.rb
|
134
|
+
- lib/qas/archive.rb
|
135
|
+
- lib/qas/config.rb
|
136
|
+
- lib/qas/grab.rb
|
137
|
+
- lib/qas/info.rb
|
138
|
+
- lib/qas/main.rb
|
139
|
+
- lib/qas/utils.rb
|
140
|
+
homepage: https://github.com/easbarba/qas
|
141
|
+
licenses:
|
142
|
+
- gpl-v3
|
143
|
+
metadata:
|
144
|
+
homepage_uri: https://github.com/easbarba/qas
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '2.7'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
requirements: []
|
160
|
+
rubygems_version: 3.3.5
|
161
|
+
signing_key:
|
162
|
+
specification_version: 4
|
163
|
+
summary: Easily manage floss repositories.
|
164
|
+
test_files: []
|