【flaretool】いろんな機能をPythonで作って公開してみた


- [はじめに](#はじめに)
- [使い方](#使い方)
  - [インストール方法](#インストール方法)
  - [ネットワーク関連のツール](#ネットワーク関連のツール)
  - [文字列の変換](#文字列の変換)
  - [日本の祝日を取得](#日本の祝日を取得)
  - [便利なデコレーター](#便利なデコレーター)


# flaretool <!-- omit in toc -->

![License](https://img.shields.io/github/license/flarebrow/flaretool?v=20250209_103332)[![python](https://img.shields.io/badge/python-%3E%3D3.9-blue)](https://github.com/flarebrow/flaretool)[![version](https://img.shields.io/github/v/release/flarebrow/flaretool?include_prereleases?v=20250209_103332)](https://github.com/flarebrow/flaretool/releases/latest)[![ReleaseDate](https://img.shields.io/github/release-date/flarebrow/flaretool?v=20250209_103332)](https://github.com/flarebrow/flaretool/releases/latest)![build](https://img.shields.io/github/actions/workflow/status/flarebrow/flaretool/auto_test.yml?v=20250209_103332)![Coverage](https://img.shields.io/endpoint?v=20250209_103332&url=https://gist.githubusercontent.com/flarebrow/e31fc348a9dea0098de9540dc5961668/raw/pytest-coverage-3.9.json)[![Downloads](https://static.pepy.tech/badge/flaretool?v=20250209_103332)](https://pepy.tech/project/flaretool)

# はじめに

このライブラリはPython3.9以降のバージョンを前提に作成していて、監修はChatGPTにやってもらっています笑
日本の祝日を簡単に取得したり、ネットワーク関連の便利な機能を作っていて、これからさらにいろんな機能を開発していく予定です！（少しずつ記事にします！）
なんとなくで作ったものなので、不具合があったらごめんなさい・・・
気になるところがあれば [Github Issue](https://github.com/flarebrow/flaretool/issues) か [問い合わせ](https://main.flarebrow.com/contact) から連絡くださいませ！


# 使い方

[ライブラリ ドキュメント](https://flarebrow.github.io/flaretool/)

## インストール方法
```bash
pip install flaretool
```

## ネットワーク関連のツール

```python
# インポート
from flaretool import nettool

# 指定されたドメインの情報を取得（IPアドレスからでもOK）
ip_info = nettool.get_global_ipaddr_info("google.co.jp")
print("ip:", ip_info.ipaddr)         # ip: 203.0.113.1
print("hostname:", ip_info.hostname) # hostname: google.co.jp
print("country:", ip_info.country)   # country: United States

# ドメイン名からIPアドレスを取得
ip_address = nettool.lookup_ip("google.co.jp")
print(ip_address)  # 203.0.113.1

# IPアドレスからドメイン名を取得
domain_name = nettool.lookup_domain("203.0.113.1")
print(domain_name)  # google.co.jp

# 指定されたIPアドレスが特定のネットワークに属しているかどうかを判定
allowed_networks = ["192.168.0.0/24", "10.0.0.0/16"]
is_allowed = nettool.is_ip_in_allowed_networks(
    "192.168.0.100", allowed_networks)
print(is_allowed)  # True

# 指定されたドメイン名が存在するかどうかを判定
domain_exists = nettool.domain_exists("example.com")
print(domain_exists)  # True

# 日本のIPアドレスのリストを取得
japan_ips = nettool.get_japanip_list()
print(japan_ips)

# 指定されたアドレスが日本のIPアドレスか確認
is_japan = nettool.is_japan_ip("203.0.113.1")
print(is_japan)  # False

# 日本語を含むドメインをpunycodeに変換
puny_info = nettool.get_puny_code("日本語ドメイン.jp")
print("originalvalue:", puny_info.originalvalue) # originalvalue: 日本語ドメイン.jp
print("encodevalue:", puny_info.encodevalue)     # encodevalue: xn--eckwd4c7c5976acvb2w6i.jp
print("decodevalue:", puny_info.decodevalue)     # decodevalue: 日本語ドメイン.jp

# 特定のユーザーエージェントでスクレイピング可否を確認
url = "http://example.com/page.html"
user_agent = "MyScraperBot"
allowed = nettool.is_scraping_allowed(url, user_agent) # user_agentはオプション引数
if allowed:
    print(f"{url} はユーザーエージェント '{user_agent}' でのスクレイピングが許可されています。")
else:
    print(f"{url} はユーザーエージェント '{user_agent}' でのスクレイピングが禁止されています。")
```

NetToolはコマンドでも実行できるようにしているので、シェルに組み込むこともできます！
```bash
$ flaretool nettool get_global_ipaddr_info google.co.jp
ipaddr='203.0.113.1'
hostname='google.co.jp'
country='United States'
```

```bash
$ flaretool nettool lookup_ip google.co.jp
203.0.113.1
```

## 文字列の変換

```python
from flaretool import utills
from flaretool.utills import ConversionMode

# 文字列変換
## 半角に変換
value = "１２３４５６７８９６７８９"
result = utills.convert_value(value)
print(result)  # "1234567896789"

## 全角に変換
value = "Hello"
result = utills.convert_value(value, ConversionMode.FULL_WIDTH)
print(result)  # "Ｈｅｌｌｏ"

## 英文字のみ半角に変換
value = "ＡＢＣａｂｃ１２３"
result = utills.convert_value(
    value, ascii=True, digit=False, kana=False)
print(result)  # "ABCabc１２３"

## 小文字に変換
value = "ABCabc"
result = utills.convert_value(
    value, ConversionMode.LOWER)
print(result)  # "abcabc"

## 大文字に変換
value = "ABCabc"
result = utills.convert_value(
    value, ConversionMode.UPPER)
print(result)  # "ABCABC"
```

## 日本の祝日を取得

https://qiita.com/flarebrow/items/c2e54db73130630d2c01


## 便利なデコレーター

<strong>ネットワークに接続されていないと実行ができないデコレーター</strong>

ネットワークへ接続されていない場合は実行ができないメソッドを作ることができます。

```python
from flaretool.errors import FlareToolNetworkError
from flaretool.decorators import network_required

# ネットワーク接続を必須とするデコレーター
@network_required
def network_access(url):
    # ネットワークに接続されている場合に実行する処理
    response = requests.get(url)
    return response.json()

def main():
    try:
        network_access()
    except FlareToolNetworkError:
        # ネットワークに接続されていない場合の処理
        pass
```

<strong>メソッド内で例外が発生したときにリトライしてくれるデコレーター</strong>

メソッド内でエラーが発生した場合に自動でリトライしてくれるようになります。

```python
from flaretool.decorators import retry

# 例外が発生した場合にリトライを行うデコレーター
@retry(tries=3, delay=2) # 2秒毎に3回までリトライ
# @retry(3) # ←この場合は1秒毎に3回までリトライ
def retry_function():
    pass
```

<strong>指定回数リピート実行してくれるデコレーター</strong>

メソッドを指定の回数（指定の秒数毎に）リピート実行してくれるようになります。

```python
from flaretool.decorators import repeat

# 複数回実行を行うデコレーター
@repeat(tries=3, interval=2) # 2秒毎に3回メソッドを実行
# @repeat(2) # ←この場合は連続で2回実行
def repeat_function():
    # 強制的に実行を止めたい場合はStopIterationをraiseさせる
    if 複数回の実行をとめたい条件:
        raise StopIteration("Stop the loop!")
    pass
```


<strong>制限時間をつけるデコレーター</strong>

メソッドの実行に制限時間をつけることができます。

```python
from flaretool.decorators import timeout

@timeout(5)
def my_function():
    # Some time-consuming operation
    time.sleep(10)
    return "Operation completed"

try:
    result = my_function()
    print(result)
except TimeoutError:
    print("Operation timed out")
## 出力例
# Operation timed out
```


<strong>メソッドの実行時間を計測するデコレーター</strong>

メソッドの実行時間をロガーに出力できます。

```python
from flaretool.decorators import timer

## Logger Setup
from flaretool.logger import setup_logger
logger = setup_logger(logging.DEBUG, console=True)

@timer
def example_function(x):
    time.sleep(x)
    return x

example_function(2)
## 出力例
# [2024-08-01 00:00:00,000] DEBUG : example_function took 2.0000 seconds to execute.
```