matheus 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f58d7287ef588ecd9a19da562f85a0c94cecb1911b07c1b3e079b620c37d7de
4
- data.tar.gz: f45c9ed2d4d192ead57a91562eecc52153c0dd35b6241fab31afcafa73050add
3
+ metadata.gz: 8f0188994d160b9cfc3ce6ab06610e4f42102ddf828dc01e1c917cdf02ac77c6
4
+ data.tar.gz: 0cf90a3177f25047f2b15fcf5198eb0de8ea3439116107576b7fdd7daab5bddf
5
5
  SHA512:
6
- metadata.gz: c2ab16abdc86aedba2c0ef30f1614091e17165d11bad1d8c95d3170619104e7e6a62c33785cc34abe516e3d3929434a5eac7f77550f17b2c639174c1d23aba03
7
- data.tar.gz: 0a241ef204280b9a5e08f379d82823bd670a9fd352e20fe633055e0a788ee1adaa15af5c7f8956c5c2bc1e032089eff502973e21839d6b318f166d7a455a0eba
6
+ metadata.gz: 364f6273dfdbc464d491b3ce29d670351c5c4c007524c0aa6ad46e1d44e810bf4e7dfa083821a20ae2f0058d01e45a601f7b68c70b9d42ed156df3e6205af895
7
+ data.tar.gz: d8c641cbaeca884aff2d5782b0abbe720ddaf08af0057676d85ea9bdb9bb0adff33f81c8b158d8a18ba32879dd2f7e30f667c9e400ca4e9862befcae44409366
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.4.0]
4
+
5
+ _Released 2024-10-02_
6
+
7
+ - Save past questions with `q` and retrieve them with the `qs` command.
8
+ - Reuse answers for the same questions.
9
+
3
10
  ## [0.3.0]
4
11
 
5
12
  _Released 2024-08-27_
data/README.md CHANGED
@@ -11,7 +11,7 @@ A bunch of CLI tools I made for my own use.
11
11
  ### `alert-me`
12
12
 
13
13
  ```sh
14
- $ alert-me sleep 1 && echo "Done!"
14
+ $ alert-me 'sleep 1 && echo "Done!"'
15
15
  Done!
16
16
  # plays a sound after the command finishes
17
17
  ```
data/Rakefile CHANGED
@@ -45,3 +45,5 @@ end
45
45
 
46
46
  # Ensure the generate_executables task runs before the build task
47
47
  task build: :generate_executables
48
+ # Ensure tests are run before releasing the gem
49
+ task release: :spec
data/exe/qs ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift("#{__dir__}/../lib")
4
+
5
+ require "matheus"
6
+
7
+ Matheus::Qs.call ARGV
@@ -1,11 +1,10 @@
1
1
  module Matheus
2
2
  class AlertMe < Command
3
3
  # Usage:
4
- # $ alert-me sleep 1 && echo 'Done!'
4
+ # $ alert-me "sleep 1 && echo 'Done!'"
5
5
  # Runs the command and plays a sound based on its success or failure after it finishes.
6
6
  def call(*args)
7
- command = args.join(" ")
8
- if system(command)
7
+ if system(args.join(" "))
9
8
  system("afplay /System/Library/Sounds/Glass.aiff")
10
9
  else
11
10
  system("afplay /System/Library/Sounds/Sosumi.aiff")
data/lib/matheus/q.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require "openai"
2
2
  require "tty-markdown"
3
+ require "tty-prompt"
4
+ require "json"
3
5
 
4
6
  module Matheus
5
7
  # Usage:
@@ -9,7 +11,17 @@ module Matheus
9
11
  BASE_PROMPT = "Answer this question in a short and concise way. You can use markdown in the response: "
10
12
 
11
13
  def call(question)
12
- ask_llm(question).then { print_markdown _1 }
14
+ question = question.join(" ")
15
+ existing_entry = search_question_in_history(question)
16
+
17
+ if existing_entry && use_existing_answer?
18
+ answer = existing_entry['answer']
19
+ else
20
+ answer = ask_llm(question)
21
+ save_qa(question, answer)
22
+ end
23
+
24
+ print_markdown(answer)
13
25
  rescue => e
