Skip to content

Commit

Permalink
Merge pull request #59 from mrtryhard/v0.3.1
Browse files Browse the repository at this point in the history
V0.3.1
  • Loading branch information
mrtryhard authored May 12, 2024
2 parents c2796d3 + 3ed9bee commit b68ef15
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 155 deletions.
6 changes: 6 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Required tools
run: cargo install cargo-deny && rustup component add clippy
- name: Clippy
run: cargo clippy --all-targets --all-features -- -D warnings
- name: Build
run: cargo build --verbose
- name: License check
run: cargo deny -L debug --all-features --locked check
- name: Run tests
run: cargo test --verbose
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [0.3.1] - 2024-05-12
Contains minor fixes to the command line tool.

## Fixed

- Sorting now consider messages' id. [#42](https://github.com/mrtryhard/qt-ts-tools/issues/42)

## [0.3.0] - 2024-04-22
[Third milestone](https://github.com/mrtryhard/qt-ts-tools/milestone/3). This introduces the `merge` command and improved documentation.

Expand Down
141 changes: 13 additions & 128 deletions deny.toml
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
# This template contains all of the possible sections and their default values

# Note that all fields that take a lint level have these possible values:
# * deny - An error will be produced and the check will fail
# * warn - A warning will be produced, but the check will not fail
# * allow - No warning or error will be produced, though in some cases a note
# will be

# The values provided in this template are the default values that will be used
# when any section or field is not specified in your own configuration

# Root options
# https://embarkstudios.github.io/cargo-deny/checks/
# Graph options

[graph]
# If 1 or more target triples (and optionally, target_features) are specified,
# only the specified targets will be checked when running `cargo deny check`.
# This means, if a particular package is only ever used as a target specific
Expand All @@ -19,15 +10,8 @@
# this list would mean the nix crate, as well as any of its exclusive
# dependencies not shared by any other crates, would be ignored, as the target
# list here is effectively saying which targets you are building for.
targets = [
# The triple can be any string, but only the target triples built in to
# rustc (as of 1.40) can be checked against actual config expressions
#{ triple = "x86_64-unknown-linux-musl" },
# You can also specify which target_features you promise are enabled for a
# particular target. target_features are currently not validated against
# the actual valid features supported by the target architecture.
#{ triple = "wasm32-unknown-unknown", features = ["atomics"] },
]
targets = []

# When creating the dependency graph used as the source of truth when checks are
# executed, this field can be used to prune crates from the graph, removing them
# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate
Expand All @@ -46,6 +30,8 @@ no-default-features = false
# If set, these feature will be enabled when collecting metadata. If `--features`
# is specified on the cmd line they will take precedence over this option.
#features = []

[output]
# When outputting inclusion graphs in diagnostics that include features, this
# option can be used to specify the depth at which feature edges will be added.
# This option is included since the graphs can be quite large and the addition
Expand All @@ -57,32 +43,18 @@ feature-depth = 1
# More documentation for the advisories section can be found here:
# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html
[advisories]
version = 2
# The path where the advisory database is cloned/fetched into
db-path = "~/.cargo/advisory-db"
# The url(s) of the advisory databases to use
db-urls = ["https://github.com/rustsec/advisory-db"]
# The lint level for security vulnerabilities
vulnerability = "deny"
# The lint level for unmaintained crates
unmaintained = "warn"
# The lint level for crates that have been yanked from their source registry
yanked = "warn"
# The lint level for crates with security notices.
notice = "warn"
# A list of advisory IDs to ignore. Note that ignored advisories will still
# output a note when they are encountered.
ignore = [
#"RUSTSEC-0000-0000",
]
# Threshold for security vulnerabilities, any vulnerability with a CVSS score
# lower than the range specified will be ignored. Note that ignored advisories
# will still output a note when they are encountered.
# * None - CVSS Score 0.0
# * Low - CVSS Score 0.1 - 3.9
# * Medium - CVSS Score 4.0 - 6.9
# * High - CVSS Score 7.0 - 8.9
# * Critical - CVSS Score 9.0 - 10.0
#severity-threshold =

# If this is true, then cargo deny will use the git executable to fetch advisory database.
# If this is false, then it uses a built-in git library.
Expand All @@ -94,37 +66,12 @@ ignore = [
# More documentation for the licenses section can be found here:
# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html
[licenses]
# The lint level for crates which do not have a detectable license
unlicensed = "deny"
version = 2
# List of explicitly allowed licenses
# See https://spdx.org/licenses/ for list of possible licenses
# [possible values: any SPDX 3.11 short identifier (+ optional exception)].
allow = [
"MIT",
"Apache-2.0",
]
# List of explicitly disallowed licenses
# See https://spdx.org/licenses/ for list of possible licenses
# [possible values: any SPDX 3.11 short identifier (+ optional exception)].
deny = [
#"Nokia",
]
# Lint level for licenses considered copyleft
copyleft = "warn"
# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses
# * both - The license will be approved if it is both OSI-approved *AND* FSF
# * either - The license will be approved if it is either OSI-approved *OR* FSF
# * osi - The license will be approved if it is OSI approved
# * fsf - The license will be approved if it is FSF Free
# * osi-only - The license will be approved if it is OSI-approved *AND NOT* FSF
# * fsf-only - The license will be approved if it is FSF *AND NOT* OSI-approved
# * neither - This predicate is ignored and the default lint level is used
allow-osi-fsf-free = "neither"
# Lint level used when no other predicates are matched
# 1. License isn't in the allow or deny lists
# 2. License isn't copyleft
# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither"
default = "deny"
# The confidence threshold for detecting a license from license text.
# The higher the value, the more closely the license text must be to the
# canonical license text of a valid SPDX license file.
Expand All @@ -142,26 +89,6 @@ exceptions = [
], name = "unicode-ident", version = "*" },
]

