cejo 0.0.5

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.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +0 -0
  5. data/.rufo +3 -0
  6. data/.travis.yml +6 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +6 -0
  9. data/INSTALL +2 -0
  10. data/LICENSE +674 -0
  11. data/README.org +23 -0
  12. data/README.rdoc +28 -0
  13. data/Rakefile +6 -0
  14. data/annotations/legacy.org +11 -0
  15. data/annotations/todo.org +54 -0
  16. data/bin/console +14 -0
  17. data/bin/setup +9 -0
  18. data/cejo.gemspec +50 -0
  19. data/cejo.rdoc +5 -0
  20. data/exe/cejo +298 -0
  21. data/lib/cejo.rb +42 -0
  22. data/lib/cejo/distro/base.rb +52 -0
  23. data/lib/cejo/distro/commands.rb +26 -0
  24. data/lib/cejo/distro/current_packager.rb +18 -0
  25. data/lib/cejo/distro/help.rb +9 -0
  26. data/lib/cejo/distro/need.rb +32 -0
  27. data/lib/cejo/distro/parsed_commands.rb +23 -0
  28. data/lib/cejo/distro/translate_action.rb +11 -0
  29. data/lib/cejo/floss/archive.rb +49 -0
  30. data/lib/cejo/floss/core.rb +55 -0
  31. data/lib/cejo/floss/grab.rb +44 -0
  32. data/lib/cejo/floss/project_info.rb +28 -0
  33. data/lib/cejo/media/get.rb +54 -0
  34. data/lib/cejo/media/play.rb +45 -0
  35. data/lib/cejo/ops/brightness.rb +37 -0
  36. data/lib/cejo/ops/dots.rb +98 -0
  37. data/lib/cejo/ops/homey.rb +76 -0
  38. data/lib/cejo/ops/screenshot.rb +78 -0
  39. data/lib/cejo/ops/sysinfo.rb +27 -0
  40. data/lib/cejo/ops/volume/sound_manager.rb +45 -0
  41. data/lib/cejo/ops/volume/volume.rb +117 -0
  42. data/lib/cejo/projects/builder.rb +138 -0
  43. data/lib/cejo/projects/dwm.rb +23 -0
  44. data/lib/cejo/projects/emacs.rb +23 -0
  45. data/lib/cejo/projects/ruby.rb +23 -0
  46. data/lib/cejo/projects/st.rb +23 -0
  47. data/lib/cejo/services/folders.rb +21 -0
  48. data/lib/cejo/services/utils.rb +54 -0
  49. data/lib/cejo/version.rb +5 -0
  50. data/lib/tasks/list.rake +7 -0
  51. data/lib/tasks/man.rake +7 -0
  52. data/lib/tasks/spec.rake +5 -0
  53. data/lib/tasks/test.rake +7 -0
  54. data/man/cejo.1.ronn +0 -0
  55. data/spec/distro/action_spec.rb +21 -0
  56. data/spec/distro/base_spec.rb +67 -0
  57. data/spec/distro/commands_spec.rb +22 -0
  58. data/spec/distro/current_packager_spec.rb +17 -0
  59. data/spec/distro/need_spec.rb +22 -0
  60. data/spec/floss/archive_spec.rb +1 -0
  61. data/spec/floss/core_spec.rb +1 -0
  62. data/spec/floss/grab_spec.rb +1 -0
  63. data/spec/media/get_spec.rb +20 -0
  64. data/spec/media/play_spec.rb +41 -0
  65. data/spec/ops/ops_brightness_spec.rb +16 -0
  66. data/spec/ops/ops_volume_spec.rb +22 -0
  67. data/spec/spec_helper.rb +96 -0
  68. data/spec/utils_spec.rb +18 -0
  69. data/test/test_cejo.rb +16 -0
  70. data/test/test_distro_base.rb +13 -0
  71. data/test/test_floss.rb +13 -0
  72. data/test/test_media_get.rb +0 -0
  73. data/test/test_media_play.rb +0 -0
  74. data/test/test_ops_brightness.rb +0 -0
  75. data/test/test_ops_dots.rb +0 -0
  76. data/test/test_ops_homer.rb +0 -0
  77. data/test/test_ops_oss.rb +18 -0
  78. data/test/test_ops_screenshot.rb +0 -0
  79. data/test/test_ops_sysinfo.rb +0 -0
  80. data/test/test_ops_volume.rb +0 -0
  81. data/test/test_projects_builder.rb +0 -0
  82. data/test/test_projects_emacs.rb +0 -0
  83. 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