add ruby support for semantic search
This commit is contained in:
parent
a5dd8dd0a9
commit
ca4e21881e
5 changed files with 256 additions and 0 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -6689,6 +6689,7 @@ dependencies = [
|
|||
"tree-sitter-elixir 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tree-sitter-json 0.19.0",
|
||||
"tree-sitter-lua",
|
||||
"tree-sitter-ruby",
|
||||
"tree-sitter-rust",
|
||||
"tree-sitter-toml 0.20.0",
|
||||
"tree-sitter-typescript 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
|
@ -61,3 +61,4 @@ tree-sitter-toml = "*"
|
|||
tree-sitter-cpp = "*"
|
||||
tree-sitter-elixir = "*"
|
||||
tree-sitter-lua = "*"
|
||||
tree-sitter-ruby = "*"
|
||||
|
|
|
@ -827,6 +827,196 @@ async fn test_code_context_retrieval_cpp() {
|
|||
);
|
||||
}
|
||||
|
||||
#[gpui::test]
|
||||
async fn test_code_context_retrieval_ruby() {
|
||||
let language = ruby_lang();
|
||||
let mut retriever = CodeContextRetriever::new();
|
||||
|
||||
let text = r#"
|
||||
# This concern is inspired by "sudo mode" on GitHub. It
|
||||
# is a way to re-authenticate a user before allowing them
|
||||
# to see or perform an action.
|
||||
#
|
||||
# Add `before_action :require_challenge!` to actions you
|
||||
# want to protect.
|
||||
#
|
||||
# The user will be shown a page to enter the challenge (which
|
||||
# is either the password, or just the username when no
|
||||
# password exists). Upon passing, there is a grace period
|
||||
# during which no challenge will be asked from the user.
|
||||
#
|
||||
# Accessing challenge-protected resources during the grace
|
||||
# period will refresh the grace period.
|
||||
module ChallengableConcern
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
CHALLENGE_TIMEOUT = 1.hour.freeze
|
||||
|
||||
def require_challenge!
|
||||
return if skip_challenge?
|
||||
|
||||
if challenge_passed_recently?
|
||||
session[:challenge_passed_at] = Time.now.utc
|
||||
return
|
||||
end
|
||||
|
||||
@challenge = Form::Challenge.new(return_to: request.url)
|
||||
|
||||
if params.key?(:form_challenge)
|
||||
if challenge_passed?
|
||||
session[:challenge_passed_at] = Time.now.utc
|
||||
else
|
||||
flash.now[:alert] = I18n.t('challenge.invalid_password')
|
||||
render_challenge
|
||||
end
|
||||
else
|
||||
render_challenge
|
||||
end
|
||||
end
|
||||
|
||||
def challenge_passed?
|
||||
current_user.valid_password?(challenge_params[:current_password])
|
||||
end
|
||||
end
|
||||
|
||||
class Animal
|
||||
include Comparable
|
||||
|
||||
attr_reader :legs
|
||||
|
||||
def initialize(name, legs)
|
||||
@name, @legs = name, legs
|
||||
end
|
||||
|
||||
def <=>(other)
|
||||
legs <=> other.legs
|
||||
end
|
||||
end
|
||||
|
||||
# Singleton method for car object
|
||||
def car.wheels
|
||||
puts "There are four wheels"
|
||||
end"#
|
||||
.unindent();
|
||||
|
||||
let documents = retriever.parse_file(&text, language.clone()).unwrap();
|
||||
|
||||
assert_documents_eq(
|
||||
&documents,
|
||||
&[
|
||||
(
|
||||
r#"
|
||||
# This concern is inspired by "sudo mode" on GitHub. It
|
||||
# is a way to re-authenticate a user before allowing them
|
||||
# to see or perform an action.
|
||||
#
|
||||
# Add `before_action :require_challenge!` to actions you
|
||||
# want to protect.
|
||||
#
|
||||
# The user will be shown a page to enter the challenge (which
|
||||
# is either the password, or just the username when no
|
||||
# password exists). Upon passing, there is a grace period
|
||||
# during which no challenge will be asked from the user.
|
||||
#
|
||||
# Accessing challenge-protected resources during the grace
|
||||
# period will refresh the grace period.
|
||||
module ChallengableConcern
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
CHALLENGE_TIMEOUT = 1.hour.freeze
|
||||
|
||||
def require_challenge!
|
||||
# ...
|
||||
end
|
||||
|
||||
def challenge_passed?
|
||||
# ...
|
||||
end
|
||||
end"#
|
||||
.unindent(),
|
||||
558,
|
||||
),
|
||||
(
|
||||
r#"
|
||||
def require_challenge!
|
||||
return if skip_challenge?
|
||||
|
||||
if challenge_passed_recently?
|
||||
session[:challenge_passed_at] = Time.now.utc
|
||||
return
|
||||
end
|
||||
|
||||
@challenge = Form::Challenge.new(return_to: request.url)
|
||||
|
||||
if params.key?(:form_challenge)
|
||||
if challenge_passed?
|
||||
session[:challenge_passed_at] = Time.now.utc
|
||||
else
|
||||
flash.now[:alert] = I18n.t('challenge.invalid_password')
|
||||
render_challenge
|
||||
end
|
||||
else
|
||||
render_challenge
|
||||
end
|
||||
end"#
|
||||
.unindent(),
|
||||
663,
|
||||
),
|
||||
(
|
||||
r#"
|
||||
def challenge_passed?
|
||||
current_user.valid_password?(challenge_params[:current_password])
|
||||
end"#
|
||||
.unindent(),
|
||||
1254,
|
||||
),
|
||||
(
|
||||
r#"
|
||||
class Animal
|
||||
include Comparable
|
||||
|
||||
attr_reader :legs
|
||||
|
||||
def initialize(name, legs)
|
||||
# ...
|
||||
end
|
||||
|
||||
def <=>(other)
|
||||
# ...
|
||||
end
|
||||
end"#
|
||||
.unindent(),
|
||||
1363,
|
||||
),
|
||||
(
|
||||
r#"
|
||||
def initialize(name, legs)
|
||||
@name, @legs = name, legs
|
||||
end"#
|
||||
.unindent(),
|
||||
1427,
|
||||
),
|
||||
(
|
||||
r#"
|
||||
def <=>(other)
|
||||
legs <=> other.legs
|
||||
end"#
|
||||
.unindent(),
|
||||
1501,
|
||||
),
|
||||
(
|
||||
r#"
|
||||
# Singleton method for car object
|
||||
def car.wheels
|
||||
puts "There are four wheels"
|
||||
end"#
|
||||
.unindent(),
|
||||
1591,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[gpui::test]
|
||||
fn test_dot_product(mut rng: StdRng) {
|
||||
assert_eq!(dot(&[1., 0., 0., 0., 0.], &[0., 1., 0., 0., 0.]), 0.);
|
||||
|
@ -1186,6 +1376,47 @@ fn lua_lang() -> Arc<Language> {
|
|||
)
|
||||
}
|
||||
|
||||
fn ruby_lang() -> Arc<Language> {
|
||||
Arc::new(
|
||||
Language::new(
|
||||
LanguageConfig {
|
||||
name: "Ruby".into(),
|
||||
path_suffixes: vec!["rb".into()],
|
||||
collapsed_placeholder: "# ...".to_string(),
|
||||
..Default::default()
|
||||
},
|
||||
Some(tree_sitter_ruby::language()),
|
||||
)
|
||||
.with_embedding_query(
|
||||
r#"
|
||||
(
|
||||
(comment)* @context
|
||||
.
|
||||
[
|
||||
(module
|
||||
"module" @name
|
||||
name: (_) @name)
|
||||
(method
|
||||
"def" @name
|
||||
name: (_) @name
|
||||
body: (body_statement) @collapse)
|
||||
(class
|
||||
"class" @name
|
||||
name: (_) @name)
|
||||
(singleton_method
|
||||
"def" @name
|
||||
object: (_) @name
|
||||
"." @name
|
||||
name: (_) @name
|
||||
body: (body_statement) @collapse)
|
||||
] @item
|
||||
)
|
||||
"#,
|
||||
)
|
||||
.unwrap(),
|
||||
)
|
||||
}
|
||||
|
||||
fn elixir_lang() -> Arc<Language> {
|
||||
Arc::new(
|
||||
Language::new(
|
||||
|
|
|
@ -10,3 +10,4 @@ brackets = [
|
|||
{ start = "\"", end = "\"", close = true, newline = false, not_in = ["comment", "string"] },
|
||||
{ start = "'", end = "'", close = true, newline = false, not_in = ["comment", "string"] },
|
||||
]
|
||||
collapsed_placeholder = "# ..."
|
||||
|
|
22
crates/zed/src/languages/ruby/embedding.scm
Normal file
22
crates/zed/src/languages/ruby/embedding.scm
Normal file
|
@ -0,0 +1,22 @@
|
|||
(
|
||||
(comment)* @context
|
||||
.
|
||||
[
|
||||
(module
|
||||
"module" @name
|
||||
name: (_) @name)
|
||||
(method
|
||||
"def" @name
|
||||
name: (_) @name
|
||||
body: (body_statement) @collapse)
|
||||
(class
|
||||
"class" @name
|
||||
name: (_) @name)
|
||||
(singleton_method
|
||||
"def" @name
|
||||
object: (_) @name
|
||||
"." @name
|
||||
name: (_) @name
|
||||
body: (body_statement) @collapse)
|
||||
] @item
|
||||
)
|
Loading…
Add table
Add a link
Reference in a new issue