# Some crates don't have (easily) machine readable licensing information,
# adding a clarification entry for it allows you to manually specify the
# licensing information
#[[licenses.clarify]]
# The name of the crate the clarification applies to
#name = "ring"
# The optional version constraint for the crate
#version = "*"
# The SPDX expression for the license requirements of the crate
#expression = "MIT AND ISC AND OpenSSL"
# One or more files in the crate's source used as the "source of truth" for
# the license expression. If the contents match, the clarification will be used
# when running the license check, otherwise the clarification will be ignored
# and the crate will be checked normally, which may produce warnings or errors
# depending on the rest of your configuration
#license-files = [
# Each entry is a crate relative path, and the (opaque) hash of its contents
#{ path = "LICENSE-APACHE", hash = 0xbd0eed23 }
#]

[licenses.private]
# If true, ignores workspace crates that aren't published, or are only
# published to private registries.
Expand Down Expand Up @@ -202,50 +129,16 @@ allow = [
#{ name = "ansi_term", version = "=0.11.0" },
]
# List of crates to deny
deny = [
# Each entry the name of a crate and a version range. If version is
# not specified, all versions will be matched.
#{ name = "ansi_term", version = "=0.11.0" },
#
# Wrapper crates can optionally be specified to allow the crate when it
# is a direct dependency of the otherwise banned crate
#{ name = "ansi_term", version = "=0.11.0", wrappers = [] },
]

# List of features to allow/deny
# Each entry the name of a crate and a version range. If version is
# not specified, all versions will be matched.
#[[bans.features]]
#name = "reqwest"
# Features to not allow
#deny = ["json"]
# Features to allow
#allow = [
# "rustls",
# "__rustls",
# "__tls",
# "hyper-rustls",
# "rustls",
# "rustls-pemfile",
# "rustls-tls-webpki-roots",
# "tokio-rustls",
# "webpki-roots",
#]
# If true, the allowed features must exactly match the enabled feature set. If
# this is set there is no point setting `deny`
#exact = true
deny = []

# Certain crates/versions that will be skipped when doing duplicate detection.
skip = [
#{ name = "ansi_term", version = "=0.11.0" },
]
skip = []

# Similarly to `skip` allows you to skip certain crates during duplicate
# detection. Unlike skip, it also includes the entire tree of transitive
# dependencies starting at the specified crate, up to a certain depth, which is
# by default infinite.
skip-tree = [
#{ name = "ansi_term", version = "=0.11.0", depth = 20 },
]
skip-tree = []

# This section is considered when running `cargo deny check sources`.
# More documentation about the 'sources' section can be found here:
Expand All @@ -262,11 +155,3 @@ unknown-git = "warn"
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
# List of URLs for allowed Git repositories
allow-git = []

