cejo 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.rspec +3 -0
- data/.rubocop.yml +0 -0
- data/.rufo +3 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/INSTALL +2 -0
- data/LICENSE +674 -0
- data/README.org +23 -0
- data/README.rdoc +28 -0
- data/Rakefile +6 -0
- data/annotations/legacy.org +11 -0
- data/annotations/todo.org +54 -0
- data/bin/console +14 -0
- data/bin/setup +9 -0
- data/cejo.gemspec +50 -0
- data/cejo.rdoc +5 -0
- data/exe/cejo +298 -0
- data/lib/cejo.rb +42 -0
- data/lib/cejo/distro/base.rb +52 -0
- data/lib/cejo/distro/commands.rb +26 -0
- data/lib/cejo/distro/current_packager.rb +18 -0
- data/lib/cejo/distro/help.rb +9 -0
- data/lib/cejo/distro/need.rb +32 -0
- data/lib/cejo/distro/parsed_commands.rb +23 -0
- data/lib/cejo/distro/translate_action.rb +11 -0
- data/lib/cejo/floss/archive.rb +49 -0
- data/lib/cejo/floss/core.rb +55 -0
- data/lib/cejo/floss/grab.rb +44 -0
- data/lib/cejo/floss/project_info.rb +28 -0
- data/lib/cejo/media/get.rb +54 -0
- data/lib/cejo/media/play.rb +45 -0
- data/lib/cejo/ops/brightness.rb +37 -0
- data/lib/cejo/ops/dots.rb +98 -0
- data/lib/cejo/ops/homey.rb +76 -0
- data/lib/cejo/ops/screenshot.rb +78 -0
- data/lib/cejo/ops/sysinfo.rb +27 -0
- data/lib/cejo/ops/volume/sound_manager.rb +45 -0
- data/lib/cejo/ops/volume/volume.rb +117 -0
- data/lib/cejo/projects/builder.rb +138 -0
- data/lib/cejo/projects/dwm.rb +23 -0
- data/lib/cejo/projects/emacs.rb +23 -0
- data/lib/cejo/projects/ruby.rb +23 -0
- data/lib/cejo/projects/st.rb +23 -0
- data/lib/cejo/services/folders.rb +21 -0
- data/lib/cejo/services/utils.rb +54 -0
- data/lib/cejo/version.rb +5 -0
- data/lib/tasks/list.rake +7 -0
- data/lib/tasks/man.rake +7 -0
- data/lib/tasks/spec.rake +5 -0
- data/lib/tasks/test.rake +7 -0
- data/man/cejo.1.ronn +0 -0
- data/spec/distro/action_spec.rb +21 -0
- data/spec/distro/base_spec.rb +67 -0
- data/spec/distro/commands_spec.rb +22 -0
- data/spec/distro/current_packager_spec.rb +17 -0
- data/spec/distro/need_spec.rb +22 -0
- data/spec/floss/archive_spec.rb +1 -0
- data/spec/floss/core_spec.rb +1 -0
- data/spec/floss/grab_spec.rb +1 -0
- data/spec/media/get_spec.rb +20 -0
- data/spec/media/play_spec.rb +41 -0
- data/spec/ops/ops_brightness_spec.rb +16 -0
- data/spec/ops/ops_volume_spec.rb +22 -0
- data/spec/spec_helper.rb +96 -0
- data/spec/utils_spec.rb +18 -0
- data/test/test_cejo.rb +16 -0
- data/test/test_distro_base.rb +13 -0
- data/test/test_floss.rb +13 -0
- data/test/test_media_get.rb +0 -0
- data/test/test_media_play.rb +0 -0
- data/test/test_ops_brightness.rb +0 -0
- data/test/test_ops_dots.rb +0 -0
- data/test/test_ops_homer.rb +0 -0
- data/test/test_ops_oss.rb +18 -0
- data/test/test_ops_screenshot.rb +0 -0
- data/test/test_ops_sysinfo.rb +0 -0
- data/test/test_ops_volume.rb +0 -0
- data/test/test_projects_builder.rb +0 -0
- data/test/test_projects_emacs.rb +0 -0
- metadata +468 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
# Provide system media interaction.
|
5
|
+
module Media
|
6
|
+
# Play file, random media in folder or with url.
|
7
|
+
class Play
|
8
|
+
PLAYER = 'mpv'.freeze
|
9
|
+
PLAYER_CONFIG = '--no-config --no-audio-display'.freeze
|
10
|
+
PLAYER_FORMAT = '--ytdl-format="bestvideo[height<=?1080]+bestaudio/best"'.freeze
|
11
|
+
|
12
|
+
attr_reader :media
|
13
|
+
|
14
|
+
def initialize(media)
|
15
|
+
@media = media
|
16
|
+
end
|
17
|
+
|
18
|
+
def pick_random_media_in_folder(folder)
|
19
|
+
file = folder.children.sample
|
20
|
+
folder.join(file).to_path
|
21
|
+
end
|
22
|
+
|
23
|
+
def pick_media
|
24
|
+
filepath = Pathname.new(media)
|
25
|
+
return filepath.to_path if filepath.file?
|
26
|
+
return pick_random_media_in_folder(filepath) if filepath.directory?
|
27
|
+
return media
|
28
|
+
end
|
29
|
+
|
30
|
+
public
|
31
|
+
|
32
|
+
def player_settings
|
33
|
+
"#{PLAYER} #{PLAYER_CONFIG} #{PLAYER_FORMAT}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def final_command
|
37
|
+
"#{player_settings} #{pick_media}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def run
|
41
|
+
system final_command
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Manage System brightness.
|
6
|
+
class Brightness
|
7
|
+
STEP = 5
|
8
|
+
BRIGHTER = 'brightnessctl'
|
9
|
+
|
10
|
+
attr_reader :state, :step
|
11
|
+
|
12
|
+
def initialize(state)
|
13
|
+
@state = state
|
14
|
+
end
|
15
|
+
|
16
|
+
def states
|
17
|
+
{
|
18
|
+
up: "set #{STEP}%+",
|
19
|
+
down: "set #{STEP}%-",
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def action
|
24
|
+
states[state.to_sym]
|
25
|
+
end
|
26
|
+
|
27
|
+
def final_command
|
28
|
+
"#{BRIGHTER} #{action}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def run
|
32
|
+
@state = state.to_sym if %w[up down].include? state
|
33
|
+
system(action)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
require 'find'
|
5
|
+
|
6
|
+
module Cejo
|
7
|
+
module Ops
|
8
|
+
# Mirror Lar files in $HOME.
|
9
|
+
class Dots
|
10
|
+
attr_reader :root, :ignore_these, :utils, :home, :target_link
|
11
|
+
|
12
|
+
def initialize(utils, root)
|
13
|
+
@utils = utils
|
14
|
+
@root = Pathname.new root if root
|
15
|
+
@home = Pathname.new(Dir.home)
|
16
|
+
@target_link = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def root_files_folders
|
20
|
+
files = []
|
21
|
+
folders = []
|
22
|
+
|
23
|
+
Find.find(root) do |file|
|
24
|
+
file = Pathname.new file
|
25
|
+
next if file.to_path.include? '.git'
|
26
|
+
next if file == root
|
27
|
+
|
28
|
+
files << file if file.file?
|
29
|
+
folders << file if file.directory?
|
30
|
+
end
|
31
|
+
|
32
|
+
{ folders: folders, files: files }
|
33
|
+
end
|
34
|
+
|
35
|
+
# transform origin file absolute path with home as its root instead
|
36
|
+
# /a/b/c.tar --> /home/b/c.tar
|
37
|
+
def to_home(this)
|
38
|
+
origin = this.to_path
|
39
|
+
homey = home.to_path.concat('/')
|
40
|
+
result = origin.gsub(root.to_path, homey)
|
41
|
+
Pathname.new(result)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Create only the folders, if those do not exist
|
45
|
+
def make_folders
|
46
|
+
root_files_folders[:folders].each do |fld|
|
47
|
+
folder = to_home fld
|
48
|
+
next if folder.exist?
|
49
|
+
|
50
|
+
puts folder
|
51
|
+
folder.mkdir
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def feed_target_link
|
56
|
+
root_files_folders[:files].each do |target|
|
57
|
+
next if ignored_ones.include? target.basename.to_s
|
58
|
+
|
59
|
+
symlink_name = to_home target
|
60
|
+
target_link.store(target, symlink_name)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Move file from home to a /home/backup/{file}
|
65
|
+
# or delete it if the file it is pointing does not exist
|
66
|
+
def backup_this(this)
|
67
|
+
warn "WARNING: #{this} found! Deleting/Moving it."
|
68
|
+
this.delete if this.exist? # TODO: if file exist back/delete up it
|
69
|
+
end
|
70
|
+
|
71
|
+
def backup_files
|
72
|
+
target_link.each do |target, link_name|
|
73
|
+
puts "#{target} ❯ #{link_name}"
|
74
|
+
backup_this link_name
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def symlink_files
|
79
|
+
target_link.each do |target, link_name|
|
80
|
+
puts "#{target} ❯ #{link_name}"
|
81
|
+
link_name.make_symlink target # As enumerator yielding folder to symlink
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# ignore these ones
|
86
|
+
def ignored_ones
|
87
|
+
['LICENSE', root.join('.git').to_path.to_s].freeze
|
88
|
+
end
|
89
|
+
|
90
|
+
def run
|
91
|
+
feed_target_link
|
92
|
+
make_folders
|
93
|
+
backup_files
|
94
|
+
symlink_files
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Mirror user DATA partition folders to $HOME
|
6
|
+
class Homey
|
7
|
+
IGNORE_THESE = %w[.Trash-1000 lost+found].freeze
|
8
|
+
|
9
|
+
attr_reader :root, :target_link
|
10
|
+
|
11
|
+
def initialize(root)
|
12
|
+
@root = root
|
13
|
+
end
|
14
|
+
|
15
|
+
# Confirms if root is a folder or return w/ exeception
|
16
|
+
def root_exist?
|
17
|
+
r = Pathname.new root
|
18
|
+
r.exist?
|
19
|
+
end
|
20
|
+
|
21
|
+
def folders_found
|
22
|
+
folders_found = {}
|
23
|
+
home = Pathname.new(Dir.home)
|
24
|
+
|
25
|
+
root.each_child do |folder|
|
26
|
+
next if IGNORE_THESE.include? folder.basename.to_s
|
27
|
+
|
28
|
+
folders_found[folder] = home.join(folder.basename)
|
29
|
+
end
|
30
|
+
|
31
|
+
folders_found
|
32
|
+
end
|
33
|
+
|
34
|
+
# Remove $HOME folders found in DATA
|
35
|
+
def cleanup_home
|
36
|
+
target_link.each_key do |link_name|
|
37
|
+
link_name.delete if link_name.exist?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def symlink_folders
|
42
|
+
target_link.each do |target, link_name|
|
43
|
+
File.symlink(target, link_name)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# def show_info
|
48
|
+
# print "root folder".blue, ": ", root, "\n\n"
|
49
|
+
|
50
|
+
# cleanup_home do |link_name|
|
51
|
+
# print "Warning".red, ": ", "#{link_name}".green, " folder found, removing it!", "\n"
|
52
|
+
# end
|
53
|
+
|
54
|
+
# puts
|
55
|
+
|
56
|
+
# symlink_folders do |target, link_name|
|
57
|
+
# print "#{target}".yellow, " --> ", "#{link_name}".green, "\n"
|
58
|
+
# end
|
59
|
+
# end
|
60
|
+
|
61
|
+
def run
|
62
|
+
unless root_exist?
|
63
|
+
print "No such a directory '#{root}' exist! Exiting."
|
64
|
+
exit!
|
65
|
+
end
|
66
|
+
@root = Pathname root
|
67
|
+
@target_link = folders_found
|
68
|
+
# show_info
|
69
|
+
cleanup_home
|
70
|
+
symlink_folders
|
71
|
+
end
|
72
|
+
|
73
|
+
public :run
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Take a shot of the marvelous screen
|
6
|
+
class Screenshot
|
7
|
+
def self.folder
|
8
|
+
Pathname.new(Dir.home).join('Pictures') # TODO: Check if folder exist
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.current_time
|
12
|
+
Time.new.strftime('%d-%m-%y-%k-%M')
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :utils, :mode
|
16
|
+
|
17
|
+
def initialize(utils, mode)
|
18
|
+
@utils = utils
|
19
|
+
@mode = mode.to_sym if mode
|
20
|
+
end
|
21
|
+
|
22
|
+
def shotters
|
23
|
+
[flameshot, scrot, maim]
|
24
|
+
end
|
25
|
+
|
26
|
+
def shotters_available
|
27
|
+
shotters.find { |shotter| utils.which?(shotter[:exec]) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def shotter
|
31
|
+
shotters_available.first
|
32
|
+
end
|
33
|
+
|
34
|
+
def scrot
|
35
|
+
{
|
36
|
+
exec: 'scrot',
|
37
|
+
full: '--focused --silent',
|
38
|
+
partial: '--select --silent',
|
39
|
+
folder: folder.join(screenshot_name),
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
def flameshot
|
44
|
+
{
|
45
|
+
exec: 'flameshot',
|
46
|
+
full: 'full -p',
|
47
|
+
partial: 'gui -p',
|
48
|
+
folder: folder.to_path,
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def maim
|
53
|
+
{
|
54
|
+
exec: 'maim',
|
55
|
+
full: '',
|
56
|
+
partial: '--select',
|
57
|
+
folder: folder.join(screenshot_name),
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def screenshot_format
|
62
|
+
'png'
|
63
|
+
end
|
64
|
+
|
65
|
+
def screenshot_name
|
66
|
+
"screenshot-#{current_time}.#{screenshot_format}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def final_command
|
70
|
+
"#{shotter[:exec]} #{shotter[mode]} #{shotter[:folder]}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def run
|
74
|
+
system(final_command)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Display System Hardware Information.
|
6
|
+
class Sysinfo
|
7
|
+
attr_reader :services, :command
|
8
|
+
|
9
|
+
DEPS = %w[pulseaudio amixer ping sensors ryzen vega].freeze
|
10
|
+
|
11
|
+
def initialize(services, command)
|
12
|
+
@services = services
|
13
|
+
@command = command
|
14
|
+
end
|
15
|
+
|
16
|
+
public
|
17
|
+
|
18
|
+
def run_args
|
19
|
+
DEPS
|
20
|
+
end
|
21
|
+
|
22
|
+
def run
|
23
|
+
puts(run_args)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Sound manager information
|
6
|
+
class SoundManager
|
7
|
+
attr_reader :utils
|
8
|
+
|
9
|
+
def initialize(utils)
|
10
|
+
@utils = utils
|
11
|
+
end
|
12
|
+
|
13
|
+
# Find the running Pactl sink
|
14
|
+
def pactl_sink
|
15
|
+
`pactl list sinks`.split('Sink #').each do |sink|
|
16
|
+
sink_id = sink[0]
|
17
|
+
return sink_id if sink.include? 'State: RUNNING'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def sink
|
22
|
+
{
|
23
|
+
pactl: pactl_sink
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def sound_managers
|
28
|
+
%w[pactl amixer mixer]
|
29
|
+
end
|
30
|
+
|
31
|
+
def sound_manager
|
32
|
+
sound_managers.first { |manager| utils.which?(manager) }.to_sym
|
33
|
+
end
|
34
|
+
|
35
|
+
ALL = Struct.new(:name, :sink)
|
36
|
+
def info
|
37
|
+
ALL.new(sound_manager, sink[sound_manager])
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
"#{sound_manager} #{sink}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Manage System Volume.
|
6
|
+
class Volume
|
7
|
+
STEP = 3
|
8
|
+
|
9
|
+
attr_reader :state, :utils
|
10
|
+
attr_accessor :info
|
11
|
+
|
12
|
+
def initialize(utils, state)
|
13
|
+
@utils = utils
|
14
|
+
@state = state.to_sym if state
|
15
|
+
@info = SoundManager.new(utils).info
|
16
|
+
end
|
17
|
+
|
18
|
+
def states
|
19
|
+
{
|
20
|
+
up: '+',
|
21
|
+
down: '-',
|
22
|
+
toggle: ''
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
# * PACTL
|
27
|
+
|
28
|
+
def pactl_toggle
|
29
|
+
[pactl[:name], pactl[:toggle]].join(' ')
|
30
|
+
end
|
31
|
+
|
32
|
+
def pactl_updown
|
33
|
+
[pactl[:name], pactl[:updown]].join(' ')
|
34
|
+
end
|
35
|
+
|
36
|
+
def pactl
|
37
|
+
{
|
38
|
+
name: 'pactl',
|
39
|
+
toggle: "set-sink-mute #{info.sink} toggle",
|
40
|
+
updown: "set-sink-volume #{info.sink} #{states[state]}#{STEP}%"
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
# * AMIXER
|
45
|
+
|
46
|
+
def amixer_toggle
|
47
|
+
[amixer[:name], amixer[:toggle]].join(' ')
|
48
|
+
end
|
49
|
+
|
50
|
+
def amixer_updown
|
51
|
+
[amixer[:name], amixer[:updown]].join(' ')
|
52
|
+
end
|
53
|
+
|
54
|
+
def amixer
|
55
|
+
{
|
56
|
+
name: 'amixer',
|
57
|
+
toggle: '-q sset Master toggle',
|
58
|
+
updown: "set Master #{STEP}%#{states[state]}"
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
# * BSD MIXER
|
63
|
+
|
64
|
+
def mixer_toggle
|
65
|
+
[mixer[:name], mixer[:toggle]].join(' ')
|
66
|
+
end
|
67
|
+
|
68
|
+
def mixer_updown
|
69
|
+
[mixer[:name], mixer[:updown]].join(' ')
|
70
|
+
end
|
71
|
+
|
72
|
+
def mixer
|
73
|
+
{
|
74
|
+
name: 'mixer',
|
75
|
+
toggle: '',
|
76
|
+
updown: "mixer vol #{states[state]}#{STEP}"
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
# * MODES
|
81
|
+
|
82
|
+
def toggle
|
83
|
+
{
|
84
|
+
pactl: pactl_toggle,
|
85
|
+
amixer: amixer_toggle,
|
86
|
+
mixer: mixer_toggle
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
def updown
|
91
|
+
{
|
92
|
+
pactl: pactl_updown,
|
93
|
+
amixer: amixer_updown,
|
94
|
+
mixer: mixer_updown
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
def mode
|
99
|
+
{
|
100
|
+
toggle: toggle[info.name],
|
101
|
+
up: updown[info.name],
|
102
|
+
down: updown[info.name]
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
def final_command
|
107
|
+
mode[state]
|
108
|
+
end
|
109
|
+
|
110
|
+
def run
|
111
|
+
return unless %i[up down toggle].include?(state)
|
112
|
+
|
113
|
+
system(final_command)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|