Merge branch 'master' into headless-api

This commit is contained in:
boatbomber 2025-03-15 14:28:53 -07:00 • committed by GitHub
commit cb451c8d21
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 89 additions and 84 deletions

View file

@ -20,6 +20,10 @@ fn snapshot_from_fs_path(path: &Path) -> io::Result<VfsSnapshot> {
let file_name = entry.file_name().to_str().unwrap().to_owned();
if file_name.starts_with(".git") {
continue;
}
// We can skip any TestEZ test files since they aren't necessary for
// the plugin to run.
if file_name.ends_with(".spec.lua") || file_name.ends_with(".spec.luau") {

View file

@ -5,19 +5,13 @@ use serde::Serialize;
/// Enables redacting any value that serializes as a string.
///
/// Used for transforming Rojo instance IDs into something deterministic.
#[derive(Default)]
pub struct RedactionMap {
ids: HashMap<String, usize>,
last_id: usize,
}
impl RedactionMap {
pub fn new() -> Self {
Self {
ids: HashMap::new(),
last_id: 0,
}
}
pub fn get_redacted_value(&self, id: impl ToString) -> Option<String> {
let id = id.to_string();

View file

@ -57,8 +57,9 @@ function Checkbox:render()
end,
}, {
StateTip = e(Tooltip.Trigger, {
text = (if self.props.locked then "[LOCKED] " else "")
.. (if self.props.active then "Enabled" else "Disabled"),
text = (if self.props.locked
then (self.props.lockedTooltip or "(Cannot be changed right now)") .. "\n"
else "") .. (if self.props.active then "Enabled" else "Disabled"),
}),
Active = e(SlicedImage, {

View file

@ -12,6 +12,7 @@ local getTextBoundsAsync = require(Plugin.App.getTextBoundsAsync)
local SlicedImage = require(script.Parent.SlicedImage)
local ScrollingFrame = require(script.Parent.ScrollingFrame)
local Tooltip = require(script.Parent.Tooltip)
local e = Roact.createElement
@ -119,6 +120,12 @@ function Dropdown:render()
end),
BackgroundTransparency = 1,
}, {
StateTip = if self.props.locked
then e(Tooltip.Trigger, {
text = self.props.lockedTooltip or "(Cannot be changed right now)",
})
else nil,
}),
Active = e("TextLabel", {
Size = UDim2.new(1, -30, 1, 0),

View file

@ -23,11 +23,8 @@ local TooltipContext = Roact.createContext({})
local function Popup(props)
return Theme.with(function(theme)
local textXSpace = math.min(props.parentSize.X, 120)
local textBounds = Vector2.new(
textXSpace,
getTextBoundsAsync(props.Text, theme.Font.Main, theme.TextSize.Medium, textXSpace).Y
)
local textXSpace = math.min(props.parentSize.X, 250) - TEXT_PADDING.X
local textBounds = getTextBoundsAsync(props.Text, theme.Font.Main, theme.TextSize.Medium, textXSpace)
local contentSize = textBounds + TEXT_PADDING + (Vector2.one * 2)
local trigger = props.Trigger:getValue()
@ -39,7 +36,7 @@ local function Popup(props)
-- If there's not enough space below, and there's more space above, then show the tooltip above the trigger
local displayAbove = spaceBelow < contentSize.Y and spaceAbove > spaceBelow
local X = math.clamp(props.Position.X - X_OFFSET, 0, props.parentSize.X - contentSize.X)
local X = math.clamp(props.Position.X - X_OFFSET, 0, math.max(props.parentSize.X - contentSize.X, 1))
local Y = 0
if displayAbove then

View file

@ -102,6 +102,7 @@ function Setting:render()
then self.props.input
elseif self.props.options ~= nil then e(Dropdown, {
locked = self.props.locked,
lockedTooltip = self.props.lockedTooltip,
options = self.props.options,
active = self.state.setting,
transparency = self.props.transparency,
@ -111,6 +112,7 @@ function Setting:render()
})
else e(Checkbox, {
locked = self.props.locked,
lockedTooltip = self.props.lockedTooltip,
active = self.state.setting,
transparency = self.props.transparency,
onClick = function()

View file

@ -240,6 +240,7 @@ function SettingsPage:render()
name = "Two-Way Sync",
description = "Editing files in Studio will sync them into the filesystem",
locked = self.props.syncActive,
lockedTooltip = "(Cannot change while currently syncing. Disconnect first.)",
tag = "unstable",
transparency = self.props.transparency,
layoutOrder = layoutIncrement(),

View file

@ -22,6 +22,7 @@ trait FmtLua {
}
}
#[allow(dead_code)]
struct DisplayLua<T>(T);
impl<T> fmt::Display for DisplayLua<T>

View file

@ -19,10 +19,10 @@ impl<K: Hash + Eq, V: Eq> MultiMap<K, V> {
}
}
pub fn get<Q: ?Sized>(&self, k: &Q) -> &[V]
pub fn get<Q>(&self, k: &Q) -> &[V]
where
K: Borrow<Q>,
Q: Hash + Eq,
Q: Hash + Eq + ?Sized,
{
self.inner.get(k).map(Vec::as_slice).unwrap_or(&[])
}

View file

@ -230,7 +230,7 @@ impl Project {
io::ErrorKind::NotFound => Error::NoProjectFound {
path: project_path.to_path_buf(),
},
_ => return e.into(),
_ => e.into(),
})?;
Ok(Some(Self::load_from_slice(&contents, project_path, None)?))
@ -250,7 +250,7 @@ impl Project {
io::ErrorKind::NotFound => Error::NoProjectFound {
path: project_path.to_path_buf(),
},
_ => return e.into(),
_ => e.into(),
})?;
Ok(Self::load_from_slice(

View file

@ -313,7 +313,7 @@ mod test {
// addition of a prop named Self, which is a self-referential Ref.
let snapshot_id = Ref::new();
let snapshot = InstanceSnapshot {
snapshot_id: snapshot_id,
snapshot_id,
properties: [("Self".to_owned(), Variant::Ref(snapshot_id))].into(),
metadata: Default::default(),
@ -351,7 +351,7 @@ mod test {
// This patch describes the existing instance with a new child added.
let snapshot_id = Ref::new();
let snapshot = InstanceSnapshot {
snapshot_id: snapshot_id,
snapshot_id,
children: vec![InstanceSnapshot {
properties: [("Self".to_owned(), Variant::Ref(snapshot_id))].into(),

View file

@ -9,7 +9,7 @@ use crate::{
#[test]
fn set_name_and_class_name() {
let mut redactions = RedactionMap::new();
let mut redactions = RedactionMap::default();
let mut tree = empty_tree();
intern_tree(&tree, &mut redactions);
@ -36,7 +36,7 @@ fn set_name_and_class_name() {
#[test]
fn add_property() {
let mut redactions = RedactionMap::new();
let mut redactions = RedactionMap::default();
let mut tree = empty_tree();
intern_tree(&tree, &mut redactions);
@ -63,7 +63,7 @@ fn add_property() {
#[test]
fn remove_property() {
let mut redactions = RedactionMap::new();
let mut redactions = RedactionMap::default();
let mut tree = empty_tree();
intern_tree(&tree, &mut redactions);
@ -85,7 +85,7 @@ fn remove_property() {
id: tree.get_root_id(),
changed_name: None,
changed_class_name: None,
changed_properties: [("Foo".to_owned(), None).into()].into(),
changed_properties: [("Foo".to_owned(), None)].into(),
changed_metadata: None,
}],
..Default::default()

View file

@ -9,7 +9,7 @@ use crate::snapshot::{compute_patch_set, InstanceSnapshot, RojoTree};
#[test]
fn set_name_and_class_name() {
let mut redactions = RedactionMap::new();
let mut redactions = RedactionMap::default();
let tree = empty_tree();
redactions.intern(tree.get_root_id());
@ -31,7 +31,7 @@ fn set_name_and_class_name() {
#[test]
fn set_property() {
let mut redactions = RedactionMap::new();
let mut redactions = RedactionMap::default();
let tree = empty_tree();
redactions.intern(tree.get_root_id());
@ -53,7 +53,7 @@ fn set_property() {
#[test]
fn remove_property() {
let mut redactions = RedactionMap::new();
let mut redactions = RedactionMap::default();
let mut tree = empty_tree();
redactions.intern(tree.get_root_id());
@ -84,7 +84,7 @@ fn remove_property() {
#[test]
fn add_child() {
let mut redactions = RedactionMap::new();
let mut redactions = RedactionMap::default();
let tree = empty_tree();
redactions.intern(tree.get_root_id());
@ -113,7 +113,7 @@ fn add_child() {
#[test]
fn remove_child() {
let mut redactions = RedactionMap::new();
let mut redactions = RedactionMap::default();
let mut tree = empty_tree();
redactions.intern(tree.get_root_id());

View file

@ -148,7 +148,7 @@ impl RojoTree {
// We need to uphold the invariant that each ID can only map
// to one referent.
if let Some(new) = &metadata.specified_id {
if self.specified_id_to_refs.get(new).len() > 0 {
if !self.specified_id_to_refs.get(new).is_empty() {
log::error!("Duplicate user-specified referent '{new}'");
}
@ -206,7 +206,7 @@ impl RojoTree {
}
if let Some(specified_id) = &metadata.specified_id {
if self.specified_id_to_refs.get(specified_id).len() > 0 {
if !self.specified_id_to_refs.get(specified_id).is_empty() {
log::error!("Duplicate user-specified referent '{specified_id}'");
}

View file

@ -177,11 +177,11 @@ Ack,Ack!,,An exclamation of despair,¡Ay!"#,
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_csv(
&InstanceContext::default(),
&mut vfs,
&vfs,
Path::new("/foo.csv"),
"foo",
)
@ -209,11 +209,11 @@ Ack,Ack!,,An exclamation of despair,¡Ay!"#,
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_csv(
&InstanceContext::default(),
&mut vfs,
&vfs,
Path::new("/foo.csv"),
"foo",
)

View file

@ -116,12 +116,11 @@ mod test {
imfs.load_snapshot("/foo", VfsSnapshot::empty_dir())
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot =
snapshot_dir(&InstanceContext::default(), &mut vfs, Path::new("/foo"))
.unwrap()
.unwrap();
let instance_snapshot = snapshot_dir(&InstanceContext::default(), &vfs, Path::new("/foo"))
.unwrap()
.unwrap();
insta::assert_yaml_snapshot!(instance_snapshot);
}
@ -135,12 +134,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot =
snapshot_dir(&InstanceContext::default(), &mut vfs, Path::new("/foo"))
.unwrap()
.unwrap();
let instance_snapshot = snapshot_dir(&InstanceContext::default(), &vfs, Path::new("/foo"))
.unwrap()
.unwrap();
insta::assert_yaml_snapshot!(instance_snapshot);
}

View file

@ -98,11 +98,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs.clone());
let vfs = Vfs::new(imfs.clone());
let instance_snapshot = snapshot_json(
&InstanceContext::default(),
&mut vfs,
&vfs,
Path::new("/foo.json"),
"foo",
)

View file

@ -124,11 +124,11 @@ mod test {
imfs.load_snapshot("/foo.lua", VfsSnapshot::file("Hello there!"))
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(true)),
&mut vfs,
&vfs,
Path::new("/foo.lua"),
"foo",
ScriptType::Module,
@ -147,11 +147,11 @@ mod test {
imfs.load_snapshot("/foo.lua", VfsSnapshot::file("Hello there!"))
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(false)),
&mut vfs,
&vfs,
Path::new("/foo.lua"),
"foo",
ScriptType::Module,
@ -170,11 +170,11 @@ mod test {
imfs.load_snapshot("/foo.server.lua", VfsSnapshot::file("Hello there!"))
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(true)),
&mut vfs,
&vfs,
Path::new("/foo.server.lua"),
"foo",
ScriptType::Server,
@ -193,11 +193,11 @@ mod test {
imfs.load_snapshot("/foo.server.lua", VfsSnapshot::file("Hello there!"))
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(false)),
&mut vfs,
&vfs,
Path::new("/foo.server.lua"),
"foo",
ScriptType::Server,
@ -216,11 +216,11 @@ mod test {
imfs.load_snapshot("/foo.client.lua", VfsSnapshot::file("Hello there!"))
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(true)),
&mut vfs,
&vfs,
Path::new("/foo.client.lua"),
"foo",
ScriptType::Client,
@ -239,11 +239,11 @@ mod test {
imfs.load_snapshot("/foo.client.lua", VfsSnapshot::file("Hello there!"))
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(false)),
&mut vfs,
&vfs,
Path::new("/foo.client.lua"),
"foo",
ScriptType::Client,
@ -266,11 +266,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(true)),
&mut vfs,
&vfs,
Path::new("/root"),
"root",
ScriptType::Module,
@ -300,11 +300,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(true)),
&mut vfs,
&vfs,
Path::new("/foo.lua"),
"foo",
ScriptType::Module,
@ -334,11 +334,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(false)),
&mut vfs,
&vfs,
Path::new("/foo.lua"),
"foo",
ScriptType::Module,
@ -368,11 +368,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(true)),
&mut vfs,
&vfs,
Path::new("/foo.server.lua"),
"foo",
ScriptType::Server,
@ -402,11 +402,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(false)),
&mut vfs,
&vfs,
Path::new("/foo.server.lua"),
"foo",
ScriptType::Server,
@ -438,11 +438,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(true)),
&mut vfs,
&vfs,
Path::new("/bar.server.lua"),
"bar",
ScriptType::Server,
@ -474,11 +474,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_lua(
&InstanceContext::with_emit_legacy_scripts(Some(false)),
&mut vfs,
&vfs,
Path::new("/bar.server.lua"),
"bar",
ScriptType::Server,

View file

@ -54,11 +54,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_rbxm(
&InstanceContext::default(),
&mut vfs,
&vfs,
Path::new("/foo.rbxm"),
"foo",
)

View file

@ -66,11 +66,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs);
let vfs = Vfs::new(imfs);
let instance_snapshot = snapshot_rbxmx(
&InstanceContext::default(),
&mut vfs,
&vfs,
Path::new("/foo.rbxmx"),
"foo",
)

View file

@ -105,11 +105,11 @@ mod test {
)
.unwrap();
let mut vfs = Vfs::new(imfs.clone());
let vfs = Vfs::new(imfs.clone());
let instance_snapshot = snapshot_toml(
&InstanceContext::default(),
&mut vfs,
&vfs,
Path::new("/foo.toml"),
"foo",
)

View file

@ -50,11 +50,11 @@ mod test {
imfs.load_snapshot("/foo.txt", VfsSnapshot::file("Hello there!"))
.unwrap();
let mut vfs = Vfs::new(imfs.clone());
let vfs = Vfs::new(imfs.clone());
let instance_snapshot = snapshot_txt(
&InstanceContext::default(),
&mut vfs,
&vfs,
Path::new("/foo.txt"),
"foo",
)

View file

@ -119,7 +119,7 @@ pub struct Instance<'a> {
pub metadata: Option<InstanceMetadata>,
}
impl<'a> Instance<'a> {
impl Instance<'_> {
pub(crate) fn from_rojo_instance(source: InstanceWithMeta<'_>) -> Instance<'_> {
let properties = source
.properties()

View file

@ -28,7 +28,7 @@ use crate::rojo_test::io_util::{
pub fn run_serve_test(test_name: &str, callback: impl FnOnce(TestServeSession, RedactionMap)) {
let _ = env_logger::try_init();
let mut redactions = RedactionMap::new();
let mut redactions = RedactionMap::default();
let mut session = TestServeSession::new(test_name);
let info = session.wait_to_come_online();