Created
December 18, 2014 16:08
-
-
Save toby55kij/e79df4fa3db2ae239776 to your computer and use it in GitHub Desktop.
Groovyで汎用pretty-print(モドキ)を作成してみる ref: http://qiita.com/toby55kij/items/57e7f851b1b51e314ef0
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Object.metaClass { | |
//indent | |
indent << {String indentString, int indentLevel, boolean skipIndent -> | |
(indentString * (skipIndent ? 0 : indentLevel)) + delegate | |
} | |
//prettyPrint | |
prettyPrint << { -> | |
delegate.prettyPrint(' ') | |
} | |
prettyPrint << {String indentString -> | |
delegate.prettyPrint(indentString, 0, false) | |
} | |
prettyPrint << {String indentString, int indentLevel, boolean skipIndent -> | |
if (delegate) { | |
delegate.indentPrint(indentString, indentLevel, skipIndent) | |
} | |
else { | |
delegate.indent(indentString, indentLevel, skipIndent) | |
} | |
} | |
//indentPrint | |
indentPrint << {String indentString, int indentLevel, boolean skipIndent -> | |
Map properties = delegate.getProperties() | |
properties.remove('class') | |
properties.remove('declaringClass') | |
properties.remove('metaClass') | |
properties.indentPrint(indentString, indentLevel, skipIndent) | |
} | |
} | |
Closure indentList = {String indentString, int indentLevel, boolean skipIndent -> | |
'['.indent(indentString, indentLevel, skipIndent) + delegate.collectMany { | |
[System.lineSeparator() + it.prettyPrint(indentString, indentLevel + 1, false)] | |
}.join(',') + System.lineSeparator() + ']'.indent(indentString, indentLevel, false) | |
} | |
Iterable.metaClass { | |
//indentPrint | |
indentPrint << indentList | |
} | |
Enumeration.metaClass { | |
//indentPrint | |
indentPrint << {String indentString, int indentLevel, boolean skipIndent -> | |
delegate.iterator().indentPrint(indentString, indentLevel, skipIndent) | |
} | |
} | |
Iterator.metaClass { | |
//indentPrint | |
indentPrint << indentList | |
} | |
Map.metaClass { | |
//indentPrint | |
indentPrint << indentList | |
} | |
Map.Entry.metaClass { | |
//indentPrint | |
indentPrint << {String indentString, int indentLevel, boolean skipIndent -> | |
delegate.key?.prettyPrint(indentString, indentLevel, skipIndent) + | |
': ' + delegate.value?.prettyPrint(indentString, indentLevel, true) | |
} | |
} | |
Closure indentSimple = {String indentString, int indentLevel, boolean skipIndent -> | |
delegate.indent(indentString, indentLevel, skipIndent) | |
} | |
Boolean.metaClass { | |
//indentPrint | |
indentPrint << indentSimple | |
} | |
Number.metaClass { | |
//indentPrint | |
indentPrint << indentSimple | |
} | |
Closure indentToString = {String indentString, int indentLevel, boolean skipIndent -> | |
delegate.toString().indentPrint(indentString, indentLevel, skipIndent) | |
} | |
Character.metaClass { | |
//indentPrint | |
indentPrint << indentToString | |
} | |
CharSequence.metaClass { | |
//indentPrint | |
indentPrint << {String indentString, int indentLevel, boolean skipIndent -> | |
'"'.indent(indentString, indentLevel, skipIndent) + delegate?.replaceAll('"','\\\\"') + '"' | |
} | |
} | |
Date.metaClass { | |
//indentPrint | |
indentPrint << {String indentString, int indentLevel, boolean skipIndent -> | |
delegate.format("yyyy-MM-dd'T'HH:mm:ssZ", TimeZone.getTimeZone("GMT")).indentPrint(indentString, indentLevel, skipIndent) | |
} | |
} | |
Calendar.metaClass { | |
//indentPrint | |
indentPrint << {String indentString, int indentLevel, boolean skipIndent -> | |
delegate.getTime().indentPrint(indentString, indentLevel, skipIndent) | |
} | |
} | |
UUID.metaClass { | |
//indentPrint | |
indentPrint << indentToString | |
} | |
URL.metaClass { | |
//indentPrint | |
indentPrint << indentToString | |
} | |
Enum.metaClass { | |
//indentPrint | |
indentPrint << {String indentString, int indentLevel, boolean skipIndent -> | |
delegate.name().indentPrint(indentString, indentLevel, skipIndent) | |
} | |
} | |
Closure indentPrimitiveArray = {String indentString, int indentLevel, boolean skipIndent -> | |
delegate.toList().indentPrint(indentString, indentLevel, skipIndent) | |
} | |
Object[].metaClass { | |
//indentPrint | |
indentPrint << indentPrimitiveArray | |
} | |
boolean[].metaClass { | |
//indentPrint | |
indentPrint << indentPrimitiveArray | |
} | |
byte[].metaClass { | |
//indentPrint | |
indentPrint << indentPrimitiveArray | |
} | |
char[].metaClass { | |
//indentPrint | |
indentPrint << indentPrimitiveArray | |
} | |
short[].metaClass { | |
//indentPrint | |
indentPrint << indentPrimitiveArray | |
} | |
int[].metaClass { | |
//indentPrint | |
indentPrint << indentPrimitiveArray | |
} | |
long[].metaClass { | |
//indentPrint | |
indentPrint << indentPrimitiveArray | |
} | |
float[].metaClass { | |
//indentPrint | |
indentPrint << indentPrimitiveArray | |
} | |
double[].metaClass { | |
//indentPrint | |
indentPrint << indentPrimitiveArray | |
} | |
//サンプル(Sample) | |
//List | |
char ch = 'C' | |
Date date = new Date(1234567890123) | |
Calendar cal = Calendar.instance | |
cal.timeZone = TimeZone.getTimeZone("GMT") | |
cal.set(year:2011, month:Calendar.DECEMBER, date:25, hourOfDay:10, minute:9, second:8) | |
UUID uid = UUID.fromString("507e2e2e-bf1e-4ab0-97d3-cf85ea6d4a48") | |
URL url = new URL('http://groovy-lang.org/') | |
List q1 = [100, 2.3, 1/2, true, null, '\"abc\"', ch, date, cal, uid, url] | |
String a1 = '''[ | |
100, | |
2.3, | |
0.5, | |
true, | |
null, | |
"\\\"abc\\\"", | |
"C", | |
"2009-02-13T23:31:30+0000", | |
"2011-12-25T10:09:08+0000", | |
"507e2e2e-bf1e-4ab0-97d3-cf85ea6d4a48", | |
"http://groovy-lang.org/" | |
]'''.replaceAll('\n', System.lineSeparator()) | |
//println q1.prettyPrint() | |
assert q1.prettyPrint() == a1 | |
//println q1.iterator().prettyPrint() | |
assert q1.iterator().prettyPrint() == a1 | |
//Map | |
Map q2 = [1.0:'this', 2.0:null] | |
String a2 = '''[ | |
1.0: "this", | |
2.0: null | |
]'''.replaceAll('\n', System.lineSeparator()) | |
//println q2.prettyPrint() | |
assert q2.prettyPrint() == a2 | |
//Map & List | |
def q3 = [foo:1, bar:2, baz:["日本語", 'C:\\Windows', "3"], zoo:[on:"on", off:"off", 1:2]] | |
String a3 = '''[ | |
"foo": 1, | |
"bar": 2, | |
"baz": [ | |
"日本語", | |
"C:\\Windows", | |
"3" | |
], | |
"zoo": [ | |
"on": "on", | |
"off": "off", | |
1: 2 | |
] | |
]'''.replaceAll('\n', System.lineSeparator()) | |
//println q3.prettyPrint() | |
assert q3.prettyPrint() == a3 | |
//POGO | |
class Name { | |
String firstName | |
String familyName | |
} | |
Name q4 = new Name(firstName:'Yasuharu', familyName:'Hayami') | |
String a4 = '''[ | |
"firstName": "Yasuharu", | |
"familyName": "Hayami" | |
]'''.replaceAll('\n', System.lineSeparator()) | |
//println q4.prettyPrint() | |
assert q4.prettyPrint() == a4 | |
//Arrays - boolean[] | |
def q5 = [true,false] as boolean[] | |
String a5 = '''[ | |
true, | |
false | |
]''' | |
//println q5.prettyPrint() | |
assert q5.prettyPrint() == a5 | |
//Arrays - char[] | |
def q6 = ['1','2','3'] as char[] | |
String a6 = '''[ | |
"1", | |
"2", | |
"3" | |
]''' | |
//println q6.prettyPrint() | |
assert q6.prettyPrint() == a6 | |
//Arrays - int[],byte[],short[],long[] | |
def q7 = [[1,2,3] as int[],[1,2,3] as byte[],[1,2,3] as short[],[1,2,3] as long[]] | |
String a7 = '''[ | |
1, | |
2, | |
3 | |
]''' | |
//println q7.prettyPrint() | |
q7.each {assert it.prettyPrint() == a7} | |
//Arrays - float[],double[] | |
def q8 = [[1.0,2.0,3.0] as float[],[1.0,2.0,3.0] as double[]] | |
String a8 = '''[ | |
1.0, | |
2.0, | |
3.0 | |
]''' | |
//println q8.prettyPrint() | |
q8.each {assert it.prettyPrint() == a8} | |
//Arrays - BigDecimal[] | |
def q9 = [1/2, 3/2, 5/2] as BigDecimal[] | |
String a9 = '''[ | |
0.5, | |
1.5, | |
2.5 | |
]''' | |
//println q9.prettyPrint() | |
assert q9.prettyPrint() == a9 | |
//Enum | |
enum EnumNumber { | |
First, | |
Second, | |
Third | |
} | |
def q10 = EnumNumber.values() | |
String a10 = '''[ | |
"First", | |
"Second", | |
"Third" | |
]''' | |
//println q10.prettyPrint() | |
assert q10.prettyPrint() == a10 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment