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 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
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Easily manage floss repositories.
4
+ module Qas
5
+ VERSION = '1.5.0'
6
+ DESCRIPTION = 'Easily manage floss repositories.'
7
+ URL = 'https://github.com/easbarba/qas'
8
+ end
@@ -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
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'qas/archive'
4
+ require_relative 'qas/grab'
5
+ require_relative 'qas/main'
6
+ require_relative 'qas/info'
7
+ require_relative 'qas/config'
8
+ require_relative 'qas/utils'
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: []