Gradle Version Catalog 見づらい TOML インラインテーブル を別フォーマットで表示してみる

すべてインラインテーブルで記述したもののなんか見づらい。

なんかいい方法はないかな、と模索。

Python 3.11 で同梱された tomllib を使って別フォーマットで整形して表示してみます。

👉 How to Use Python 3.11's New TOML Parser, tomllib - The Invent with Python Blog hatena-bookmark

記事にするには大きすぎるので [plugins] だけで。


import tomllib
import pprint
import json
import yaml
import pandas
import tabulate

file = "/path/to/libs.versions.toml"

with open(file, "rb") as fp:
  data = tomllib.load(fp)["plugins"] # only plugins

# raw (dic)
print(data)

# pretty print
pprint.pprint(data)

# json
print(json.dumps(data, indent=2))

# yaml
print(yaml.dump(data))

# pandas + tabulate
df = pandas.DataFrame.from_dict(data, orient='index')
print(tabulate.tabulate(df, headers='keys'))

以下、出力結果。

 

■ raw (dic)


{'android-application': {'id': 'com.android.application', 'version': {'ref': 'agp'}}, 'kotlin-android': {'id': 'org.jetbrains.kotlin.android', 'version': {'ref': 'kotlin'}}, 'kotlin-kapt': {'id': 'org.jetbrains.kotlin.kapt', 'version': {'ref': 'kotlin'}}, 'kotlin-plugin-serialization': {'id': 'org.jetbrains.kotlin.plugin.serialization', 'version': {'ref': 'kotlin'}}, 'hilt': {'id': 'com.google.dagger.hilt.android', 'version': {'ref': 'hilt'}}, 'sqldelight': {'id': 'app.cash.sqldelight', 'version': {'ref': 'sqldelight'}}, 'google-services': {'id': 'com.google.gms.google-services', 'version': {'ref': 'google-services'}}, 'firebase-crashlytics': {'id': 'com.google.firebase.crashlytics', 'version': {'ref': 'firebase-crashlytics'}}, 'ben-manes-versions': {'id': 'com.github.ben-manes.versions', 'version': '0.44.0'}}

 

■ pretty print


{'android-application': {'id': 'com.android.application',
                         'version': {'ref': 'agp'}},
 'ben-manes-versions': {'id': 'com.github.ben-manes.versions',
                        'version': '0.44.0'},
 'firebase-crashlytics': {'id': 'com.google.firebase.crashlytics',
                          'version': {'ref': 'firebase-crashlytics'}},
 'google-services': {'id': 'com.google.gms.google-services',
                     'version': {'ref': 'google-services'}},
 'hilt': {'id': 'com.google.dagger.hilt.android', 'version': {'ref': 'hilt'}},
 'kotlin-android': {'id': 'org.jetbrains.kotlin.android',
                    'version': {'ref': 'kotlin'}},
 'kotlin-kapt': {'id': 'org.jetbrains.kotlin.kapt',
                 'version': {'ref': 'kotlin'}},
 'kotlin-plugin-serialization': {'id': 'org.jetbrains.kotlin.plugin.serialization',
                                 'version': {'ref': 'kotlin'}},
 'sqldelight': {'id': 'app.cash.sqldelight', 'version': {'ref': 'sqldelight'}}}

 

■ json


{
  "android-application": {
    "id": "com.android.application",
    "version": {
      "ref": "agp"
    }
  },
  "kotlin-android": {
    "id": "org.jetbrains.kotlin.android",
    "version": {
      "ref": "kotlin"
    }
  },
  "kotlin-kapt": {
    "id": "org.jetbrains.kotlin.kapt",
    "version": {
      "ref": "kotlin"
    }
  },
  "kotlin-plugin-serialization": {
    "id": "org.jetbrains.kotlin.plugin.serialization",
    "version": {
      "ref": "kotlin"
    }
  },
  "hilt": {
    "id": "com.google.dagger.hilt.android",
    "version": {
      "ref": "hilt"
    }
  },
  "sqldelight": {
    "id": "app.cash.sqldelight",
    "version": {
      "ref": "sqldelight"
    }
  },
  "google-services": {
    "id": "com.google.gms.google-services",
    "version": {
      "ref": "google-services"
    }
  },
  "firebase-crashlytics": {
    "id": "com.google.firebase.crashlytics",
    "version": {
      "ref": "firebase-crashlytics"
    }
  },
  "ben-manes-versions": {
    "id": "com.github.ben-manes.versions",
    "version": "0.44.0"
  }
}

 

■ yaml


android-application:
  id: com.android.application
  version:
    ref: agp
ben-manes-versions:
  id: com.github.ben-manes.versions
  version: 0.44.0
firebase-crashlytics:
  id: com.google.firebase.crashlytics
  version:
    ref: firebase-crashlytics
google-services:
  id: com.google.gms.google-services
  version:
    ref: google-services
hilt:
  id: com.google.dagger.hilt.android
  version:
    ref: hilt
kotlin-android:
  id: org.jetbrains.kotlin.android
  version:
    ref: kotlin
