Skip to content

Commit

Permalink
プリロードのテスト等修正 (#141)
Browse files Browse the repository at this point in the history
* Fix local data source bug

* Update readme

* Fix regex to convert file URL to path

Co-authored-by: kamataryo <kamataryo@users.noreply.github.com>
  • Loading branch information
Kamata, Ryo and kamataryo authored Jan 20, 2022
1 parent e31eb1b commit 0bd6100
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 13 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,5 @@ yarn-error.log*

// Use npm
yarn.lock

test/*.zip
38 changes: 37 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,42 @@ normalize('北海道札幌市西区24-2-2-3-3', {level}).then(result => {
})
```

### オプション

#### `config.townCacheSize: number`

@geolonia/normalize-japanese-addresses は市区町村毎の最新の町丁目のデータを web API から取得し住所の正規化を行います。 `townCacheSize` オプションはキャッシュする市区町村の数を変更します。デフォルトは 1,000 件になっています。

#### `config.preloadCache?: boolean`

全ての市区町村の町丁目のキャッシュをプリロードするかどうかを指定します。このオプションは Node.js でのみ有効です。`true` が指定された場合 `townCacheSize` の値を無視して無制限にキャッシュを作成します。キャッシュはプロセスの終了の際に破棄されます。

#### `config.japaneseAddressesApi: string`

町丁目データを配信する web API のエンドポイントを指定します。デフォルトは `https://geolonia.github.io/japanese-addresses/api/ja` です。この API から配信されるデータのディレクトリ構成は [Geolonia 住所データ](https://github.com/geolonia/japanese-addresses/tree/develop/api)を参考にしてください。

`japaneseAddressesApi` オプションを `preloadCache` と同時に使用することで町丁目のキャッシュをローカルファイルから作成できます。この場合は `japaneseAddressesApi` に対して API の zip ファイルのパスを `file://` 形式の URL で指定してください。

```shell
# Geolonia 住所データのダウンロード
$ curl -sL https://github.com/geolonia/japanese-addresses/archive/refs/heads/master.zip > /path/to/japanese-addresses-master.zip
```

```javascript
// preloadCache オプションの使用例
const { config, normalize } = require('@geolonia/normalize-japanese-addresses')
config.preloadCache = true
config.japaneseAddressesApi = 'file://path/to/japanese-addresses-master.zip'

(function(){
for (address of addresses) {
await normalize(address)
}
})()
```



## 正規化の内容

* `XXX郡` などの郡の名前が省略されている住所に対しては、それを補完します。
Expand Down Expand Up @@ -113,4 +149,4 @@ $ node sample.js
- ソースコードのライセンスは MIT ライセンスです。
- ご利用に際しましては、できればソーシャルでのシェア、[Geolonia](https://geolonia.com/) へのリンクの設置などをしていただけると、開発者たちのモチベーションが上がると思います。

プルリクや Issue は大歓迎です。住所の正規化を工夫すれば精度があがりそうなので、そのあたりのアイディアを募集しています。
住所の正規化を工夫すれば精度があがりそうなので、そのあたりのアイディアを募集しています。
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"test": "npm run test:main && npm run test:addresses && npm run test:preload",
"test:main": "jest test/main.test.ts",
"test:addresses": "jest test/addresses.test.ts",
"test:preload": "jest test/preload.test.ts",
"test:preload": "curl -sL https://github.com/geolonia/japanese-addresses/archive/refs/heads/master.zip > ./test/japanese-addresses-master.zip && jest test/preload.test.ts",
"test:generate-test-data": "npx ts-node -O '{\"module\":\"commonjs\"}' test/build-test-data.ts > test/addresses.csv",
"lint": "eslint \"src/**/*.ts\" --fix",
"build": "rm -rf ./dist && rollup -c ./rollup.config.ts"
Expand Down
4 changes: 4 additions & 0 deletions src/lib/cacheRegexes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ export const getPrefectures = async (preloader?: () => Promise<void>) => {

const resp = await unfetch(`${currentConfig.japaneseAddressesApi}.json`)
const data = (await resp.json()) as PrefectureList
return cachePrefectures(data)
}

export const cachePrefectures = (data: PrefectureList) => {
return (cachedPrefectures = data)
}

Expand Down
16 changes: 12 additions & 4 deletions src/main-node.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import unfetch from 'isomorphic-unfetch'
import {
cachePrefectures,
cachedTownRegexes,
getTownRegexPatterns,
TownList,
Expand Down Expand Up @@ -28,7 +29,9 @@ export const preload = async () => {
// file:// でローカルにダウンロードした zip ファイルを参照する。
// https://github.com/geolonia/japanese-addresses のリポジトリと同じ構造を持つものを想定
if (currentConfig.japaneseAddressesApi.startsWith('file://')) {
zipBuffer = fs.readFileSync(currentConfig.japaneseAddressesApi)
zipBuffer = fs.readFileSync(
currentConfig.japaneseAddressesApi.replace(/^file:\//, ''),
)
} else {
const resp = await unfetch(
'https://github.com/geolonia/japanese-addresses/archive/refs/heads/master.zip',
Expand All @@ -50,13 +53,18 @@ export const preload = async () => {
const townBuffer = await file.buffer()
const towns = JSON.parse(townBuffer.toString('utf-8')) as TownList
await getTownRegexPatterns(pref, city, towns) // call and set cache
} else if (
file.type === 'File' &&
file.path.match(/^(.+)\/api\/ja\.json$/)
) {
const prefecturesBuffer = await file.buffer()
cachePrefectures(JSON.parse(prefecturesBuffer.toString('utf-8')))
}
}

return
}

export const config = currentConfig
export const normalize: Normalize.Normalizer = Normalize.createNormalizer(
preload,
)
export const normalize: Normalize.Normalizer =
Normalize.createNormalizer(preload)
20 changes: 13 additions & 7 deletions test/preload.test.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
import { normalize, preload } from '../src/main-node'
import { normalize, config, preload } from '../src/main-node'
import { cachedTownRegexes } from '../src/lib/cacheRegexes'

import path from 'path'
import { performance } from 'perf_hooks'
import unfetch from 'isomorphic-unfetch'
jest.mock('isomorphic-unfetch') // disable request for testing

jest.setTimeout(3 * 60 * 1000)
beforeAll(async () => {
config.preloadCache = true
config.japaneseAddressesApi =
'file:/' + path.resolve(__dirname, 'japanese-addresses-master.zip')
console.time('preload')
await preload()
console.timeEnd('preload')
jest.setTimeout(5000)
})

test('should preload cache', () => {
expect(cachedTownRegexes.length).toBeGreaterThan(1800)
}, 5000)
})

test('normalize should take less than 200ms to complete', async () => {
test('normalize should complete in the local environment', async () => {
const started = performance.now()
await normalize('京都府京田辺市同志社山手4丁目1-43')
const finished = performance.now()
console.log(finished - started)
expect(finished - started).toBeLessThan(200)
}, 5000)
console.log('performance(ms): ', finished - started)
expect(unfetch).not.toBeCalled()
})

0 comments on commit 0bd6100

Please sign in to comment.