rakit 0.1.4 → 0.1.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6dccf1b9c3ff38dfd13effcd855e9185861e7f2be033bf6b3d4592a1280fdc63
4
- data.tar.gz: 9a02e557e8d7611503598acc9040711c6af37f1ad8c315b1f6eb10e65ecd3308
3
+ metadata.gz: 7270ecd6c8ca0f035dde641cc2c8713a9907f93fa837099b8b4bb5e96be528ac
4
+ data.tar.gz: eb0c02cd74eaa13bf8b9a3f4a6ac22506267c123138a0f718c9450c7f457432d
5
5
  SHA512:
6
- metadata.gz: c638ae4a880d61900c8252de617b501c3580a1b56a87c234ac2e72f9084d658012b174136f67cc8f40aa8add72aee9f4ab0a6df71e76a011a6e7ee264b5acbfb
7
- data.tar.gz: 4cd01b862624d2a21e2d70a0a78163447ac1c33a1eceedbfce54dfecacb9a2b339fde3f11ce9f6f49dd7451ad9f4f2b55248646df05b5961f07b76d716773783
6
+ metadata.gz: b83885ba425b9bef93ddc077a442da2ae567dd5986a7d7fc9260e3e09d5f05ff576d628c51ecdb8a70bd96766d6e9d6ec51c8fd7868014424aa537b45c41cec6
7
+ data.tar.gz: c520af4a3530456192f317e13f1b8f4d842d71be2eee8570a5d50047c389507288fff144536c089f10dcbd6d62ee58c5b90e506f715fbe6430dcb4502c2fac10
data/exe/rakit ADDED
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # CLI for rakit gem. Subcommands: file (list|copy), word-count (--json-keys), static-web-server (start|stop|running|publish).
5
+
6
+ require "rakit"
7
+
8
+ # Allow tests to override root via environment
9
+ Rakit::StaticWebServer.root = ENV["RAKIT_WWW_ROOT"] if ENV["RAKIT_WWW_ROOT"]
10
+
11
+ def usage_stderr(msg = nil)
12
+ $stderr.puts msg if msg
13
+ $stderr.puts "Usage: rakit <subcommand> [options] [args]"
14
+ $stderr.puts " file list <directory> [--recursive] [--include-hidden] [--format console|json|proto-json]"
15
+ $stderr.puts " file copy <source> <destination> [--overwrite] [--create-directories] [--format ...]"
16
+ $stderr.puts " word-count <file>|--stdin --json-keys [--format console|json|proto-json] [options]"
17
+ $stderr.puts " static-web-server <start|stop|running|publish|view> [options] [args]"
18
+ $stderr.puts " start [--port PORT] Start server (idempotent)"
19
+ $stderr.puts " stop Stop server"
20
+ $stderr.puts " running Exit 0 if running, non-zero otherwise"
21
+ $stderr.puts " publish <site_name> <source_dir> Publish static site"
22
+ $stderr.puts " view [path] Open path in browser (default /)"
23
+ end
24
+
25
+ def main(argv = ARGV)
26
+ return usage_stderr("Expected subcommand.") if argv.empty?
27
+
28
+ sub = argv[0]
29
+ if sub == "--version" || sub == "-v"
30
+ spec = Gem.loaded_specs["rakit"]
31
+ puts spec ? "#{spec.name} #{spec.version}" : "rakit (version unknown)"
32
+ return 0
33
+ end
34
+ if sub == "--help" || sub == "-h"
35
+ usage_stderr
36
+ return 0
37
+ end
38
+
39
+ if sub == "file"
40
+ argv.shift
41
+ require "rakit/cli/file"
42
+ return Rakit::CLI::File.run(argv)
43
+ end
44
+
45
+ if sub == "word-count" || sub == "word_count"
46
+ argv.shift
47
+ require "rakit/cli/word_count"
48
+ return Rakit::CLI::WordCount.run(argv)
49
+ end
50
+
51
+ if sub != "static-web-server"
52
+ usage_stderr("Unknown subcommand: #{sub}")
53
+ return 1
54
+ end
55
+
56
+ argv.shift
57
+ cmd = argv.shift
58
+ case cmd
59
+ when "start"
60
+ port = Rakit::StaticWebServer.port
61
+ while (arg = argv.shift)
62
+ if arg == "--port" && argv[0]
63
+ port = argv.shift.to_i
64
+ end
65
+ end
66
+ Rakit::StaticWebServer.start(port: port)
67
+ puts "http://localhost:#{port}"
68
+ return 0
69
+ when "stop"
70
+ Rakit::StaticWebServer.stop
71
+ return 0
72
+ when "running"
73
+ return Rakit::StaticWebServer.running? ? 0 : 1
74
+ when "publish"
75
+ site_name = argv.shift
76
+ source_dir = argv.shift
77
+ unless site_name && source_dir
78
+ usage_stderr("publish requires <site_name> and <source_dir>")
79
+ return 1
80
+ end
81
+ Rakit::StaticWebServer.publish(site_name, source_dir)
82
+ return 0
83
+ when "view"
84
+ path = argv.shift || "/"
85
+ begin
86
+ Rakit::StaticWebServer.view(path)
87
+ return 0
88
+ rescue RuntimeError => e
89
+ $stderr.puts e.message
90
+ return 1
91
+ end
92
+ else
93
+ usage_stderr(cmd ? "Unknown command: #{cmd}" : "Expected command after static-web-server.")
94
+ return 1
95
+ end
96
+ rescue ArgumentError, Errno::ENOENT, Errno::EACCES, Errno::EPERM => e
97
+ $stderr.puts e.message
98
+ return 1
99
+ rescue => e
100
+ $stderr.puts "Error: #{e.message}"
101
+ return 1
102
+ end
103
+
104
+ exit main(ARGV.dup)
@@ -2,8 +2,7 @@
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
3
  # source: data.proto
