takeltau 0.34.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +674 -0
  3. data/README.md +235 -0
  4. data/bin/tau +6 -0
  5. data/lib/Thorfile +3 -0
  6. data/lib/takeltau.rb +257 -0
  7. data/lib/takeltau/bit/check/cli.rb +23 -0
  8. data/lib/takeltau/bit/check/workspace.rb +37 -0
  9. data/lib/takeltau/bit/cli.rb +18 -0
  10. data/lib/takeltau/bit/clipboard/cli.rb +73 -0
  11. data/lib/takeltau/bit/clipboard/copy.rb +142 -0
  12. data/lib/takeltau/bit/clipboard/lib.rb +143 -0
  13. data/lib/takeltau/bit/clipboard/paste.rb +60 -0
  14. data/lib/takeltau/bit/clipboard/pull.rb +37 -0
  15. data/lib/takeltau/bit/clipboard/push.rb +37 -0
  16. data/lib/takeltau/bit/require/cli.rb +57 -0
  17. data/lib/takeltau/bit/require/export.rb +34 -0
  18. data/lib/takeltau/bit/require/import.rb +133 -0
  19. data/lib/takeltau/bit/require/lib.rb +19 -0
  20. data/lib/takeltau/bit/scope/add.rb +55 -0
  21. data/lib/takeltau/bit/scope/cli.rb +74 -0
  22. data/lib/takeltau/bit/scope/list.rb +41 -0
  23. data/lib/takeltau/bit/scope/new.rb +44 -0
  24. data/lib/takeltau/bit/scope/ssh.rb +13 -0
  25. data/lib/takeltau/completion/cli.rb +24 -0
  26. data/lib/takeltau/default.yml +95 -0
  27. data/lib/takeltau/docker/check/cli.rb +23 -0
  28. data/lib/takeltau/docker/check/daemon.rb +27 -0
  29. data/lib/takeltau/docker/cli.rb +15 -0
  30. data/lib/takeltau/docker/container/check/cli.rb +57 -0
  31. data/lib/takeltau/docker/container/check/existing.rb +32 -0
  32. data/lib/takeltau/docker/container/check/network.rb +32 -0
  33. data/lib/takeltau/docker/container/check/orphaned.rb +32 -0
  34. data/lib/takeltau/docker/container/clean.rb +40 -0
  35. data/lib/takeltau/docker/container/cli.rb +118 -0
  36. data/lib/takeltau/docker/container/command.rb +38 -0
  37. data/lib/takeltau/docker/container/daemon.rb +17 -0
  38. data/lib/takeltau/docker/container/lib.rb +181 -0
  39. data/lib/takeltau/docker/container/login.rb +58 -0
  40. data/lib/takeltau/docker/container/prune.rb +31 -0
  41. data/lib/takeltau/docker/image/cli.rb +39 -0
  42. data/lib/takeltau/docker/image/tag/check.rb +42 -0
  43. data/lib/takeltau/docker/image/tag/cli.rb +68 -0
  44. data/lib/takeltau/docker/image/tag/latest.rb +24 -0
  45. data/lib/takeltau/docker/image/tag/list.rb +19 -0
  46. data/lib/takeltau/docker/image/update.rb +27 -0
  47. data/lib/takeltau/git/check/bit.rb +26 -0
  48. data/lib/takeltau/git/check/clean.rb +46 -0
  49. data/lib/takeltau/git/check/cli.rb +49 -0
  50. data/lib/takeltau/git/check/workspace.rb +34 -0
  51. data/lib/takeltau/git/cli.rb +9 -0
  52. data/lib/takeltau/info/cli.rb +12 -0
  53. data/lib/takeltau/info/project/cli.rb +69 -0
  54. data/lib/takeltau/info/status/bar.rb +112 -0
  55. data/lib/takeltau/info/status/cli.rb +107 -0
  56. data/lib/takeltau/info/status/git.rb +47 -0
  57. data/lib/takeltau/info/status/gopass.rb +37 -0
  58. data/lib/takeltau/info/status/gpg.rb +39 -0
  59. data/lib/takeltau/info/status/lib.rb +46 -0
  60. data/lib/takeltau/info/status/ssh.rb +46 -0
  61. data/lib/takeltau/init/cli.rb +12 -0
  62. data/lib/takeltau/init/lib.rb +86 -0
  63. data/lib/takeltau/init/packer/cli.rb +82 -0
  64. data/lib/takeltau/init/packer/docker.rb +64 -0
  65. data/lib/takeltau/init/packer/templates/ansiblelint.tt +3 -0
  66. data/lib/takeltau/init/packer/templates/bitrequireyml.tt +13 -0
  67. data/lib/takeltau/init/packer/templates/groupvarsprojectyml.tt +2 -0
  68. data/lib/takeltau/init/packer/templates/playbooksiteyml.tt +6 -0
  69. data/lib/takeltau/init/packer/templates/projectyml.tt +19 -0
  70. data/lib/takeltau/init/takelage/cli.rb +70 -0
  71. data/lib/takeltau/init/takelage/rake.rb +61 -0
  72. data/lib/takeltau/init/takelage/templates/bitrequireyml.tt +5 -0
  73. data/lib/takeltau/init/takelage/templates/projectyml.tt +3 -0
  74. data/lib/takeltau/init/templates/Rakefile.tt +3 -0
  75. data/lib/takeltau/init/templates/gitignore.tt +16 -0
  76. data/lib/takeltau/lib/config.rb +130 -0
  77. data/lib/takeltau/lib/logging.rb +49 -0
  78. data/lib/takeltau/lib/project.rb +72 -0
  79. data/lib/takeltau/lib/subcmd.rb +18 -0
  80. data/lib/takeltau/lib/system.rb +194 -0
  81. data/lib/takeltau/mutagen/check/cli.rb +40 -0
  82. data/lib/takeltau/mutagen/check/daemon.rb +76 -0
  83. data/lib/takeltau/mutagen/cli.rb +12 -0
  84. data/lib/takeltau/mutagen/socket/check.rb +33 -0
  85. data/lib/takeltau/mutagen/socket/cli.rb +103 -0
  86. data/lib/takeltau/mutagen/socket/create.rb +47 -0
  87. data/lib/takeltau/mutagen/socket/list.rb +33 -0
  88. data/lib/takeltau/mutagen/socket/terminate.rb +32 -0
  89. data/lib/takeltau/mutagen/socket/tidy.rb +21 -0
  90. data/lib/takeltau/self/cli.rb +43 -0
  91. data/lib/takeltau/self/config/cli.rb +82 -0
  92. data/lib/takeltau/self/list.rb +35 -0
  93. data/lib/takeltau/version +1 -0
  94. metadata +319 -0
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Takeltau
4
+ # takeltau bit check
5
+ class BitCheck < SubCommandBase
6
+ include LoggingModule
7
+ include SystemModule
8
+ include ConfigModule
9
+ include BitCheckWorkspace
10
+
11
+ #
12
+ # bit check workspace
13
+ #
14
+ desc 'workspace', 'Check if a bit workspace exists'
15
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
16
+ Check if a bit workspace exists
17
+ LONGDESC
18
+ # Check if a bit workspace exists.
19
+ def workspace
20
+ exit bit_check_workspace
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takeltau bit check workspace
4
+ module BitCheckWorkspace
5
+ # Backend method for bit check workspace.
6
+ # @return [Boolean] is this a bit workspace?
7
+ def bit_check_workspace
8
+ log.debug 'Check if this is a bit workspace'
9
+
10
+ status_repo = _bit_check_workspace_bit_repo
11
+ return true if status_repo.exitstatus.zero?
12
+
13
+ dir = _bit_check_workspace_dir
14
+ log.debug "No bit workspace found in \"#{dir}\""
15
+ false
16
+ end
17
+
18
+ private
19
+
20
+ # Check bit repo.
21
+ def _bit_check_workspace_bit_repo
22
+ cmd_bit_repo =
23
+ config.active['cmd_bit_check_workspace_bit_list']
24
+
25
+ try cmd_bit_repo
26
+ end
27
+
28
+ # Get current working directory.
29
+ def _bit_check_workspace_dir
30
+ cmd_pwd =
31
+ config.active['cmd_bit_check_workspace_pwd']
32
+
33
+ stdout_str_dir = run cmd_pwd
34
+
35
+ stdout_str_dir.chomp
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Takeltau
4
+ # takeltau bit
5
+ class Bit < SubCommandBase
6
+ desc 'check [COMMAND]', 'Check bit state'
7
+ subcommand 'check', BitCheck
8
+
9
+ desc 'clipboard [COMMAND]', 'Manage bit clipboard'
10
+ subcommand 'clipboard', BitClipboard
11
+
12
+ desc 'require [COMMAND]', 'Manage bit requirements'
13
+ subcommand 'require', BitRequire
14
+
15
+ desc 'scope [COMMAND]', 'Manage bit scopes'
16
+ subcommand 'scope', BitScope
17
+ end
18
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Takeltau
4
+ # takeltau bit clipboard
5
+ class BitClipboard < SubCommandBase
6
+ include LoggingModule
7
+ include ConfigModule
8
+ include SystemModule
9
+ include GitCheckClean
10
+ include GitCheckBit
11
+ include GitCheckWorkspace
12
+ include BitCheckWorkspace
13
+ include BitClipboardLib
14
+ include BitClipboardCopy
15
+ include BitClipboardPaste
16
+ include BitClipboardPull
17
+ include BitClipboardPush
18
+
19
+ #
20
+ # bit copy
21
+ #
22
+ desc 'copy [DIR] [SCOPE]', 'Copy new [DIR] to [SCOPE]'
23
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
24
+ Copy a directory as a bit component to a bit remote scope
25
+ This command will add a directory as a bit component and tag it.
26
+ The id of the component will be created from the directory name.
27
+ The directory needs to contain a README.bit file
28
+ or else a new README.bit file will be created.
29
+ The README.bit will be the main file of the component which must not be deleted.
30
+ The tagged bit component will be exported to a bit remote scope.
31
+ LONGDESC
32
+ # Copy a file or directory as a bit component to a bit remote scope.
33
+ def copy(dir_or_file, scope)
34
+ exit bit_clipboard_copy dir_or_file, scope
35
+ end
36
+
37
+ #
38
+ # bit paste
39
+ #
40
+ desc 'paste [COMPONENT] [DIR]', 'Paste bit [COMPONENT] into [DIR]'
41
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
42
+ Paste a bit component into a directory
43
+ LONGDESC
44
+ # Paste a bit component into a directory.
45
+ def paste(cid, dir)
46
+ exit bit_clipboard_paste cid, dir
47
+ end
48
+
49
+ #
50
+ # bit pull
51
+ #
52
+ desc 'pull', 'Pull all updates for bit components from bit remote scopes'
53
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
54
+ Pull all updates for bit components from bit remote scopes
55
+ LONGDESC
56
+ # Pull all updates for bit components from bit remote scopes.
57
+ def pull
58
+ exit bit_clipboard_pull
59
+ end
60
+
61
+ #
62
+ # bit push
63
+ #
64
+ desc 'push', 'Push all updates of bit components to bit remote scopes'
65
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
66
+ Push all updates of bit components to bit remote scopes
67
+ LONGDESC
68
+ # Push all updates of bit components to bit remote scopes.
69
+ def push
70
+ exit bit_clipboard_push
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takeltau bit clipboard copy
4
+ module BitClipboardCopy
5
+ # Backend method for bit copy.
6
+ def bit_clipboard_copy(dir, scope)
7
+ # remove trailing slash
8
+ dir = dir.chomp('/')
9
+
10
+ log.debug "Running bit copy \"#{dir}\" to \"#{scope}\""
11
+
12
+ return false unless configured? %w[project_root_dir]
13
+
14
+ return false unless _bit_clipboard_lib_prepare_workspace
15
+
16
+ unless File.directory? dir
17
+ log.error "The directory \"#{dir}\" does not exist"
18
+ return false
19
+ end
20
+
21
+ _bit_clipboard_copy_dir dir, scope
22
+ end
23
+
24
+ private
25
+
26
+ # rubocop:disable Metrics/MethodLength
27
+ def _bit_clipboard_copy_dir(dir, scope)
28
+ log.debug "Adding the directory \"#{dir}\" as a tagged bit component"
29
+
30
+ return false unless _bit_clipboard_copy_dir_scope_exists? scope
31
+
32
+ return false if _bit_clipboard_copy_readme_bit_exists_in_subdir? dir
33
+
34
+ id = _bit_clipboard_lib_id(dir)
35
+
36
+ _bit_clipboard_copy_touch_readme_bit dir
37
+ _bit_clipboard_copy_add_dir id, dir
38
+ _bit_clipboard_copy_tag_dir id
39
+ _bit_clipboard_copy_export_to_scope scope
40
+ _bit_clipbpard_lib_remove_bit_artifacts
41
+ _bit_clipboard_lib_sync_workspace
42
+
43
+ log.info "Copied directory \"#{dir}\" as bit component \"#{id}\" " \
44
+ "to bit remote scope \"#{scope}\""
45
+ end
46
+ # rubocop:enable Metrics/MethodLength
47
+
48
+ # Touch README.bit if necessary.
49
+ def _bit_clipboard_copy_touch_readme_bit(dir)
50
+ readme_bit = "#{dir}/README.bit"
51
+ return if File.file? readme_bit
52
+
53
+ log.info "Creating \"README.bit\" in \"#{dir}\""
54
+ File.open(readme_bit, 'w') {}
55
+ end
56
+
57
+ # Check if a README.bit file exists in a subdirectory.
58
+ def _bit_clipboard_copy_readme_bit_exists_in_subdir?(dir)
59
+ Dir.glob("#{dir}/**/README.bit").each do |file|
60
+ unless file == "#{dir}/README.bit"
61
+ log.error 'Nested README.bit file detected'
62
+ return true
63
+ end
64
+ end
65
+
66
+ false
67
+ end
68
+
69
+ # Check if bit scope exists.
70
+ def _bit_clipboard_copy_dir_scope_exists?(scope)
71
+ bit_dev = config.active['bit_dev_user']
72
+
73
+ # check if scope is a candidate for a bit.dev remote scope
74
+ if scope.start_with? "#{bit_dev}."
75
+ return false unless _bit_clipboard_bit_dev_scope_exists scope
76
+ else
77
+ return false unless _bit_clipboard_custom_scope_exists scope
78
+ end
79
+
80
+ true
81
+ end
82
+
83
+ # Check if bit.dev remote scope exists.
84
+ def _bit_clipboard_bit_dev_scope_exists(scope)
85
+ cmd_bit_list_scope = format(
86
+ config.active['cmd_bit_clipboard_copy_bit_list_scope'],
87
+ scope: scope
88
+ )
89
+
90
+ status = try cmd_bit_list_scope
91
+
92
+ return true if status.exitstatus.zero?
93
+
94
+ log.error "No bit.dev remote scope \"#{scope}\" found"
95
+ false
96
+ end
97
+
98
+ # Check if bit remote scope is added to local workspace.
99
+ def _bit_clipboard_custom_scope_exists(scope)
100
+ cmd_bit_list_remotes =
101
+ config.active['cmd_bit_clipboard_copy_bit_list_remotes']
102
+
103
+ stdout_str = run cmd_bit_list_remotes
104
+
105
+ return true if /.*\s+#{scope}\s+.*/m.match? stdout_str
106
+
107
+ log.error "No bit remote scope \"#{scope}\" " \
108
+ 'found in local bit workspace'
109
+ false
110
+ end
111
+
112
+ # bit tag dir.
113
+ def _bit_clipboard_copy_add_dir(id, dir)
114
+ cmd_bit_add_dir = format(
115
+ config.active['cmd_bit_clipboard_copy_bit_add_dir'],
116
+ id: id,
117
+ dir: dir
118
+ )
119
+
120
+ run cmd_bit_add_dir
121
+ end
122
+
123
+ # bit tag dir.
124
+ def _bit_clipboard_copy_tag_dir(id)
125
+ cmd_bit_tag_id = format(
126
+ config.active['cmd_bit_clipboard_copy_bit_tag_id'],
127
+ id: id
128
+ )
129
+
130
+ run cmd_bit_tag_id
131
+ end
132
+
133
+ # bit export component to bit remote scope.
134
+ def _bit_clipboard_copy_export_to_scope(scope)
135
+ cmd_bit_export_to_scope = format(
136
+ config.active['cmd_bit_clipboard_copy_bit_export_to_scope'],
137
+ scope: scope
138
+ )
139
+
140
+ run cmd_bit_export_to_scope
141
+ end
142
+ end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takeltau bit clipboard lib
4
+ module BitClipboardLib
5
+ private
6
+
7
+ # Run bit status.
8
+ def _bit_clipboard_lib_bit_status
9
+ log.debug 'Running bit status'
10
+
11
+ cmd_bit_status = config.active['cmd_bit_clipboard_lib_bit_status']
12
+ run_and_exit cmd_bit_status
13
+ end
14
+
15
+ # Prepare workspace for bit clipboard.
16
+ def _bit_clipboard_lib_prepare_workspace
17
+ unless bit_check_workspace
18
+ log.error 'No bit workspace'
19
+ return false
20
+ end
21
+
22
+ return true unless git_check_workspace
23
+
24
+ _bit_clipboard_lib_prepare_git_workspace
25
+ end
26
+
27
+ # Prepare git workspace for bit clipboard.
28
+ def _bit_clipboard_lib_prepare_git_workspace
29
+ unless git_check_bit
30
+ log.error 'Not on git main branch'
31
+ return false
32
+ end
33
+
34
+ unless git_check_clean
35
+ log.error 'No clean git workspace'
36
+ return false
37
+ end
38
+
39
+ _bit_clipboard_lib_git_pull
40
+ end
41
+
42
+ # Remove bit artifacts.
43
+ def _bit_clipbpard_lib_remove_bit_artifacts
44
+ log.debug 'Removing bit artifacts'
45
+
46
+ # Remove node_modules directory.
47
+ FileUtils.remove_entry_secure('node_modules', force: true)
48
+
49
+ # Remove index.bit files recursively.
50
+ Dir.glob('./**/index.bit').each do |file|
51
+ FileUtils.remove_entry_secure(file, force: true)
52
+ end
53
+
54
+ # Remove package.json file.
55
+ FileUtils.remove_entry_secure('package.json', force: true)
56
+ end
57
+
58
+ # Sync workspace with upstream.
59
+ def _bit_clipboard_lib_sync_workspace
60
+ log.debug 'Syncing git workspace'
61
+
62
+ path = config.active['project_root_dir']
63
+ file = "#{path}/.bitmap"
64
+ message = 'Update .bitmap'
65
+
66
+ _bit_clipboard_lib_git_add file
67
+ _bit_clipboard_lib_git_commit message
68
+ _bit_clipboard_lib_git_push
69
+ end
70
+
71
+ # git add .bitmap.
72
+ def _bit_clipboard_lib_git_add(file)
73
+ log.debug "Adding \"#{file}\" to git"
74
+
75
+ cmd_bit_clipboard_git_add = format(
76
+ config.active['cmd_bit_clipboard_git_add'],
77
+ file: file
78
+ )
79
+ run cmd_bit_clipboard_git_add
80
+ end
81
+
82
+ # git commit -m "Update .bitmap".
83
+ def _bit_clipboard_lib_git_commit(message)
84
+ log.debug "Committing to git with message \"#{message}\""
85
+
86
+ cmd_bit_clipboard_git_commit = format(
87
+ config.active['cmd_bit_clipboard_git_commit'],
88
+ message: message
89
+ )
90
+
91
+ run cmd_bit_clipboard_git_commit
92
+ end
93
+
94
+ # git push origin main.
95
+ def _bit_clipboard_lib_git_push
96
+ log.debug 'Pushing main branch to origin'
97
+
98
+ cmd_bit_clipboard_git_push = format(
99
+ config.active['cmd_bit_clipboard_git_push'],
100
+ main: config.active['git_bit_branch']
101
+ )
102
+
103
+ run cmd_bit_clipboard_git_push
104
+ end
105
+
106
+ # git pull.
107
+ def _bit_clipboard_lib_git_pull
108
+ log.debug 'Updating git workspace'
109
+ cmd_bit_clipboard_git_pull = format(
110
+ config.active['cmd_bit_clipboard_git_pull'],
111
+ main: config.active['git_bit_branch']
112
+ )
113
+
114
+ return true if try cmd_bit_clipboard_git_pull
115
+
116
+ log.error 'Unable to update git workspace'
117
+ false
118
+ end
119
+
120
+ # Generate bit component ID.
121
+ def _bit_clipboard_lib_id(name)
122
+ id = ''
123
+
124
+ # bit restrictions:
125
+ # component names can only contain alphanumeric,
126
+ # lowercase characters, and the following ["-", "_", "$", "!", "/"]
127
+
128
+ # convert directory name to lowercase characters
129
+ dir_downcase = name.downcase
130
+
131
+ # construct array of allowed characters
132
+ allowed_chars = [*('a'..'z'), *('0'..'9'), '-', '_', '$', '!', '/']
133
+
134
+ # iterate over directory or file name
135
+ # and replace invalid characters with underscore
136
+ dir_downcase.split('').each do |char|
137
+ id += allowed_chars.include?(char) ? char : '_'
138
+ end
139
+
140
+ log.debug "Generated bit id \"#{id}\" from \"#{name}\""
141
+ id
142
+ end
143
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takeltau bit clipboard paste
4
+ module BitClipboardPaste
5
+ # Backend method for bit paste.
6
+ def bit_clipboard_paste(cid, dir)
7
+ log.debug "Running bit paste \"#{cid}\" to \"#{dir}\""
8
+
9
+ return false unless configured? %w[project_root_dir]
10
+
11
+ return false unless _bit_clipboard_lib_prepare_workspace
12
+
13
+ return false unless _bit_clipboard_paste_cid_exists? cid
14
+
15
+ _bit_clipboard_paste_import_cid cid, dir
16
+ _bit_clipbpard_lib_remove_bit_artifacts
17
+ _bit_clipboard_lib_sync_workspace
18
+
19
+ log.info "Pasted bit component \"#{cid}\" to directory \"#{dir}\""
20
+ true
21
+ end
22
+
23
+ private
24
+
25
+ # paste bit component into directory.
26
+ def _bit_clipboard_paste_import_cid(cid, dir)
27
+ cmd_bit_import_cid = format(
28
+ config.active['cmd_bit_clipboard_paste_bit_import_cid'],
29
+ cid: cid,
30
+ dir: dir
31
+ )
32
+
33
+ run cmd_bit_import_cid
34
+ end
35
+
36
+ # Check if remote component exists.
37
+ def _bit_clipboard_paste_cid_exists?(cid)
38
+ scope = cid.scan(%r{([^/]*).*}).first.first
39
+
40
+ log.debug "Checking if scope \"#{scope}\" " \
41
+ "contains component id \"#{cid}\""
42
+
43
+ bit_list_scope = _bit_clipboard_paste_cid_exists_list_scope scope
44
+
45
+ return true if bit_list_scope.include? "\"id\": \"#{cid}\","
46
+
47
+ log.error "No remote component \"#{cid}\""
48
+ false
49
+ end
50
+
51
+ # Get components in remote scope.
52
+ def _bit_clipboard_paste_cid_exists_list_scope(scope)
53
+ cmd_bit_list_scope = format(
54
+ config.active['cmd_bit_clipboard_paste_bit_list_scope'],
55
+ scope: scope
56
+ )
57
+
58
+ run cmd_bit_list_scope
59
+ end
60
+ end