mirror of
https://github.com/plexusorg/toml4j.git
synced 2024-09-28 12:43:04 +00:00
Merge branch 'wip'
This commit is contained in:
commit
acca966946
|
@ -1,5 +1,11 @@
|
||||||
# toml4j Changelog
|
# 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
|
## 0.5.0 / 2015-12-10
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
20
README.md
20
README.md
|
@ -14,7 +14,7 @@ Add the following dependency to your POM (or equivalent for other dependency man
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.moandjiezana.toml</groupId>
|
<groupId>com.moandjiezana.toml</groupId>
|
||||||
<artifactId>toml4j</artifactId>
|
<artifactId>toml4j</artifactId>
|
||||||
<version>0.4.0</version>
|
<version>0.5.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ Requires Java 1.6.
|
||||||
## Quick start
|
## Quick start
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Toml toml = new Toml().parse(getTomlFile());
|
Toml toml = new Toml().read(getTomlFile());
|
||||||
String someValue = toml.getString("someKey");
|
String someValue = toml.getString("someKey");
|
||||||
Date someDate = toml.getDate("someTable.someDate");
|
Date someDate = toml.getDate("someTable.someDate");
|
||||||
MyClass myClass = toml.to(MyClass.class);
|
MyClass myClass = toml.to(MyClass.class);
|
||||||
|
@ -31,10 +31,10 @@ MyClass myClass = toml.to(MyClass.class);
|
||||||
|
|
||||||
## Usage
|
## 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
|
```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.
|
An exception is thrown if the source is not valid TOML.
|
||||||
|
@ -70,7 +70,7 @@ class User {
|
||||||
```
|
```
|
||||||
|
|
||||||
```java
|
```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.name.equals("Mwanji Ezana");
|
||||||
assert user.address.street.equals("123 A Street");
|
assert user.address.street.equals("123 A Street");
|
||||||
|
@ -146,7 +146,7 @@ title = "TOML Example"
|
||||||
```
|
```
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Toml toml = new Toml().parse(getTomlFile());
|
Toml toml = new Toml().read(getTomlFile());
|
||||||
|
|
||||||
String title = toml.getString("title");
|
String title = toml.getString("title");
|
||||||
String subTitle = toml.getString("\"sub title\"");
|
String subTitle = toml.getString("\"sub title\"");
|
||||||
|
@ -191,8 +191,8 @@ a = 1
|
||||||
```
|
```
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Toml defaults = new Toml().parse(getDefaultsFile());
|
Toml defaults = new Toml().read(getDefaultsFile());
|
||||||
Toml toml = new Toml(defaults).parse(getTomlFile());
|
Toml toml = new Toml(defaults).read(getTomlFile());
|
||||||
|
|
||||||
Long a = toml.getLong("a"); // returns 1, not 2
|
Long a = toml.getLong("a"); // returns 1, not 2
|
||||||
Long b = toml.getLong("b"); // returns 3, taken from defaults provided to constructor
|
Long b = toml.getLong("b"); // returns 3, taken from defaults provided to constructor
|
||||||
|
@ -217,7 +217,7 @@ for (Map.Entry<String, Object> entry : myToml.entrySet()) {
|
||||||
You can also convert a Toml instance to a `Map<String, Object>`:
|
You can also convert a Toml instance to a `Map<String, Object>`:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Toml toml = new Toml().parse("a = 1");
|
Toml toml = new Toml().read("a = 1");
|
||||||
Map<String, Object> map = toml.to(Map.class);
|
Map<String, Object> map = toml.to(Map.class);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -225,7 +225,7 @@ Map<String, Object> map = toml.to(Map.class);
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Toml toml = new Toml().parse("a = 1");
|
Toml toml = new Toml().read("a = 1");
|
||||||
|
|
||||||
toml.contains("a"); // true
|
toml.contains("a"); // true
|
||||||
toml.conatinsKey("a"); // true
|
toml.conatinsKey("a"); // true
|
||||||
|
|
|
@ -10,17 +10,24 @@ abstract class Container {
|
||||||
abstract boolean accepts(String key);
|
abstract boolean accepts(String key);
|
||||||
abstract void put(String key, Object value);
|
abstract void put(String key, Object value);
|
||||||
abstract Object get(String key);
|
abstract Object get(String key);
|
||||||
|
abstract boolean isImplicit();
|
||||||
|
|
||||||
static class Table extends Container {
|
static class Table extends Container {
|
||||||
private final Map<String, Object> values = new HashMap<String, Object>();
|
private final Map<String, Object> values = new HashMap<String, Object>();
|
||||||
final String name;
|
final String name;
|
||||||
|
final boolean implicit;
|
||||||
|
|
||||||
Table() {
|
Table() {
|
||||||
this.name = null;
|
this(null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Table(String name) {
|
public Table(String name) {
|
||||||
this.name = name;
|
this(name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Table(String tableName, boolean implicit) {
|
||||||
|
this.name = tableName;
|
||||||
|
this.implicit = implicit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -38,6 +45,10 @@ abstract class Container {
|
||||||
return values.get(key);
|
return values.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isImplicit() {
|
||||||
|
return implicit;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This modifies the Table's internal data structure, such that it is no longer usable.
|
* This modifies the Table's internal data structure, such that it is no longer usable.
|
||||||
*
|
*
|
||||||
|
@ -85,6 +96,10 @@ abstract class Container {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isImplicit() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
List<Map<String, Object>> getValues() {
|
List<Map<String, Object>> getValues() {
|
||||||
ArrayList<Map<String, Object>> unwrappedValues = new ArrayList<Map<String,Object>>();
|
ArrayList<Map<String, Object>> unwrappedValues = new ArrayList<Map<String,Object>>();
|
||||||
for (Container.Table table : values) {
|
for (Container.Table table : values) {
|
||||||
|
|
|
@ -205,9 +205,6 @@ class Results {
|
||||||
|
|
||||||
void startTables(Identifier id, AtomicInteger line) {
|
void startTables(Identifier id, AtomicInteger line) {
|
||||||
String tableName = id.getBareName();
|
String tableName = id.getBareName();
|
||||||
if (!tables.add(tableName)) {
|
|
||||||
errors.duplicateTable(tableName, line.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
while (stack.size() > 1) {
|
while (stack.size() > 1) {
|
||||||
stack.pop();
|
stack.pop();
|
||||||
|
@ -219,12 +216,16 @@ class Results {
|
||||||
Container currentContainer = stack.peek();
|
Container currentContainer = stack.peek();
|
||||||
if (currentContainer.get(tablePart) instanceof Container) {
|
if (currentContainer.get(tablePart) instanceof Container) {
|
||||||
Container nextTable = (Container) currentContainer.get(tablePart);
|
Container nextTable = (Container) currentContainer.get(tablePart);
|
||||||
|
if (i == tableParts.length - 1 && !nextTable.isImplicit()) {
|
||||||
|
errors.duplicateTable(tableName, line.get());
|
||||||
|
return;
|
||||||
|
}
|
||||||
stack.push(nextTable);
|
stack.push(nextTable);
|
||||||
if (stack.peek() instanceof Container.TableArray) {
|
if (stack.peek() instanceof Container.TableArray) {
|
||||||
stack.push(((Container.TableArray) stack.peek()).getCurrent());
|
stack.push(((Container.TableArray) stack.peek()).getCurrent());
|
||||||
}
|
}
|
||||||
} else if (currentContainer.accepts(tablePart)) {
|
} else if (currentContainer.accepts(tablePart)) {
|
||||||
startTable(tablePart, line);
|
startTable(tablePart, i < tableParts.length - 1, line);
|
||||||
} else {
|
} else {
|
||||||
errors.tableDuplicatesKey(tablePart, line);
|
errors.tableDuplicatesKey(tablePart, line);
|
||||||
break;
|
break;
|
||||||
|
@ -250,6 +251,14 @@ class Results {
|
||||||
return newTable;
|
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) {
|
private String getInlineTablePath(String key) {
|
||||||
Iterator<Container> descendingIterator = stack.descendingIterator();
|
Iterator<Container> descendingIterator = stack.descendingIterator();
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
|
@ -110,6 +110,11 @@ public class TableArrayTest {
|
||||||
assertNull(toml.getTable("a[1]"));
|
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)
|
@Test(expected = IllegalStateException.class)
|
||||||
public void should_fail_on_empty_table_array_name() {
|
public void should_fail_on_empty_table_array_name() {
|
||||||
new Toml().read("[[]]");
|
new Toml().read("[[]]");
|
||||||
|
|
Loading…
Reference in a new issue