gromit 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 +4 -4
- data/README.md +20 -4
- data/Rakefile +1 -1
- data/app/controllers/gromit/gromit_controller.rb +15 -6
- data/lib/gromit/engine.rb +1 -0
- data/lib/gromit/markdown_parser.rb +6 -5
- data/lib/gromit/reindexer.rb +5 -10
- data/lib/gromit/uploader.rb +1 -5
- data/lib/gromit/version.rb +1 -1
- data/lib/gromit.rb +0 -1
- metadata +3 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c08834b2d4ab44b913db4ab7d38b09570afe1e379fe52c1cd0c373509b5bfd4
|
4
|
+
data.tar.gz: 603cbadb8f17fe8dea16ab04404f0f1fd619f0e13f1c400d66b1292906667b69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 503038957680864be947e60e00e2194f13fec7f4a6f64f40084d0adf4cc5fde72fd3016d23dfeb465a703bc870d4c1c952b5c3c8bf827f1bed5b1fffb3d29e06
|
7
|
+
data.tar.gz: 3fe22ab62a45597fc02cf9111deee1a23b29ecf906fd75c0c6026c1c51086bc70ab58f08af3de6605f505ddb7b1dd835ce2390990e6c61c98f49cf34c697ef0f
|
data/README.md
CHANGED
@@ -1,14 +1,19 @@
|
|
1
1
|
# Gromit
|
2
|
+
|
2
3
|
Your documentation search assitant
|
3
4
|
|
4
5
|
## Usage
|
5
6
|
|
6
|
-
Make sure to provide your OpenAI
|
7
|
-
|
8
|
-
|
7
|
+
Make sure to provide your OpenAI token using the `OPENAPI_ACCESS_TOKEN` environment variable.
|
8
|
+
|
9
|
+
To mount the Gromit engine in Rails 7, require the engine from your `Gemfile`:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem "gromit", require: "gromit/engine"
|
9
13
|
```
|
10
14
|
|
11
|
-
|
15
|
+
And add this line to your routes:
|
16
|
+
|
12
17
|
```ruby
|
13
18
|
Rails.application.routes.draw do
|
14
19
|
mount Gromit::Engine => "/"
|
@@ -16,6 +21,7 @@ end
|
|
16
21
|
```
|
17
22
|
|
18
23
|
Gromit provides the following routes:
|
24
|
+
|
19
25
|
```
|
20
26
|
Routes for Gromit::Engine:
|
21
27
|
healthcheck GET /healthcheck(.:format) gromit/gromit#healthcheck {:format=>:json}
|
@@ -24,11 +30,13 @@ healthcheck GET /healthcheck(.:format) gromit/gromit#healthcheck {:format=>:jso
|
|
24
30
|
```
|
25
31
|
|
26
32
|
To index your documentation locally you can use `gromit-reindexer`. This will update `redis-stack-server` running on your machine.
|
33
|
+
|
27
34
|
```bash
|
28
35
|
bundle exec gromit-reindexer -s /path/to/your/docs
|
29
36
|
```
|
30
37
|
|
31
38
|
To remotely upsert your documentation you can use `gromit-uploader`.
|
39
|
+
|
32
40
|
```bash
|
33
41
|
BASE_URL=https://gromit-rails.example.com bundle exec gromit-uploader -s /path/to/your/docs
|
34
42
|
```
|
@@ -37,6 +45,7 @@ For a working example of a Rails 7 application using Gromit check out:
|
|
37
45
|
https://github.com/releasehub-com/gromit-example
|
38
46
|
|
39
47
|
## Installation
|
48
|
+
|
40
49
|
Add this line to your application's Gemfile:
|
41
50
|
|
42
51
|
```ruby
|
@@ -44,17 +53,24 @@ gem "gromit"
|
|
44
53
|
```
|
45
54
|
|
46
55
|
And then execute:
|
56
|
+
|
47
57
|
```bash
|
48
58
|
$ bundle
|
49
59
|
```
|
50
60
|
|
51
61
|
Or install it yourself as:
|
62
|
+
|
52
63
|
```bash
|
53
64
|
$ gem install gromit
|
54
65
|
```
|
55
66
|
|
56
67
|
## Contributing
|
68
|
+
|
57
69
|
Contribution directions go here.
|
58
70
|
|
59
71
|
## License
|
72
|
+
|
60
73
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
74
|
+
|
75
|
+
---
|
76
|
+
Made with love by the folks @ [release.com](https://release.com)
|
data/Rakefile
CHANGED
@@ -2,6 +2,8 @@ require 'rejson'
|
|
2
2
|
|
3
3
|
module Gromit
|
4
4
|
class GromitController < ApplicationController
|
5
|
+
IM_A_TEAPOT = 418
|
6
|
+
|
5
7
|
skip_before_action :verify_authenticity_token
|
6
8
|
|
7
9
|
def healthcheck
|
@@ -16,14 +18,19 @@ module Gromit
|
|
16
18
|
|
17
19
|
# create the index if it's not already there
|
18
20
|
gromit.create_index
|
21
|
+
render json: { status: 'healthy', message: 'Redis connection is healthy' }
|
19
22
|
else
|
20
|
-
render json: { status: 'unhealthy', message: 'Redis connection is unhealthy' }
|
23
|
+
render json: { status: 'unhealthy', message: 'Redis connection is unhealthy' }, status: IM_A_TEAPOT
|
21
24
|
end
|
22
25
|
rescue Redis::CommandError, Redis::CannotConnectError => e
|
23
|
-
if e.
|
24
|
-
|
26
|
+
if e.is_a?(Redis::CommandError)
|
27
|
+
if e.message == "Index already exists"
|
28
|
+
render json: { status: 'healthy', message: 'Redis connection is healthy' }
|
29
|
+
else
|
30
|
+
render json: { status: 'unhealthy', message: "Unknown command error" }, status: IM_A_TEAPOT
|
31
|
+
end
|
25
32
|
else
|
26
|
-
render json: { status: 'unhealthy', message: "Redis connection error: #{e.message}" }
|
33
|
+
render json: { status: 'unhealthy', message: "Redis connection error: #{e.message}" }, status: IM_A_TEAPOT
|
27
34
|
end
|
28
35
|
end
|
29
36
|
end
|
@@ -31,7 +38,7 @@ module Gromit
|
|
31
38
|
def search
|
32
39
|
gromit = Gromit::Search.new
|
33
40
|
result = gromit.find_by_embedding(params[:embedding])
|
34
|
-
render json: result
|
41
|
+
render json: { data: result }
|
35
42
|
end
|
36
43
|
|
37
44
|
def upsert
|
@@ -43,8 +50,10 @@ module Gromit
|
|
43
50
|
# Extract the key and value from the request data
|
44
51
|
id = params[:id]
|
45
52
|
|
53
|
+
data = params.to_unsafe_h.deep_stringify_keys
|
54
|
+
|
46
55
|
# Upsert the record into the Redis database
|
47
|
-
gromit.redis.json_set("item:#{id}", Rejson::Path.root_path,
|
56
|
+
gromit.redis.json_set("item:#{id}", Rejson::Path.root_path.str_path, data.except("action", "controller"))
|
48
57
|
|
49
58
|
# Return a success response
|
50
59
|
render json: { status: 'success', message: "Record upserted successfully", key: "item:#{id}" }
|
data/lib/gromit/engine.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
require 'active_support/inflector/methods'
|
1
2
|
|
2
3
|
class Gromit::MarkdownParser
|
3
4
|
attr_reader :sections, :file_path
|
4
5
|
|
5
|
-
class << self
|
6
|
+
class << self
|
6
7
|
|
7
8
|
def redis
|
8
9
|
@@redis ||= Redis.new(host: ENV.fetch("REDIS_HOST") { "127.0.0.1" }, port: ENV.fetch("REDIS_PORT") { "6379" }.to_i)
|
@@ -89,14 +90,14 @@ class Gromit::MarkdownParser
|
|
89
90
|
|
90
91
|
# remove the .md extension from the end of the URLs from gitbook
|
91
92
|
file.gsub!(/(\[[^\]]+?\])\((.*?)\.md([#a-z0-9]*)\)/) do |match|
|
92
|
-
"#{$1}(#{$2}#{$3})"
|
93
|
+
"#{$1}(#{$2}#{$3})"
|
93
94
|
end
|
94
95
|
|
95
|
-
# handle "mentions"
|
96
|
+
# handle "mentions"
|
96
97
|
file.gsub!(/\[([^\]]+?).md\]\((.*?)\.md([#a-z0-9]*) "mention"\)/) do |match|
|
97
98
|
link = "#{$2}#{$3}"
|
98
|
-
title = $1.gsub("-", ' ')
|
99
|
-
"[#{title}](#{link})"
|
99
|
+
title = ActiveSupport::Inflector.titleize($1.gsub("-", ' '))
|
100
|
+
"[#{title}](#{link})"
|
100
101
|
end
|
101
102
|
|
102
103
|
# convert gitbook hints to admonitions
|
data/lib/gromit/reindexer.rb
CHANGED
@@ -1,16 +1,10 @@
|
|
1
1
|
require 'bundler/setup'
|
2
2
|
require 'openai'
|
3
|
-
require 'dotenv'
|
4
3
|
require 'optparse'
|
5
4
|
require 'redis'
|
6
5
|
require 'rejson'
|
7
|
-
require 'active_support/all'
|
8
|
-
|
9
6
|
require_relative 'markdown_parser'
|
10
7
|
|
11
|
-
Dotenv.load
|
12
|
-
|
13
|
-
|
14
8
|
class Gromit::Reindexer
|
15
9
|
attr_accessor :redis
|
16
10
|
|
@@ -24,7 +18,7 @@ class Gromit::Reindexer
|
|
24
18
|
options[:source_dir] = source_dir
|
25
19
|
end
|
26
20
|
|
27
|
-
opts.on('-d', '--drop', 'Drop and create index before reindexing') do
|
21
|
+
opts.on('-d', '--drop', 'Drop and create index before reindexing') do
|
28
22
|
options[:drop] = true
|
29
23
|
end
|
30
24
|
|
@@ -38,14 +32,14 @@ class Gromit::Reindexer
|
|
38
32
|
|
39
33
|
# Instantiate the ToMkDocs class and perform the conversion
|
40
34
|
reindexer = Gromit::Reindexer.new
|
41
|
-
reindexer.run(options[:source_dir], drop: options[:drop])
|
35
|
+
reindexer.run(options[:source_dir], drop: options[:drop])
|
42
36
|
|
43
37
|
puts "Reindexer completed successfully."
|
44
38
|
end
|
45
39
|
end
|
46
40
|
|
47
41
|
def initialize
|
48
|
-
@redis ||=
|
42
|
+
@redis ||= Gromit::MarkdownParser.redis
|
49
43
|
end
|
50
44
|
|
51
45
|
def run(directory = nil, drop: false)
|
@@ -55,11 +49,12 @@ class Gromit::Reindexer
|
|
55
49
|
gromit.recreate_index
|
56
50
|
end
|
57
51
|
|
52
|
+
#TODO do we really want david's examples as the default here?
|
58
53
|
directory ||= ENV.fetch("DOCS_DIRECTORY") { "/Users/david/development/docs/examples" }
|
59
54
|
sections = Gromit::MarkdownParser.process(directory)
|
60
55
|
sections.each do |section|
|
61
56
|
puts "indexing: #{section[:file]} section: #{section[:section_title]}"
|
62
|
-
data = section.
|
57
|
+
data = section.transform_keys(&:to_s)
|
63
58
|
id = data['id']
|
64
59
|
gromit.redis.json_set("item:#{id}", Rejson::Path.root_path, data)
|
65
60
|
end
|
data/lib/gromit/uploader.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
1
|
require 'bundler/setup'
|
2
2
|
require 'openai'
|
3
3
|
require 'httparty'
|
4
|
-
require 'dotenv'
|
5
4
|
require 'pathname'
|
6
5
|
require 'optparse'
|
7
6
|
|
8
7
|
require_relative 'markdown_parser'
|
9
8
|
|
10
|
-
Dotenv.load
|
11
|
-
|
12
|
-
|
13
9
|
class Gromit::Uploader
|
14
10
|
|
15
11
|
class << self
|
@@ -25,7 +21,7 @@ class Gromit::Uploader
|
|
25
21
|
end.parse!
|
26
22
|
|
27
23
|
path = Pathname.new(options.fetch(:source_dir, ''))
|
28
|
-
|
24
|
+
|
29
25
|
unless path.exist?
|
30
26
|
puts "Error: The source directory (-s or --source) doesn't exist or is not specified."
|
31
27
|
exit 1
|
data/lib/gromit/version.rb
CHANGED
data/lib/gromit.rb
CHANGED
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gromit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Giffin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rails
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 7.0.1
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 7.0.1
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: redis
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|