14
26
  Failure(e.message)
15
27
  end
@@ -40,5 +52,26 @@ module Matheus
40
52
  def client
41
53
  OpenAI::Client.new(access_token: ENV.fetch("OPENAI_API_KEY"))
42
54
  end
55
+
56
+ def save_qa(question, answer)
57
+ history = load_history
58
+ history << { question:, answer:, timestamp: Time.now.to_s }
59
+ File.write(QUESTION_HISTORY_FILE, JSON.pretty_generate(history))
60
+ end
61
+
62
+ def load_history
63
+ File.exist?(QUESTION_HISTORY_FILE) ? JSON.parse(File.read(QUESTION_HISTORY_FILE)) : []
64
+ end
65
+
66
+ def search_question_in_history(question)
67
+ load_history.reverse.find { |entry| entry['question'].downcase.strip == question.downcase.strip }
68
+ end
69
+
70
+ def use_existing_answer?
71
+ prompt = TTY::Prompt.new
72
+ prompt.yes?("An existing answer was found. Do you want to use it?") do |q|
73
+ q.default true
74
+ end
75
+ end
43
76
  end
44
77
  end
data/lib/matheus/qs.rb ADDED
@@ -0,0 +1,40 @@
1
+ require "json"
2
+ require "tty-prompt"
3
+ require "tty-markdown"
4
+
5
+ module Matheus
6
+ # Usage:
7
+ # $ qs
8
+ # Lists the questions asked and their answers.
9
+ class Qs < Command
10
+ def call(_)
11
+ return puts "No questions found in history." if history.empty?
12
+
13
+ answer = prompt.select("Question:", choices, per_page: 10)
14
+ print_markdown(answer)
15
+ rescue => e
16
+ Failure(e.message)
17
+ end
18
+
19
+ private
20
+ def choices
21
+ history.map do |entry|
22
+ {entry['question'] => entry['answer'] }
23
+ end
24
+ end
25
+
26
+
27
+ def history
28
+ @history ||= File.exist?(QUESTION_HISTORY_FILE) ? JSON.parse(File.read(QUESTION_HISTORY_FILE)) : []
29
+ end
30
+
31
+ def prompt
32
+ @prompt ||= TTY::Prompt.new(interrupt: :exit)
33
+ end
34
+
35
+ def print_markdown(answer)
36
+ puts
37
+ puts TTY::Markdown.parse(answer)
38
+ end
39
+ end
40
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Matheus
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/matheus.rb CHANGED
@@ -9,4 +9,5 @@ Dotenv.load("~/.env")
9
9
  Zeitwerk::Loader.for_gem.setup
10
10
 
11
11
  module Matheus
12
+ QUESTION_HISTORY_FILE = File.expand_path("~/.qa_history.json")
12
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: matheus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matheus Richard
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-27 00:00:00.000000000 Z
11
+ date: 2024-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.7.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-table
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.12.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.12.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: tty-prompt
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.23.1
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.23.1
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: dotenv
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -88,6 +116,7 @@ executables:
88
116
  - date-of-last
89
117
  - puts
90
118
  - q
119
+ - qs
91
120
  extensions: []
92
121
  extra_rdoc_files: []
93
122
  files:
@@ -101,12 +130,14 @@ files:
101
130
  - exe/date-of-last
102
131
  - exe/puts
103
132
  - exe/q
133
+ - exe/qs
104
134
  - lib/matheus.rb
105
135
  - lib/matheus/alert_me.rb
106
136
  - lib/matheus/command.rb
107
137
  - lib/matheus/date_of_last.rb
108
138
  - lib/matheus/puts.rb
109
139
  - lib/matheus/q.rb
140
+ - lib/matheus/qs.rb
110
141
  - lib/matheus/result.rb
111
142
  - lib/matheus/string_format.rb
112
143
  - lib/matheus/version.rb