Compare commits

...

17 Commits

Author SHA1 Message Date
Lucien Greathouse
1a78e9178a Release 0.5.3 2019-10-15 18:16:21 -07:00
Lucien Greathouse
1659cf7a01 Plugin: Upgrade to latest rbx_dom_lua 2019-10-15 18:05:43 -07:00
Lucien Greathouse
78d97e162c Release v0.5.2 2019-10-14 17:33:43 -07:00
Lucien Greathouse
5d0aa1193f Fix LocalizationTable output order by switching to a BTreeMap.
ACTUALLY closes #173.
2019-10-14 17:29:34 -07:00
Lucien Greathouse
126040a87b Add build tests for init.meta.json 2019-10-12 23:59:54 -07:00
Lucien Greathouse
2c408f4047 Fix errors in 'Sync Details' page 2019-10-08 16:17:13 -07:00
Lucien Greathouse
b53cda787a Add end-to-end build test for Script.Disabled via .meta.json 2019-10-08 16:09:27 -07:00
Lucien Greathouse
7b4455ed51 Release v0.5.1 2019-10-04 12:51:14 -07:00
Lucien Greathouse
5b57025b0b plugin: Only move message cursor in response to retrieveMessages 2019-10-04 11:13:10 -07:00
Lucien Greathouse
ece454e6dd Update dependencies 2019-10-04 10:54:53 -07:00
boyned//Kampfkarren
afa480b07d Fix broken link to sync details (#248) 2019-09-22 17:38:40 -07:00
Lucien Greathouse
c9b695d533 Fix guide to point to release versions instead of alphas 2019-09-20 11:06:01 -07:00
Lucien Greathouse
71c77a09a6 Update docs link to rojo.space 2019-09-19 14:02:26 -07:00
Lucien Greathouse
d309a1359c Update changelog 2019-09-13 17:16:05 -07:00
Lucien Greathouse
b0bb486d9a Improve diagnostics for failed instance creation 2019-09-13 16:00:08 -07:00
Lucien Greathouse
2c7c3348cf Add help page to direct people to Discord, GitHub, and Twitter 2019-09-11 11:36:02 -07:00
Lucien Greathouse
4caac5e6cb Update docs home for 0.5.x 2019-08-27 14:37:26 -07:00
27 changed files with 590 additions and 465 deletions

View File

@@ -2,6 +2,18 @@
## Unreleased Changes ## Unreleased Changes
## [0.5.3](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.3) (October 15, 2019)
* Fixed an issue where Rojo would throw an error when encountering recently-added instance classes.
## [0.5.2](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.2) (October 14, 2019)
* Fixed an issue where `LocalizationTable` instances would have their column order randomized. ([#173](https://github.com/rojo-rbx/rojo/issues/173))
## [0.5.1](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.1) (October 4, 2019)
* Fixed an issue where Rojo would drop changes if they happened too quickly ([#252](https://github.com/rojo-rbx/rojo/issues/252))
* Improved diagnostics for when the Rojo plugin cannot create an instance.
* Updated dependencies
* This brings Rojo's reflection database from client release 395 to client release 404.
## [0.5.0](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0) (August 27, 2019) ## [0.5.0](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0) (August 27, 2019)
* Changed `.model.json` naming, which may require projects to migrate ambiguous cases: * Changed `.model.json` naming, which may require projects to migrate ambiguous cases:
* The file name now takes precedence over the `Name` field in the model, like Rojo 0.4.x. * The file name now takes precedence over the `Name` field in the model, like Rojo 0.4.x.

871
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -26,12 +26,14 @@ The Rojo CLI must be run from the command line, like Terminal.app on MacOS or `c
### Installing from Cargo ### Installing from Cargo
If you have Rust installed, the easiest way to get Rojo is with Cargo! If you have Rust installed, the easiest way to get Rojo is with Cargo!
To install the latest 0.5.0 alpha, use: To install the latest 0.5.x release, use:
```sh ```sh
cargo install rojo --version 0.5.0-alpha.13 cargo install rojo
``` ```
If you're upgrading from a previous version of Rojo, you may need to pass `--force` to tell Cargo to overwrite your existing version.
## Installing the Plugin ## Installing the Plugin
### Installing from GitHub ### Installing from GitHub
@@ -43,4 +45,4 @@ Download the attached `rbxm` file and put it into your Roblox Studio plugins fol
{: align="center" } {: align="center" }
### Installing from Roblox.com ### Installing from Roblox.com
Visit [Rojo's Roblox.com Plugin page](https://www.roblox.com/library/1997686364/Rojo-0-5-0-alpha-3) in Roblox Studio and press **Install**. Visit [Rojo's Roblox.com Plugin page](https://www.roblox.com/library/1997686364) in Roblox Studio and press **Install**.

View File

@@ -60,4 +60,4 @@ Unknown files are now ignored in Rojo instead of being converted to `StringValue
## Migrating `init.model.json` files ## Migrating `init.model.json` files
In Rojo 0.4.x, it's possible to create a file named `init.model.json` that lets you describe a model that becomes the container for all of the other files in the folder, just like `init.lua`. In Rojo 0.4.x, it's possible to create a file named `init.model.json` that lets you describe a model that becomes the container for all of the other files in the folder, just like `init.lua`.
In Rojo 0.5.x, this feature has been replaced with `init.meta.json` files. See [Sync Details](../reference/sync-details) for more information about these new files. In Rojo 0.5.x, this feature has been replaced with `init.meta.json` files. See [Sync Details](../../reference/sync-details) for more information about these new files.

7
docs/help.md Normal file
View File

@@ -0,0 +1,7 @@
Rojo is a fairly complex tool to adopt, but there's a community willing to help!
The [Roblox Open Source Community Discord](https://discord.gg/wH5ncNS) currently hosts a Rojo support channel, **#rojo**, that is a great place to get help as problems come up.
If you find anything that looks like a bug or have ideas for how to improve Rojo, feel free to file an issue on [Rojo's GitHub issue tracker](https://github.com/rojo-rbx/rojo/issues).
Rojo's primary maintainer is also available on Twitter, [@LPGhatguy](https://twitter.com/LPGhatguy).

View File

@@ -1,11 +1,11 @@
This is the documentation home for Rojo 0.5.x. This is the documentation home for **Rojo 0.5.x**.
Available versions of these docs: Available versions of these docs:
* [Latest version (currently 0.5.x)](https://rojo.space/docs/latest) * [Latest version from `master` branch](https://rojo.space/docs/latest)
* [0.5.x](https://rojo.space/docs/0.5.x) * [0.5.x](https://rojo.space/docs/0.5.x)
* [0.4.x](https://rojo.space/docs/0.4.x) * [0.4.x](https://rojo.space/docs/0.4.x)
**Rojo** is a flexible multi-tool designed for creating robust Roblox projects. **Rojo** is a tool designed to enable Roblox developers to use professional-grade software engineering tools.
This documentation is a continual work in progress. If you find any issues, please file an issue on [Rojo's issue tracker](https://github.com/rojo-rbx/rojo/issues)! This documentation is a continual work in progress. If you find any issues, please file an issue on [Rojo's issue tracker](https://github.com/rojo-rbx/rojo/issues)!

View File

@@ -116,10 +116,18 @@ Meta files can contain:
### Meta Files to set Rojo metadata ### Meta Files to set Rojo metadata
Sometimes it's useful to apply properties like `ignoreUnknownInstances` on instances that are defined on the filesystem instead of within the project itself. Sometimes it's useful to apply properties like `ignoreUnknownInstances` on instances that are defined on the filesystem instead of within the project itself.
If your project has `hello.txt` and there are instances underneath it that you want Rojo to ignore when live-syncing, you could create `hello.meta.json` with:
```json
{
"ignoreUnknownInstances": true
}
```
### Meta Files for Disabled Scripts ### Meta Files for Disabled Scripts
Meta files can be used to set properties on `Script` instances, like `Disabled`. Meta files can be used to set properties on `Script` instances, like `Disabled`.
If your project had `foo.server.lua` and you wanted to make sure it would be disabled, you could create a `foo.meta.json` next to it with: If your project has `foo.server.lua` and you want to make sure it would be disabled, you could create a `foo.meta.json` next to it with:
```json ```json
{ {
@@ -140,7 +148,7 @@ If you wanted to represent a tool containing a script and a model for its handle
0, 0, 0, 0, 0, 0,
1, 0, 0, 1, 0, 0,
0, 1, 0, 0, 1, 0,
0, 0, 1, 0, 0, 1
] ]
} }
} }

View File

@@ -11,6 +11,7 @@ theme:
nav: nav:
- Home: index.md - Home: index.md
- Why Rojo?: why-rojo.md - Why Rojo?: why-rojo.md
- Get Help with Rojo: help.md
- Guide: - Guide:
- Installation: guide/installation.md - Installation: guide/installation.md
- Creating a Game with Rojo: guide/new-game.md - Creating a Game with Rojo: guide/new-game.md

View File

@@ -131,13 +131,15 @@ function ApiContext:read(ids)
return Promise.reject("Server changed ID") return Promise.reject("Server changed ID")
end end
self.messageCursor = body.messageCursor
return body return body
end) end)
end end
function ApiContext:retrieveMessages() function ApiContext:retrieveMessages(initialCursor)
if initialCursor ~= nil then
self.messageCursor = initialCursor
end
local url = ("%s/api/subscribe/%s"):format(self.baseUrl, self.messageCursor) local url = ("%s/api/subscribe/%s"):format(self.baseUrl, self.messageCursor)
local function sendRequest() local function sendRequest()

View File

@@ -1,6 +1,6 @@
return { return {
codename = "Epiphany", codename = "Epiphany",
version = {0, 5, 0}, version = {0, 5, 3},
expectedServerVersionString = "0.5.0 or newer", expectedServerVersionString = "0.5.0 or newer",
protocolVersion = 2, protocolVersion = 2,
defaultHost = "localhost", defaultHost = "localhost",

View File

@@ -50,6 +50,8 @@ function Reconciler:reconcile(virtualInstancesById, id, instance)
-- If an instance changes ClassName, we assume it's very different. That's -- If an instance changes ClassName, we assume it's very different. That's
-- not always the case! -- not always the case!
if virtualInstance.ClassName ~= instance.ClassName then if virtualInstance.ClassName ~= instance.ClassName then
Logging.trace("Switching to reify for %s because ClassName is different", instance:GetFullName())
-- TODO: Preserve existing children instead? -- TODO: Preserve existing children instead?
local parent = instance.Parent local parent = instance.Parent
self.instanceMap:destroyId(id) self.instanceMap:destroyId(id)
@@ -93,6 +95,12 @@ function Reconciler:reconcile(virtualInstancesById, id, instance)
unvisitedExistingChildren[existingChildInstance] = nil unvisitedExistingChildren[existingChildInstance] = nil
self:reconcile(virtualInstancesById, childId, existingChildInstance) self:reconcile(virtualInstancesById, childId, existingChildInstance)
else else
Logging.trace(
"Switching to reify for %s.%s because it does not exist",
instance:GetFullName(),
virtualInstancesById[childId].Name
)
self:__reify(virtualInstancesById, childId, instance) self:__reify(virtualInstancesById, childId, instance)
end end
end end
@@ -148,7 +156,13 @@ function Reconciler:__reify(virtualInstancesById, id, parent)
local virtualInstance = virtualInstancesById[id] local virtualInstance = virtualInstancesById[id]
local instance = Instance.new(virtualInstance.ClassName) local ok, instance = pcall(function()
return Instance.new(virtualInstance.ClassName)
end)
if not ok then
error(("Couldn't create an Instance of type %q, a child of %s"):format(virtualInstance.ClassName, parent:GetFullName()))
end
for key, value in pairs(virtualInstance.Properties) do for key, value in pairs(virtualInstance.Properties) do
setCanonicalProperty(instance, key, rojoValueToRobloxValue(value)) setCanonicalProperty(instance, key, rojoValueToRobloxValue(value))

View File

@@ -33,7 +33,7 @@ function Session.new(config)
end end
self.reconciler:reconcile(response.instances, api.rootInstanceId, game) self.reconciler:reconcile(response.instances, api.rootInstanceId, game)
return self:__processMessages() return self:__processMessages(response.messageCursor)
end) end)
:catch(function(message) :catch(function(message)
self.disconnected = true self.disconnected = true
@@ -43,12 +43,12 @@ function Session.new(config)
return not self.disconnected, setmetatable(self, Session) return not self.disconnected, setmetatable(self, Session)
end end
function Session:__processMessages() function Session:__processMessages(initialCursor)
if self.disconnected then if self.disconnected then
return Promise.resolve() return Promise.resolve()
end end
return self.api:retrieveMessages() return self.api:retrieveMessages(initialCursor)
:andThen(function(messages) :andThen(function(messages)
local promise = Promise.resolve(nil) local promise = Promise.resolve(nil)

View File

@@ -0,0 +1,6 @@
{
"name": "init_meta_class_name",
"tree": {
"$path": "should-be-a-model"
}
}

View File

@@ -0,0 +1,3 @@
{
"className": "Model"
}

View File

@@ -0,0 +1,6 @@
{
"className": "Lighting",
"properties": {
"Technology": "Voxel"
}
}

View File

@@ -0,0 +1,6 @@
{
"name": "init_meta_properties",
"tree": {
"$path": "Lighting"
}
}

View File

@@ -0,0 +1,6 @@
{
"name": "script_meta_disabled",
"tree": {
"$path": "folder"
}
}

View File

@@ -0,0 +1,5 @@
{
"properties": {
"Disabled": true
}
}

View File

@@ -0,0 +1 @@
-- This script should be marked 'Disabled'

View File

@@ -1,8 +1,4 @@
use std::{ use std::{fs, path::Path, process::Command};
fs,
path::Path,
process::Command,
};
use insta::assert_snapshot_matches; use insta::assert_snapshot_matches;
use tempfile::tempdir; use tempfile::tempdir;
@@ -27,12 +23,15 @@ gen_build_tests! {
csv_bug_147, csv_bug_147,
csv_in_folder, csv_in_folder,
gitkeep, gitkeep,
init_meta_class_name,
init_meta_properties,
json_model_in_folder, json_model_in_folder,
json_model_legacy_name, json_model_legacy_name,
module_in_folder, module_in_folder,
module_init, module_init,
rbxm_in_folder, rbxm_in_folder,
rbxmx_in_folder, rbxmx_in_folder,
script_meta_disabled,
server_in_folder, server_in_folder,
server_init, server_init,
txt_in_folder, txt_in_folder,
@@ -55,7 +54,10 @@ fn run_build_test(test_name: &str) {
let status = Command::new(exe_path) let status = Command::new(exe_path)
.args(&[ .args(&[
"build", input_path.to_str().unwrap(), "-o", output_path.to_str().unwrap(), "build",
input_path.to_str().unwrap(),
"-o",
output_path.to_str().unwrap(),
]) ])
.env("RUST_LOG", "error") .env("RUST_LOG", "error")
.current_dir(working_dir) .current_dir(working_dir)
@@ -64,8 +66,7 @@ fn run_build_test(test_name: &str) {
assert!(status.success(), "Rojo did not exit successfully"); assert!(status.success(), "Rojo did not exit successfully");
let contents = fs::read_to_string(&output_path) let contents = fs::read_to_string(&output_path).expect("Couldn't read output file");
.expect("Couldn't read output file");
assert_snapshot_matches!(test_name, contents); assert_snapshot_matches!(test_name, contents);
} }

View File

@@ -0,0 +1,11 @@
---
source: rojo-test/src/build_test.rs
expression: contents
---
<roblox version="4">
<Item class="Model" referent="0">
<Properties>
<string name="Name">init_meta_class_name</string>
</Properties>
</Item>
</roblox>

View File

@@ -0,0 +1,12 @@
---
source: rojo-test/src/build_test.rs
expression: contents
---
<roblox version="4">
<Item class="Lighting" referent="0">
<Properties>
<string name="Name">init_meta_properties</string>
<token name="Technology">1</token>
</Properties>
</Item>
</roblox>

View File

@@ -0,0 +1,18 @@
---
source: rojo-test/src/build_test.rs
expression: contents
---
<roblox version="4">
<Item class="Folder" referent="0">
<Properties>
<string name="Name">script_meta_disabled</string>
</Properties>
<Item class="Script" referent="1">
<Properties>
<string name="Name">hello</string>
<bool name="Disabled">true</bool>
<string name="Source">-- This script should be marked 'Disabled'</string>
</Properties>
</Item>
</Item>
</roblox>

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "rojo" name = "rojo"
version = "0.5.0" version = "0.5.3"
authors = ["Lucien Greathouse <me@lpghatguy.com>"] authors = ["Lucien Greathouse <me@lpghatguy.com>"]
description = "Enables professional-grade development tools for Roblox developers" description = "Enables professional-grade development tools for Roblox developers"
license = "MIT" license = "MIT"

View File

@@ -3,7 +3,7 @@
use std::{ use std::{
borrow::Cow, borrow::Cow,
collections::HashMap, collections::{BTreeMap, HashMap},
fmt, fmt,
path::{Path, PathBuf}, path::{Path, PathBuf},
str, str,
@@ -631,7 +631,8 @@ fn snapshot_csv_file<'source>(
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
source: Option<&'a str>, source: Option<&'a str>,
values: HashMap<&'a str, &'a str>, // We use a BTreeMap here to get deterministic output order.
values: BTreeMap<&'a str, &'a str>,
} }
let instance_name = file.path let instance_name = file.path

View File

@@ -73,7 +73,7 @@ impl InterfaceService {
<h2 class="subtitle"> <h2 class="subtitle">
"Version " { self.server_version } "Version " { self.server_version }
</h2> </h2>
<a class="docs" href="https://lpghatguy.github.io/rojo"> <a class="docs" href="https://rojo.space/docs">
"Rojo Documentation" "Rojo Documentation"
</a> </a>
</div> </div>