4
4
 
5
- require 'google/protobuf'
6
-
5
+ require "google/protobuf"
7
6
 
8
7
  descriptor_data = "\n\ndata.proto\x12\nrakit.data\"h\n\x05Index\x12/\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x1e.rakit.data.Index.EntriesEntry\x1a.\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01*^\n\x0c\x45xportFormat\x12\x19\n\x15PROTOBUF_BINARY_FILES\x10\x00\x12\x17\n\x13PROTOBUF_JSON_FILES\x10\x01\x12\x1a\n\x16PROTOBUF_BINARY_ZIPPED\x10\x02\x42\x0e\xea\x02\x0bRakit::Datab\x06proto3"
9
8
 
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: rakit.azure.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x11rakit.azure.proto\x12\x0brakit.azure\"L\n\x08Pipeline\x12\x0b\n\x03org\x18\x01 \x01(\t\x12\x0f\n\x07project\x18\x02 \x01(\t\x12\x13\n\x0bpipeline_id\x18\x03 \x01(\x05\x12\r\n\x05token\x18\x04 \x01(\t\"R\n\x18GetPipelineResultRequest\x12\'\n\x08pipeline\x18\x01 \x01(\x0b\x32\x15.rakit.azure.Pipeline\x12\r\n\x05token\x18\x02 \x01(\t\"C\n\x0ePipelineStatus\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0e\n\x06\x65rrors\x18\x02 \x03(\t\x12\x10\n\x08warnings\x18\x03 \x03(\t\"8\n\x0ePipelineResult\x12&\n\x04runs\x18\x01 \x03(\x0b\x32\x18.rakit.azure.PipelineRun\"\x97\x01\n\x0bPipelineRun\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\t\x12\x0e\n\x06result\x18\x04 \x01(\t\x12\x14\n\x0c\x63reated_date\x18\x05 \x01(\t\x12\x15\n\rfinished_date\x18\x06 \x01(\t\x12\"\n\x06stages\x18\x07 \x03(\x0b\x32\x12.rakit.azure.Stage\"&\n\x05Issue\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\"G\n\x03Job\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06result\x18\x02 \x01(\t\x12\"\n\x06issues\x18\x03 \x03(\x0b\x32\x12.rakit.azure.Issue\"i\n\x05Stage\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06result\x18\x02 \x01(\t\x12\x1e\n\x04jobs\x18\x03 \x03(\x0b\x32\x10.rakit.azure.Job\x12\"\n\x06issues\x18\x04 \x03(\x0b\x32\x12.rakit.azure.Issue\"`\n\x0eTimelineRecord\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0e\n\x06result\x18\x03 \x01(\t\x12\"\n\x06issues\x18\x04 \x03(\x0b\x32\x12.rakit.azure.Issue\"\xa8\x01\n\x14PipelineResultDetail\x12\x12\n\nsuccessful\x18\x01 \x01(\x08\x12\x0e\n\x06\x65rrors\x18\x02 \x01(\t\x12\x10\n\x08warnings\x18\x03 \x01(\t\x12%\n\x03run\x18\x04 \x01(\x0b\x32\x18.rakit.azure.PipelineRun\x12\x33\n\x0e\x66\x61iled_records\x18\x05 \x03(\x0b\x32\x1b.rakit.azure.TimelineRecord2i\n\x0ePipelineServer\x12W\n\x11GetPipelineResult\x12%.rakit.azure.GetPipelineResultRequest\x1a\x1b.rakit.azure.PipelineResultB\x0f\xea\x02\x0cRakit::Azureb\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Rakit
14
+ module Azure
15
+ Pipeline = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.Pipeline").msgclass
16
+ GetPipelineResultRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.GetPipelineResultRequest").msgclass
17
+ PipelineStatus = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.PipelineStatus").msgclass
18
+ PipelineResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.PipelineResult").msgclass
19
+ PipelineRun = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.PipelineRun").msgclass
20
+ Issue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.Issue").msgclass
21
+ Job = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.Job").msgclass
22
+ Stage = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.Stage").msgclass
23
+ TimelineRecord = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.TimelineRecord").msgclass
24
+ PipelineResultDetail = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.azure.PipelineResultDetail").msgclass
25
+ end
26
+ end
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
- # source: example.proto
3
+ # source: rakit.example.proto
4
4
 
