Skip to content

Instantly share code, notes, and snippets.

@toby55kij
Created December 18, 2014 16:08
Show Gist options
  • Save toby55kij/e79df4fa3db2ae239776 to your computer and use it in GitHub Desktop.
Save toby55kij/e79df4fa3db2ae239776 to your computer and use it in GitHub Desktop.
Groovyで汎用pretty-print(モドキ)を作成してみる ref: http://qiita.com/toby55kij/items/57e7f851b1b51e314ef0
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