kotlin-kapt:
  id: org.jetbrains.kotlin.kapt
  version:
    ref: kotlin
kotlin-plugin-serialization:
  id: org.jetbrains.kotlin.plugin.serialization
  version:
    ref: kotlin
sqldelight:
  id: app.cash.sqldelight
  version:
    ref: sqldelight

 

■ pandas + tabulate


                             id                                         version
---------------------------  -----------------------------------------  -------------------------------
android-application          com.android.application                    {'ref': 'agp'}
kotlin-android               org.jetbrains.kotlin.android               {'ref': 'kotlin'}
kotlin-kapt                  org.jetbrains.kotlin.kapt                  {'ref': 'kotlin'}
kotlin-plugin-serialization  org.jetbrains.kotlin.plugin.serialization  {'ref': 'kotlin'}
hilt                         com.google.dagger.hilt.android             {'ref': 'hilt'}
sqldelight                   app.cash.sqldelight                        {'ref': 'sqldelight'}
google-services              com.google.gms.google-services             {'ref': 'google-services'}
firebase-crashlytics         com.google.firebase.crashlytics            {'ref': 'firebase-crashlytics'}
ben-manes-versions           com.github.ben-manes.versions              0.44.0

 

■ まとめ

Python って、簡単にいろんなことできるんですね!


Java home is different. が消えない。

私の場合は ./gradlew --info での表示に気づきましたが。


Java home is different.

これが消えない。

前にも似たようなことがありました。



設定の3ヶ所を確認する。


- IDE設定の変更

- 環境変数 JAVA_HOME の変更

- gradle.properties の org.gradle.java.home

👉 AndroidStudio 利用する Java (JDK) の選択・設定の方法 hatena-bookmark

3つの設定内容は一致している。

しかし、消えない。

調べるとこんな。

The last thing that helped is deleting both the .gradle and .idea projects. All of sudden, everything worked magically!
– Vinayak Ponangi Jun 2 at 19:00

👉 java - IntelliJ Build Error Context Mismatch - Stack Overflow hatena-bookmark

プロジェクト root 直下のディレクトリごと 2つ消します。


.gradle/

.idea/

削除後は、再度プロジェクトディレクトリを読み込むと、2つのディレクトリは新たに作成されます。

これで直りました。

なんすかね。

最近は、環境まわりではハマること多くなってきてません?

👉 Gradle sync failed: Java home is different. : IDEA-266535 hatena-bookmark


【Android Studio】TOML内のすべてをインライン・テーブルに書き換える Live Templates 用 Groovy スクリプト

以前書いたやつですが1行ごとでは面倒な場合が多いです。

toml live template
👉 【Android Studio】Gradle Version Catalog「Live Template」を使って インライン・テーブル に瞬時に書き換える hatena-bookmark

一括でまとめて


"androidx.cardview:cardview:1.0.0"

のような記述を


{ module = "androidx.cardview:cardview", version = "1.0.0" }

のように置き換えたいです。

今回は、簡単な Groovy スクリプト を使ってそんなツールを作ってみました。

Android Studio 単体で利用できます。

 

■ 使い方

Android Studio 上で、

TOMLなどの以下のような箇所を含む複数行をクリップボードにコピーします。


[libraries]
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" }
androidx-cardview = "androidx.cardview:cardview:1.0.0"

[plugins]
android-application = "com.android.application:7.3.1"
kotlin-android = "org.jetbrains.kotlin.android:1.7.20"

inl」 (inline) と文字入力して、Live Templates で一括置換したものを入力します。


[libraries]
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" }
androidx-cardview = { module = "androidx.cardview:cardview", version = "1.0.0" }

[plugins]
android-application = { id = "com.android.application", version = "7.3.1" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version = "1.7.20" }

必要な部分だけ置換します。

 

■ 設定

以下のスクリプト inline.groovy をどこかに配置します。

Android Studio の Live Templates にそのスクリプトを実行するように設定します。

注意する点は、スクリプトを配置した「絶対パス」を設定することです。

 

■ 追記

強引に正規表現で別ファイルを使わない版。
最近はこれを使ってます。


groovyScript("def ls = System.lineSeparator();return _1.split(ls).collect() { l -> l.replaceAll(/^([a-z0-9\\-]+) = \"([^\\:\"]+):([^\\:\"]+)\"/) { _, k, i, v -> \"$k = { id = \\\"$i\\\", version = \\\"$v\\\" }\"}.replaceAll(/^([a-z0-9\\-]+) = \"([^\\:\"]+):([^\\:\"]+):([^\\:\"]+)\"/) { _, k, g, a, v -> \"$k = { module = \\\"$g:$a\\\", version = \\\"$v\\\" }\"}}.join(ls)", clipboard());

👉 Gist - comment - inline.groovy hatena-bookmark

👉 Jetpack Compose Samples でも使われている「Version catalog update plugin」で libs.versions.toml を書き出してみる hatena-bookmark
👉 How to debug groovy script using in live template? – IDEs Support (IntelliJ Platform) | JetBrains hatena-bookmark
👉 Live template variables | IntelliJ IDEA hatena-bookmark