mirror of
https://github.com/plexusorg/toml4j.git
synced 2024-12-29 11:42:15 +00:00
Merge branch 'wip'
This commit is contained in:
commit
55d5b91e1d
10 changed files with 103 additions and 21 deletions
11
CHANGELOG.md
11
CHANGELOG.md
|
@ -1,5 +1,16 @@
|
||||||
# toml4j Changelog
|
# toml4j Changelog
|
||||||
|
|
||||||
|
## 0.6.0 / 2016-06-14
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
* Toml#toMap() convenience method (thanks to __[andytill](https://github.com/andytill)__ and __[Gyscos](https://github.com/Gyscos))
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
* Transient fields are not written to TOML files (thanks to __[lare96](https://github.com/lare96)__)
|
||||||
|
* Support positive timezone offset in datetime (thanks to __[aloyse](https://github.com/aloyse)__)
|
||||||
|
|
||||||
## 0.5.1 / 2016-01-24
|
## 0.5.1 / 2016-01-24
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
29
README.md
29
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.5.1</version>
|
<version>0.6.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -41,6 +41,14 @@ An exception is thrown if the source is not valid TOML.
|
||||||
|
|
||||||
The data can then be accessed either by converting the Toml instance to your own class or by accessing tables and keys by name.
|
The data can then be accessed either by converting the Toml instance to your own class or by accessing tables and keys by name.
|
||||||
|
|
||||||
|
### Maps
|
||||||
|
|
||||||
|
`Toml#toMap()` is a quick way to turn a Toml instance into a `Map<String, Object>`.
|
||||||
|
|
||||||
|
```java
|
||||||
|
Map<String, Object> map = new Toml().read("a=1").toMap();
|
||||||
|
```
|
||||||
|
|
||||||
### Custom classes
|
### Custom classes
|
||||||
|
|
||||||
`Toml#to(Class<T>)` maps a Toml instance to the given class.
|
`Toml#to(Class<T>)` maps a Toml instance to the given class.
|
||||||
|
@ -214,13 +222,6 @@ for (Map.Entry<String, Object> entry : myToml.entrySet()) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also convert a Toml instance to a `Map<String, Object>`:
|
|
||||||
|
|
||||||
```java
|
|
||||||
Toml toml = new Toml().read("a = 1");
|
|
||||||
Map<String, Object> map = toml.to(Map.class);
|
|
||||||
```
|
|
||||||
|
|
||||||
`Toml#contains(String)` verifies that the instance contains a key of any type (primitive, table or array of tables) of the given name. `Toml#containsPrimitive(String)`, `Toml#containsTable(String)` and `Toml#containsTableArray(String)` return true only if a key exists and is a primitive, table or array of tables, respectively. Compound keys can be used to check existence at any depth.
|
`Toml#contains(String)` verifies that the instance contains a key of any type (primitive, table or array of tables) of the given name. `Toml#containsPrimitive(String)`, `Toml#containsTable(String)` and `Toml#containsTableArray(String)` return true only if a key exists and is a primitive, table or array of tables, respectively. Compound keys can be used to check existence at any depth.
|
||||||
|
|
||||||
|
|
||||||
|
@ -245,7 +246,15 @@ class AClass {
|
||||||
|
|
||||||
TomlWriter tomlWriter = new TomlWriter();
|
TomlWriter tomlWriter = new TomlWriter();
|
||||||
AClass obj = new AClass();
|
AClass obj = new AClass();
|
||||||
|
|
||||||
|
Map<String, Object> map = new HashMap<String, Object>();
|
||||||
|
int[] intArray = { 2, 3 };
|
||||||
|
map.put("anInt", 1);
|
||||||
|
map.put("anArray", intArray);
|
||||||
|
|
||||||
String tomlString = tomlWriter.write(obj);
|
String tomlString = tomlWriter.write(obj);
|
||||||
|
tomlString = tomlWriter.write(map);
|
||||||
|
|
||||||
tomlWriter.write(obj, new File("path/to/file"));
|
tomlWriter.write(obj, new File("path/to/file"));
|
||||||
tomlWriter.write(obj, new ByteArrayOutputStream());
|
tomlWriter.write(obj, new ByteArrayOutputStream());
|
||||||
tomlWriter.write(obj, new OutputStreamWriter(anOutputStream));
|
tomlWriter.write(obj, new OutputStreamWriter(anOutputStream));
|
||||||
|
@ -296,6 +305,10 @@ Output:
|
||||||
|
|
||||||
Date precision is limited to milliseconds.
|
Date precision is limited to milliseconds.
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
Please see the [changelog](CHANGELOG.md).
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Please see the [contribution guidelines](CONTRIBUTING.md).
|
Please see the [contribution guidelines](CONTRIBUTING.md).
|
||||||
|
|
|
@ -40,7 +40,7 @@ class DateValueReaderWriter implements ValueReader, ValueWriter {
|
||||||
|
|
||||||
for (int i = index.get(); i < original.length(); i = index.incrementAndGet()) {
|
for (int i = index.get(); i < original.length(); i = index.incrementAndGet()) {
|
||||||
char c = original.charAt(i);
|
char c = original.charAt(i);
|
||||||
if (Character.isDigit(c) || c == '-' || c == ':' || c == '.' || c == 'T' || c == 'Z') {
|
if (Character.isDigit(c) || c == '-' || c == '+' || c == ':' || c == '.' || c == 'T' || c == 'Z') {
|
||||||
sb.append(c);
|
sb.append(c);
|
||||||
} else {
|
} else {
|
||||||
index.decrementAndGet();
|
index.decrementAndGet();
|
||||||
|
|
|
@ -50,7 +50,7 @@ class ObjectValueWriter implements ValueWriter {
|
||||||
Iterator<Field> iterator = fields.iterator();
|
Iterator<Field> iterator = fields.iterator();
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
Field field = iterator.next();
|
Field field = iterator.next();
|
||||||
if ((Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) || field.isSynthetic()) {
|
if ((Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) || field.isSynthetic() || Modifier.isTransient(field.getModifiers())) {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -302,6 +302,16 @@ public class Toml {
|
||||||
* @return A new instance of targetClass.
|
* @return A new instance of targetClass.
|
||||||
*/
|
*/
|
||||||
public <T> T to(Class<T> targetClass) {
|
public <T> T to(Class<T> targetClass) {
|
||||||
|
JsonElement json = DEFAULT_GSON.toJsonTree(toMap());
|
||||||
|
|
||||||
|
if (targetClass == JsonElement.class) {
|
||||||
|
return targetClass.cast(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DEFAULT_GSON.fromJson(json, targetClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Object> toMap() {
|
||||||
HashMap<String, Object> valuesCopy = new HashMap<String, Object>(values);
|
HashMap<String, Object> valuesCopy = new HashMap<String, Object>(values);
|
||||||
|
|
||||||
if (defaults != null) {
|
if (defaults != null) {
|
||||||
|
@ -312,13 +322,7 @@ public class Toml {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonElement json = DEFAULT_GSON.toJsonTree(valuesCopy);
|
return valuesCopy;
|
||||||
|
|
||||||
if (targetClass == JsonElement.class) {
|
|
||||||
return targetClass.cast(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
return DEFAULT_GSON.fromJson(json, targetClass);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -134,7 +134,7 @@ public class BurntSushiValidEncoderTest {
|
||||||
|
|
||||||
private void runEncoder(String testName, TomlWriter tomlWriter) {
|
private void runEncoder(String testName, TomlWriter tomlWriter) {
|
||||||
InputStream inputTomlStream = getClass().getResourceAsStream("burntsushi/valid/" + testName + ".toml");
|
InputStream inputTomlStream = getClass().getResourceAsStream("burntsushi/valid/" + testName + ".toml");
|
||||||
String expectedToml = convertStreamToString(inputTomlStream);
|
String expectedToml = convertStreamToString(inputTomlStream).replaceAll("\r\n", "\n");
|
||||||
|
|
||||||
Reader inputJsonReader = new InputStreamReader(getClass().getResourceAsStream("burntsushi/valid/" + testName + ".json"));
|
Reader inputJsonReader = new InputStreamReader(getClass().getResourceAsStream("burntsushi/valid/" + testName + ".json"));
|
||||||
JsonElement jsonInput = GSON.fromJson(inputJsonReader, JsonElement.class);
|
JsonElement jsonInput = GSON.fromJson(inputJsonReader, JsonElement.class);
|
||||||
|
|
|
@ -248,7 +248,7 @@ public class BurntSushiValidTest {
|
||||||
private void run(String testName) {
|
private void run(String testName) {
|
||||||
InputStream inputTomlStream = getClass().getResourceAsStream("burntsushi/valid/" + testName + ".toml");
|
InputStream inputTomlStream = getClass().getResourceAsStream("burntsushi/valid/" + testName + ".toml");
|
||||||
// InputStream inputToml = getClass().getResourceAsStream("burntsushi/valid/" + testName + ".toml");
|
// InputStream inputToml = getClass().getResourceAsStream("burntsushi/valid/" + testName + ".toml");
|
||||||
String inputToml = convertStreamToString(inputTomlStream);
|
String inputToml = convertStreamToString(inputTomlStream).replaceAll("\r\n", "\n");
|
||||||
Reader expectedJsonReader = new InputStreamReader(getClass().getResourceAsStream("burntsushi/valid/" + testName + ".json"));
|
Reader expectedJsonReader = new InputStreamReader(getClass().getResourceAsStream("burntsushi/valid/" + testName + ".json"));
|
||||||
JsonElement expectedJson = GSON.fromJson(expectedJsonReader, JsonElement.class);
|
JsonElement expectedJson = GSON.fromJson(expectedJsonReader, JsonElement.class);
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,18 @@ public class DateTest {
|
||||||
Toml toml = new Toml().read("a_date = 1979-05-27T00:32:00-07:00");
|
Toml toml = new Toml().read("a_date = 1979-05-27T00:32:00-07:00");
|
||||||
|
|
||||||
Calendar calendar = Calendar.getInstance(UTC);
|
Calendar calendar = Calendar.getInstance(UTC);
|
||||||
calendar.set(1979, Calendar.MAY, 27, 7, 32, 00);
|
calendar.set(1979, Calendar.MAY, 27, 7, 32, 0);
|
||||||
|
calendar.set(Calendar.MILLISECOND, 0);
|
||||||
|
|
||||||
|
assertEquals(calendar.getTime(), toml.getDate("a_date"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void should_get_date_with_positive_offset() throws Exception {
|
||||||
|
Toml toml = new Toml().read("a_date = 1979-05-27T07:32:00+07:00");
|
||||||
|
|
||||||
|
Calendar calendar = Calendar.getInstance(UTC);
|
||||||
|
calendar.set(1979, Calendar.MAY, 27, 0, 32, 0);
|
||||||
calendar.set(Calendar.MILLISECOND, 0);
|
calendar.set(Calendar.MILLISECOND, 0);
|
||||||
|
|
||||||
assertEquals(calendar.getTime(), toml.getDate("a_date"));
|
assertEquals(calendar.getTime(), toml.getDate("a_date"));
|
||||||
|
|
|
@ -268,6 +268,11 @@ public class TomlWriterTest {
|
||||||
assertEquals("[b.c]\nanInt = 1\n", new TomlWriter().write(new A()));
|
assertEquals("[b.c]\nanInt = 1\n", new TomlWriter().write(new A()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void should_write_map() throws Exception {
|
||||||
|
assertEquals("a = 1\n", new TomlWriter().write(new Toml().read("a = 1").toMap()));
|
||||||
|
}
|
||||||
|
|
||||||
class Base {
|
class Base {
|
||||||
protected int anInt = 2;
|
protected int anInt = 2;
|
||||||
}
|
}
|
||||||
|
@ -451,6 +456,11 @@ public class TomlWriterTest {
|
||||||
int a = 1;
|
int a = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class TransientClass {
|
||||||
|
int a = 2;
|
||||||
|
transient int b = 3;
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void should_write_to_writer() throws IOException {
|
public void should_write_to_writer() throws IOException {
|
||||||
StringWriter output = new StringWriter();
|
StringWriter output = new StringWriter();
|
||||||
|
@ -475,6 +485,13 @@ public class TomlWriterTest {
|
||||||
assertEquals("a = 1\n", readFile(output));
|
assertEquals("a = 1\n", readFile(output));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void should_skip_transient_fields() throws Exception {
|
||||||
|
String toml = new TomlWriter().write(new TransientClass());
|
||||||
|
|
||||||
|
assertEquals("a = 2\n", toml);
|
||||||
|
}
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
public void should_refuse_to_write_string_fragment() {
|
public void should_refuse_to_write_string_fragment() {
|
||||||
new TomlWriter().write("fragment");
|
new TomlWriter().write("fragment");
|
||||||
|
|
26
src/test/java/com/moandjiezana/toml/Toml_ToMapTest.java
Normal file
26
src/test/java/com/moandjiezana/toml/Toml_ToMapTest.java
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
package com.moandjiezana.toml;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class Toml_ToMapTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void should_convert_simple_values() {
|
||||||
|
Map<String, Object> toml = new Toml().read("a = 1").toMap();
|
||||||
|
|
||||||
|
Assert.assertEquals(Long.valueOf(1), toml.get("a"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void should_covert_table() throws Exception {
|
||||||
|
Map<String, Object> toml = new Toml().read("c = 2\n [a]\n b = 1").toMap();
|
||||||
|
|
||||||
|
Assert.assertEquals(Long.valueOf(1), ((Map<String, Object>) toml.get("a")).get("b"));
|
||||||
|
Assert.assertEquals(Long.valueOf(2), toml.get("c"));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue