From aacd2bf319664f6c1e03a613f921503f965578e0 Mon Sep 17 00:00:00 2001 From: Jonathan Wood Date: Thu, 14 Jan 2016 08:23:11 -0800 Subject: [PATCH 1/3] Update README for the 0.5.0 release. --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 9473846..c9dac3d 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Add the following dependency to your POM (or equivalent for other dependency man com.moandjiezana.toml toml4j - 0.4.0 + 0.5.0 ``` @@ -23,7 +23,7 @@ Requires Java 1.6. ## Quick start ```java -Toml toml = new Toml().parse(getTomlFile()); +Toml toml = new Toml().read(getTomlFile()); String someValue = toml.getString("someKey"); Date someDate = toml.getDate("someTable.someDate"); MyClass myClass = toml.to(MyClass.class); @@ -31,10 +31,10 @@ MyClass myClass = toml.to(MyClass.class); ## Usage -A `com.moandjiezana.toml.Toml` instance is populated by calling one of `parse(File)`, `parse(InputStream)`, `parse(Reader)` or `parse(String)`. +A `com.moandjiezana.toml.Toml` instance is populated by calling one of `read(File)`, `read(InputStream)`, `read(Reader)` or `read(String)`. ```java -Toml toml = new Toml().parse("a=1"); +Toml toml = new Toml().read("a=1"); ``` An exception is thrown if the source is not valid TOML. @@ -70,7 +70,7 @@ class User { ``` ```java -User user = new Toml().parse(tomlFile).to(User.class); +User user = new Toml().read(tomlFile).to(User.class); assert user.name.equals("Mwanji Ezana"); assert user.address.street.equals("123 A Street"); @@ -146,7 +146,7 @@ title = "TOML Example" ``` ```java -Toml toml = new Toml().parse(getTomlFile()); +Toml toml = new Toml().read(getTomlFile()); String title = toml.getString("title"); String subTitle = toml.getString("\"sub title\""); @@ -191,8 +191,8 @@ a = 1 ``` ```java -Toml defaults = new Toml().parse(getDefaultsFile()); -Toml toml = new Toml(defaults).parse(getTomlFile()); +Toml defaults = new Toml().read(getDefaultsFile()); +Toml toml = new Toml(defaults).read(getTomlFile()); Long a = toml.getLong("a"); // returns 1, not 2 Long b = toml.getLong("b"); // returns 3, taken from defaults provided to constructor @@ -217,7 +217,7 @@ for (Map.Entry entry : myToml.entrySet()) { You can also convert a Toml instance to a `Map`: ```java -Toml toml = new Toml().parse("a = 1"); +Toml toml = new Toml().read("a = 1"); Map map = toml.to(Map.class); ``` @@ -225,7 +225,7 @@ Map map = toml.to(Map.class); ```java -Toml toml = new Toml().parse("a = 1"); +Toml toml = new Toml().read("a = 1"); toml.contains("a"); // true toml.conatinsKey("a"); // true From e024b51b0ca20ab46550a75610169981582c11dd Mon Sep 17 00:00:00 2001 From: "moandji.ezana" Date: Sun, 24 Jan 2016 22:10:35 -0400 Subject: [PATCH 2/3] Fix handling of tables with same name in different table array items. Fixes https://github.com/mwanji/toml4j/issues/26 --- CHANGELOG.md | 6 ++++++ .../java/com/moandjiezana/toml/Container.java | 19 +++++++++++++++++-- .../java/com/moandjiezana/toml/Results.java | 17 +++++++++++++---- .../com/moandjiezana/toml/TableArrayTest.java | 7 ++++++- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b66fb1e..a224247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # toml4j Changelog +## 0.5.1 / 2016-01-24 + +### Fixed + +* [Handling of tables with same name in different table array items](https://github.com/mwanji/toml4j/issues/26) (thanks to __[stanofujdiar](https://github.com/stanofujdiar)__) + ## 0.5.0 / 2015-12-10 ### Changed diff --git a/src/main/java/com/moandjiezana/toml/Container.java b/src/main/java/com/moandjiezana/toml/Container.java index 0b1a24f..56cce75 100644 --- a/src/main/java/com/moandjiezana/toml/Container.java +++ b/src/main/java/com/moandjiezana/toml/Container.java @@ -10,17 +10,24 @@ abstract class Container { abstract boolean accepts(String key); abstract void put(String key, Object value); abstract Object get(String key); + abstract boolean isImplicit(); static class Table extends Container { private final Map values = new HashMap(); final String name; + final boolean implicit; Table() { - this.name = null; + this(null, false); } public Table(String name) { - this.name = name; + this(name, false); + } + + public Table(String tableName, boolean implicit) { + this.name = tableName; + this.implicit = implicit; } @Override @@ -37,6 +44,10 @@ abstract class Container { Object get(String key) { return values.get(key); } + + boolean isImplicit() { + return implicit; + } /** * This modifies the Table's internal data structure, such that it is no longer usable. @@ -84,6 +95,10 @@ abstract class Container { Object get(String key) { throw new UnsupportedOperationException(); } + + boolean isImplicit() { + return false; + } List> getValues() { ArrayList> unwrappedValues = new ArrayList>(); diff --git a/src/main/java/com/moandjiezana/toml/Results.java b/src/main/java/com/moandjiezana/toml/Results.java index a3ea318..b5d7ba1 100644 --- a/src/main/java/com/moandjiezana/toml/Results.java +++ b/src/main/java/com/moandjiezana/toml/Results.java @@ -205,9 +205,6 @@ class Results { void startTables(Identifier id, AtomicInteger line) { String tableName = id.getBareName(); - if (!tables.add(tableName)) { - errors.duplicateTable(tableName, line.get()); - } while (stack.size() > 1) { stack.pop(); @@ -219,12 +216,16 @@ class Results { Container currentContainer = stack.peek(); if (currentContainer.get(tablePart) instanceof Container) { Container nextTable = (Container) currentContainer.get(tablePart); + if (i == tableParts.length - 1 && !nextTable.isImplicit()) { + errors.duplicateTable(tableName, line.get()); + return; + } stack.push(nextTable); if (stack.peek() instanceof Container.TableArray) { stack.push(((Container.TableArray) stack.peek()).getCurrent()); } } else if (currentContainer.accepts(tablePart)) { - startTable(tablePart, line); + startTable(tablePart, i < tableParts.length - 1, line); } else { errors.tableDuplicatesKey(tablePart, line); break; @@ -249,6 +250,14 @@ class Results { return newTable; } + + private Container startTable(String tableName, boolean implicit, AtomicInteger line) { + Container newTable = new Container.Table(tableName, implicit); + addValue(tableName, newTable, line); + stack.push(newTable); + + return newTable; + } private String getInlineTablePath(String key) { Iterator descendingIterator = stack.descendingIterator(); diff --git a/src/test/java/com/moandjiezana/toml/TableArrayTest.java b/src/test/java/com/moandjiezana/toml/TableArrayTest.java index 4f4ddc8..dd2d42c 100644 --- a/src/test/java/com/moandjiezana/toml/TableArrayTest.java +++ b/src/test/java/com/moandjiezana/toml/TableArrayTest.java @@ -110,11 +110,16 @@ public class TableArrayTest { assertNull(toml.getTable("a[1]")); } + @Test + public void should_handle_repeated_tables() { + new Toml().read("[[a]]\n [a.b]\n [[a]]\n [a.b]"); + } + @Test(expected = IllegalStateException.class) public void should_fail_on_empty_table_array_name() { new Toml().read("[[]]"); } - + private File file(String fileName) { return new File(getClass().getResource(fileName + ".toml").getFile()); } From a5e34f464fd1645fb228d53eb0057398a2521b0b Mon Sep 17 00:00:00 2001 From: "moandji.ezana" Date: Sun, 24 Jan 2016 22:14:16 -0400 Subject: [PATCH 3/3] Update version number in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c9dac3d..f9c085a 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Add the following dependency to your POM (or equivalent for other dependency man com.moandjiezana.toml toml4j - 0.5.0 + 0.5.1 ```