[sources.allow-org]
# 1 or more github.com organizations to allow git sources for
github = []
# 1 or more gitlab.com organizations to allow git sources for
gitlab = []
# 1 or more bitbucket.org organizations to allow git sources for
bitbucket = []
46 changes: 26 additions & 20 deletions src/ts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,25 +31,25 @@ pub enum YesNo {
#[serde(rename = "TS")]
pub struct TSNode {
#[serde(rename = "@version", skip_serializing_if = "Option::is_none")]
version: Option<String>,
pub version: Option<String>,
#[serde(rename = "@sourcelanguage", skip_serializing_if = "Option::is_none")]
source_language: Option<String>,
pub source_language: Option<String>,
#[serde(rename = "@language", skip_serializing_if = "Option::is_none")]
language: Option<String>,
pub language: Option<String>,
#[serde(rename = "context", skip_serializing_if = "Vec::is_empty", default)]
pub contexts: Vec<ContextNode>,
#[serde(rename = "message", skip_serializing_if = "Vec::is_empty", default)]
pub messages: Vec<MessageNode>,
#[serde(skip_serializing_if = "Option::is_none")]
dependencies: Option<DependenciesNode>,
pub dependencies: Option<DependenciesNode>,
#[serde(skip_serializing_if = "Option::is_none")]
comment: Option<String>,
pub comment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
oldcomment: Option<String>,
pub oldcomment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
extracomment: Option<String>,
pub extracomment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
translatorcomment: Option<String>,
pub translatorcomment: Option<String>,
/*
Following section corresponds to `extra-something` in Qt's XSD. From documentation:
> extra elements may appear in TS and message elements. Each element may appear
Expand Down Expand Up @@ -94,12 +94,12 @@ pub struct ContextNode {
#[derive(Debug, Deserialize, Serialize, PartialEq)]
pub struct DependenciesNode {
#[serde(rename = "dependency")]
dependencies: Vec<Dependency>,
pub dependencies: Vec<Dependency>,
}

#[derive(Debug, Deserialize, Serialize, PartialEq)]
pub struct Dependency {
catalog: String,
pub catalog: String,
}

#[derive(Debug, Eq, Clone, Deserialize, Serialize, PartialEq)]
Expand All @@ -122,16 +122,16 @@ pub struct MessageNode {
pub oldcomment: Option<String>,
/// The real comment (added by developer/designer)
#[serde(skip_serializing_if = "Option::is_none")]
extracomment: Option<String>,
pub extracomment: Option<String>,
/// Comment added by translator
#[serde(skip_serializing_if = "Option::is_none")]
translatorcomment: Option<String>,
pub translatorcomment: Option<String>,
#[serde(rename = "@numerus", skip_serializing_if = "Option::is_none")]
numerus: Option<YesNo>,
pub numerus: Option<YesNo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
userdata: Option<String>,
pub userdata: Option<String>,
/*
Following section corresponds to `extra-something` in Qt's XSD. From documentation:
> extra elements may appear in TS and message elements. Each element may appear
Expand Down Expand Up @@ -167,15 +167,15 @@ pub struct TranslationNode {
// Did not find a way to make it an enum
// Therefore: either you have a `translation_simple` or a `numerus_forms`, but not both.
#[serde(rename = "$text", skip_serializing_if = "Option::is_none")]
translation_simple: Option<String>,
pub translation_simple: Option<String>,
#[serde(rename = "numerusform", skip_serializing_if = "Vec::is_empty", default)]
numerus_forms: Vec<NumerusFormNode>,
pub numerus_forms: Vec<NumerusFormNode>,
#[serde(rename = "@type", skip_serializing_if = "Option::is_none")]
pub translation_type: Option<TranslationType>,
#[serde(skip_serializing_if = "Option::is_none")]
variants: Option<YesNo>,
pub variants: Option<YesNo>,
#[serde(skip_serializing_if = "Option::is_none")]
userdata: Option<String>, // deprecated
pub userdata: Option<String>, // deprecated
}

#[derive(Debug, Eq, Clone, Deserialize, Serialize, PartialEq)]
Expand All @@ -189,13 +189,19 @@ pub struct LocationNode {
#[derive(Debug, Eq, Clone, Deserialize, Serialize, PartialEq)]
pub struct NumerusFormNode {
#[serde(default, rename = "$value", skip_serializing_if = "String::is_empty")]
text: String,
pub text: String,
#[serde(rename = "@variants", skip_serializing_if = "Option::is_none")]
variants: Option<YesNo>,
pub variants: Option<YesNo>,
}

impl PartialOrd<Self> for MessageNode {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
let id_cmp = other.id.cmp(&self.id);

if id_cmp != Ordering::Equal {
return Some(id_cmp);
}

let min_self = self
.locations
.iter()
Expand Down
14 changes: 7 additions & 7 deletions test_data/example_merge_result.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,6 @@
<TS version="2.1" language="de">
<context>
<name>kernel/in_merge</name>
<message>
<source>Only In Left Message</source>
<translation>
Only in Left translation
</translation>
<comment>Left message</comment>
</message>
<message>
<source>Now Right Source</source>
<oldsource>Source string Left should be in oldsource</oldsource>
Expand All @@ -18,6 +11,13 @@
</translation>
<id>idBasedLeft</id>
</message>
<message>
<source>Only In Left Message</source>
<translation>
Only in Left translation
</translation>
<comment>Left message</comment>
</message>
<message>
<source>Newsletter</source>
<translation>
Expand Down

0 comments on commit b68ef15

Please sign in to comment.