5
- require "google/protobuf"
5
+ require 'google/protobuf'
6
6
 
7
- descriptor_data = "\n\rexample.proto\x12\rrakit.example\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\" \n\rHelloResponse\x12\x0f\n\x07message\x18\x01 \x01(\tB\x13\xea\x02\x10Rakit::Generatedb\x06proto3"
7
+
8
+ descriptor_data = "\n\x13rakit.example.proto\x12\rrakit.example\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\" \n\rHelloResponse\x12\x0f\n\x07message\x18\x01 \x01(\tB\x13\xea\x02\x10Rakit::Generatedb\x06proto3"
8
9
 
9
10
  pool = ::Google::Protobuf::DescriptorPool.generated_pool
10
11
  pool.add_serialized_file(descriptor_data)
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: rakit.file.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x10rakit.file.proto\x12\nrakit.file\"T\n\nFileConfig\x12\x1a\n\x12\x63reate_directories\x18\x01 \x01(\x08\x12\x11\n\toverwrite\x18\x02 \x01(\x08\x12\x17\n\x0f\x66ollow_symlinks\x18\x03 \x01(\x08\"\x81\x01\n\x0bListRequest\x12&\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x16.rakit.file.FileConfig\x12\x11\n\tdirectory\x18\x02 \x01(\t\x12\x11\n\trecursive\x18\x03 \x01(\x08\x12\x0c\n\x04glob\x18\x04 \x01(\t\x12\x16\n\x0einclude_hidden\x18\x05 \x01(\x08\"\x7f\n\tFileEntry\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x14\n\x0cis_directory\x18\x03 \x01(\x08\x12\x12\n\nis_symlink\x18\x04 \x01(\x08\x12\x12\n\nsize_bytes\x18\x05 \x01(\x03\x12\x18\n\x10modified_unix_ms\x18\x06 \x01(\x03\"y\n\nListResult\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0f\n\x07message\x18\x02 \x01(\t\x12&\n\x07\x65ntries\x18\x03 \x03(\x0b\x32\x15.rakit.file.FileEntry\x12\x11\n\texit_code\x18\x04 \x01(\x05\x12\x0e\n\x06stderr\x18\x05 \x01(\t\"Z\n\x0b\x43opyRequest\x12&\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x16.rakit.file.FileConfig\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x03 \x01(\t\"\x8c\x01\n\nCopyResult\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x04 \x01(\t\x12\x11\n\texit_code\x18\x05 \x01(\x05\x12\x0e\n\x06stderr\x18\x06 \x01(\t\x12\x14\n\x0c\x62ytes_copied\x18\x07 \x01(\x03\x62\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Rakit
14
+ module File
15
+ FileConfig = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.file.FileConfig").msgclass
16
+ ListRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.file.ListRequest").msgclass
17
+ FileEntry = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.file.FileEntry").msgclass
18
+ ListResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.file.ListResult").msgclass
19
+ CopyRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.file.CopyRequest").msgclass
20
+ CopyResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.file.CopyResult").msgclass
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: rakit.shell.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x11rakit.shell.proto\x12\x0brakit.shell\"\x9a\x02\n\x07\x43ommand\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x61rgs\x18\x02 \x03(\t\x12\x19\n\x11working_directory\x18\x03 \x01(\t\x12\x17\n\x0ftimeout_seconds\x18\x04 \x01(\x05\x12\x1a\n\x12\x65xpected_exit_code\x18\x05 \x01(\x05\x12\x17\n\x0f\x65xpected_stdout\x18\x06 \x01(\t\x12\x17\n\x0f\x65xpected_stderr\x18\x07 \x01(\t\x12<\n\x13\x61\x63\x63\x65ptance_criteria\x18\x08 \x03(\x0b\x32\x1f.rakit.shell.AcceptanceCriteria\x12\x13\n\x0b\x65xit_status\x18\t \x01(\x05\x12\x0e\n\x06stdout\x18\n \x01(\t\x12\x0e\n\x06stderr\x18\x0b \x01(\t\"1\n\x12\x41\x63\x63\x65ptanceCriteria\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"-\n\nTestResult\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0e\n\x06\x65rrors\x18\x02 \x03(\t\"b\n\rFormatRequest\x12%\n\x07\x63ommand\x18\x01 \x01(\x0b\x32\x14.rakit.shell.Command\x12*\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\x1a.rakit.shell.CommandFormat\" \n\x0e\x46ormatResponse\x12\x0e\n\x06output\x18\x01 \x01(\t*Z\n\rCommandFormat\x12\x1e\n\x1a\x43OMMAND_FORMAT_UNSPECIFIED\x10\x00\x12\x0c\n\x08ONE_LINE\x10\x01\x12\x0e\n\nMULTI_LINE\x10\x02\x12\x0b\n\x07\x43OMPACT\x10\x03\x32\xc1\x01\n\x0e\x43ommandService\x12\x35\n\x07\x45xecute\x12\x14.rakit.shell.Command\x1a\x14.rakit.shell.Command\x12\x35\n\x04Test\x12\x14.rakit.shell.Command\x1a\x17.rakit.shell.TestResult\x12\x41\n\x06\x46ormat\x12\x1a.rakit.shell.FormatRequest\x1a\x1b.rakit.shell.FormatResponseB\x0f\xea\x02\x0cRakit::Shellb\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Rakit
14
+ module Shell
15
+ Command = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.shell.Command").msgclass
16
+ AcceptanceCriteria = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.shell.AcceptanceCriteria").msgclass
17
+ TestResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.shell.TestResult").msgclass
18
+ FormatRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.shell.FormatRequest").msgclass
19
+ FormatResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.shell.FormatResponse").msgclass
20
+ CommandFormat = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.shell.CommandFormat").enummodule
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: rakit.static_web_server.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x1drakit.static_web_server.proto\x12\x17rakit.static_web_server\"T\n\x15StaticWebServerConfig\x12\x16\n\x0eroot_directory\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x15\n\rhttps_enabled\x18\x03 \x01(\x08\"=\n\x0ePublishRequest\x12\x11\n\tsite_name\x18\x01 \x01(\t\x12\x18\n\x10source_directory\x18\x02 \x01(\t\"1\n\rPublishResult\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0f\n\x07message\x18\x02 \x01(\t\"-\n\x0cServerStatus\x12\x0f\n\x07running\x18\x01 \x01(\x08\x12\x0c\n\x04port\x18\x02 \x01(\rB\x13\xea\x02\x10Rakit::Generatedb\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Rakit
14
+ module Generated
15
+ StaticWebServerConfig = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.static_web_server.StaticWebServerConfig").msgclass
16
+ PublishRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.static_web_server.PublishRequest").msgclass
17
+ PublishResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.static_web_server.PublishResult").msgclass
18
+ ServerStatus = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.static_web_server.ServerStatus").msgclass
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: rakit.word_count.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x16rakit.word_count.proto\x12\x10rakit.word_count\"\x9c\x01\n\x0fWordCountConfig\x12\x18\n\x10\x63\x61se_insensitive\x18\x01 \x01(\x08\x12\x18\n\x10split_camel_case\x18\x02 \x01(\x08\x12\x19\n\x11split_snake_kebab\x18\x03 \x01(\x08\x12\x18\n\x10min_token_length\x18\x04 \x01(\r\x12\x11\n\tstopwords\x18\x05 \x03(\t\x12\r\n\x05top_n\x18\x06 \x01(\r\"S\n\nJsonSource\x12\x13\n\tjson_file\x18\x01 \x01(\tH\x00\x12\x15\n\x0binline_json\x18\x02 \x01(\tH\x00\x12\x0f\n\x05stdin\x18\x03 \x01(\x08H\x00\x42\x08\n\x06source\"\xbb\x01\n\x10WordCountRequest\x12\x31\n\x06\x63onfig\x18\x01 \x01(\x0b\x32!.rakit.word_count.WordCountConfig\x12*\n\x04json\x18\x02 \x01(\x0b\x32\x1c.rakit.word_count.JsonSource\x12\x31\n\x04mode\x18\x03 \x01(\x0e\x32#.rakit.word_count.JsonWordCountMode\x12\x15\n\rinclude_paths\x18\x04 \x01(\x08\"*\n\nTokenCount\x12\r\n\x05token\x18\x01 \x01(\t\x12\r\n\x05\x63ount\x18\x02 \x01(\x04\"\xb1\x01\n\x0fWordCountResult\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0f\n\x07message\x18\x02 \x01(\t\x12,\n\x06\x63ounts\x18\x03 \x03(\x0b\x32\x1c.rakit.word_count.TokenCount\x12\x11\n\texit_code\x18\x04 \x01(\x05\x12\x0e\n\x06stderr\x18\x05 \x01(\t\x12\x14\n\x0ctotal_tokens\x18\x06 \x01(\x04\x12\x15\n\runique_tokens\x18\x07 \x01(\x04*y\n\x11JsonWordCountMode\x12$\n JSON_WORD_COUNT_MODE_UNSPECIFIED\x10\x00\x12\x1d\n\x19JSON_WORD_COUNT_MODE_KEYS\x10\x01\x12\x1f\n\x1bJSON_WORD_COUNT_MODE_VALUES\x10\x02\x42\x13\xea\x02\x10Rakit::Generatedb\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Rakit
14
+ module Generated
15
+ WordCountConfig = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.word_count.WordCountConfig").msgclass
16
+ JsonSource = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.word_count.JsonSource").msgclass
17
+ WordCountRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.word_count.WordCountRequest").msgclass
18
+ TokenCount = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.word_count.TokenCount").msgclass
19
+ WordCountResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.word_count.WordCountResult").msgclass
20
+ JsonWordCountMode = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("rakit.word_count.JsonWordCountMode").enummodule
21
+ end
22
+ end
@@ -7,7 +7,7 @@ require "net/http"
7
7
  require "uri"
8
8
 
9
9
  begin
10
- require "generated/azure.devops_pb"
10
+ require "generated/rakit.azure_pb"
11
11
  rescue StandardError
12
12
  # google-protobuf not available or version conflict (e.g. running without bundle exec)
13
13
  end
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "google/protobuf"
5
+ require "rakit/file"
6
+
7
+ module Rakit
8
+ module CLI
9
+ module File
10
+ class << self
11
+ # @param argv [Array<String>] arguments after "file"
12
+ # @return [Integer] exit code
13
+ def run(argv)
14
+ return 1 if argv.empty?
15
+ sub = argv.shift
16
+ case sub
17
+ when "list" then run_list(argv)
18
+ when "copy" then run_copy(argv)
19
+ else
20
+ $stderr.puts "Unknown command: #{sub}. Use 'list' or 'copy'."
21
+ $stderr.puts " rakit file list <directory> [--recursive] [--include-hidden] [--format console|json|proto-json]"
22
+ $stderr.puts " rakit file copy <source> <destination> [--overwrite] [--create-directories] [--follow-symlinks] [--format ...]"
23
+ 1
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def run_list(argv)
30
+ opts = parse_list_argv(argv)
31
+ return 1 if opts[:error]
32
+ req = Rakit::File::ListRequest.new(
33
+ directory: opts[:directory],
34
+ recursive: opts[:recursive],
35
+ include_hidden: opts[:include_hidden],
36
+ config: Rakit::File::FileConfig.new(follow_symlinks: opts[:follow_symlinks])
37
+ )
38
+ result = Rakit::File.list(req)
39
+ render_list_result(result, opts[:format])
40
+ result.exit_code
41
+ end
42
+
43
+ def parse_list_argv(argv)
44
+ opts = { format: "console", recursive: false, include_hidden: false, follow_symlinks: false, directory: nil }
45
+ args = argv.dup
46
+ while (arg = args.shift)
47
+ case arg
48
+ when "--recursive" then opts[:recursive] = true
49
+ when "--include-hidden" then opts[:include_hidden] = true
50
+ when "--follow-symlinks" then opts[:follow_symlinks] = true
51
+ when "--format" then opts[:format] = args.shift || "console"
52
+ when /^--/
53
+ $stderr.puts "Unknown option: #{arg}"
54
+ opts[:error] = true
55
+ else
56
+ opts[:directory] = arg if opts[:directory].nil?
57
+ end
58
+ end
59
+ unless opts[:directory] && !opts[:directory].empty?
60
+ $stderr.puts "list requires <directory>"
61
+ opts[:error] = true
62
+ end
63
+ opts
64
+ end
65
+
66
+ def run_copy(argv)
67
+ opts = parse_copy_argv(argv)
68
+ return 1 if opts[:error]
69
+ req = Rakit::File::CopyRequest.new(
70
+ source: opts[:source],
71
+ destination: opts[:destination],
72
+ config: Rakit::File::FileConfig.new(
73
+ overwrite: opts[:overwrite],
74
+ create_directories: opts[:create_directories],
75
+ follow_symlinks: opts[:follow_symlinks]
76
+ )
77
+ )
78
+ result = Rakit::File.copy(req)
79
+ render_copy_result(result, opts[:format])
80
+ result.exit_code
81
+ end
82
+
83
+ def parse_copy_argv(argv)
84
+ opts = { format: "console", overwrite: false, create_directories: false, follow_symlinks: false, source: nil, destination: nil }
85
+ args = argv.dup
86
+ while (arg = args.shift)
87
+ case arg
88
+ when "--overwrite" then opts[:overwrite] = true
89
+ when "--create-directories" then opts[:create_directories] = true
90
+ when "--follow-symlinks" then opts[:follow_symlinks] = true
91
+ when "--format" then opts[:format] = args.shift || "console"
92
+ when /^--/
93
+ $stderr.puts "Unknown option: #{arg}"
94
+ opts[:error] = true
95
+ else
96
+ if opts[:source].nil?
97
+ opts[:source] = arg
98
+ elsif opts[:destination].nil?
99
+ opts[:destination] = arg
100
+ else
101
+ $stderr.puts "Unexpected argument: #{arg}"
102
+ opts[:error] = true
103
+ end
104
+ end
105
+ end
106
+ unless opts[:source] && opts[:destination]
107
+ $stderr.puts "copy requires <source> and <destination>"
108
+ opts[:error] = true
109
+ end
110
+ opts
111
+ end
112
+
113
+ def render_list_result(result, format)
114
+ $stderr.puts result.stderr if result.stderr && !result.stderr.empty? && !result.success
115
+ case format
116
+ when "json"
117
+ puts list_result_to_json(result)
118
+ when "proto-json"
119
+ puts Google::Protobuf.encode_json(result)
120
+ else
121
+ result.entries.each do |e|
122
+ puts "#{e.path}\t#{e.name}\t#{e.is_directory ? 'dir' : 'file'}"
123
+ end
124
+ end
125
+ end
126
+
127
+ def list_result_to_json(result)
128
+ h = {
129
+ success: result.success,
130
+ message: result.message.to_s,
131
+ entries: result.entries.map { |e| { path: e.path, name: e.name, is_directory: e.is_directory, is_symlink: e.is_symlink, size_bytes: e.size_bytes, modified_unix_ms: e.modified_unix_ms } },
132
+ exit_code: result.exit_code
133
+ }
134
+ JSON.generate(h)
135
+ end
136
+
137
+ def render_copy_result(result, format)
138
+ $stderr.puts result.stderr if result.stderr && !result.stderr.empty? && !result.success
139
+ case format
140
+ when "json"
141
+ puts copy_result_to_json(result)
142
+ when "proto-json"
143
+ puts Google::Protobuf.encode_json(result)
144
+ else
145
+ puts "Copied #{result.source} → #{result.destination}" if result.success
146
+ end
147
+ end
148
+
149
+ def copy_result_to_json(result)
150
+ h = {
151
+ success: result.success,
152
+ message: result.message.to_s,
153
+ source: result.source.to_s,
154
+ destination: result.destination.to_s,
155
+ exit_code: result.exit_code,
156
+ bytes_copied: result.bytes_copied
157
+ }
158
+ JSON.generate(h)
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "google/protobuf"
5
+ require "rakit/word_count"
6
+
7
+ module Rakit
8
+ module CLI
9
+ module WordCount
10
+ class << self
11
+ # @param argv [Array<String>] arguments after "word-count" / "word_count"
12
+ # @return [Integer] exit code
13
+ def run(argv)
14
+ opts = parse_argv(argv)
15
+ return 1 if opts[:error]
16
+
17
+ request = build_request(opts)
18
+ return 1 unless request
19
+
20
+ result = Rakit::WordCount.count(request)
21
+ render_result(result, opts[:format])
22
+ result.exit_code || (result.success ? 0 : 1)
23
+ end
24
+
25
+ private
26
+
27
+ def parse_argv(argv)
28
+ opts = {
29
+ format: "console",
30
+ case_insensitive: false,
31
+ split_camel_case: false,
32
+ split_snake_kebab: false,
33
+ min_token_length: 0,
34
+ top_n: 0,
35
+ stopwords: [],
36
+ json_keys: false,
37
+ stdin: false,
38
+ json_file: nil
39
+ }
40
+ args = argv.dup
41
+ while (arg = args.shift)
42
+ case arg
43
+ when "--json-keys" then opts[:json_keys] = true
44
+ when "--stdin" then opts[:stdin] = true
45
+ when "--format"
46
+ opts[:format] = args.shift || "console"
47
+ when "--case-insensitive" then opts[:case_insensitive] = true
48
+ when "--split-camel-case" then opts[:split_camel_case] = true
49
+ when "--split-snake-kebab" then opts[:split_snake_kebab] = true
50
+ when "--min-token-length"
51
+ opts[:min_token_length] = (args.shift || "0").to_i
52
+ when "--top"
53
+ opts[:top_n] = (args.shift || "0").to_i
54
+ when "--stopword"
55
+ opts[:stopwords] << args.shift if args[0]
56
+ when /^--/
57
+ $stderr.puts "Unknown option: #{arg}"
58
+ opts[:error] = true
59
+ else
60
+ opts[:json_file] = arg
61
+ end
62
+ end
63
+ opts
64
+ end
65
+
66
+ def build_request(opts)
67
+ unless opts[:json_keys]
68
+ $stderr.puts "word-count requires --json-keys for MVP"
69
+ return nil
70
+ end
71
+
72
+ gen = Rakit::Generated
73
+ config = gen::WordCountConfig.new(
74
+ case_insensitive: opts[:case_insensitive],
75
+ split_camel_case: opts[:split_camel_case],
76
+ split_snake_kebab: opts[:split_snake_kebab],
77
+ min_token_length: opts[:min_token_length],
78
+ stopwords: opts[:stopwords],
79
+ top_n: opts[:top_n]
80
+ )
81
+
82
+ if opts[:stdin]
83
+ json_str = $stdin.read
84
+ json = gen::JsonSource.new(inline_json: json_str)
85
+ elsif opts[:json_file] && !opts[:json_file].empty?
86
+ json = gen::JsonSource.new(json_file: opts[:json_file])
87
+ else
88
+ $stderr.puts "Provide a JSON file path or use --stdin"
89
+ return nil
90
+ end
91
+
92
+ gen::WordCountRequest.new(
93
+ config: config,
94
+ json: json,
95
+ mode: :JSON_WORD_COUNT_MODE_KEYS
96
+ )
97
+ end
98
+
99
+ def render_result(result, format)
100
+ case format
101
+ when "json"
102
+ puts result_to_json(result)
103
+ when "proto-json"
104
+ puts Google::Protobuf.encode_json(result)
105
+ else
106
+ render_console(result)
107
+ end
108
+ $stderr.puts result.stderr if result.stderr && !result.stderr.empty? && !result.success
109
+ end
110
+
111
+ def render_console(result)
112
+ result.counts.each do |tc|
113
+ puts "#{tc.token}\t#{tc.count}"
114
+ end
115
+ end
116
+
117
+ def result_to_json(result)
118
+ h = {
119
+ success: result.success,
120
+ message: result.message.to_s,
121
+ counts: result.counts.map { |tc| { token: tc.token, count: tc.count } },
122
+ exit_code: result.exit_code,
123
+ total_tokens: result.total_tokens,
124
+ unique_tokens: result.unique_tokens
125
+ }
126
+ JSON.generate(h)
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end