Skip to content

Commit

Permalink
Merge branch 'release/2.0.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
Maki committed Mar 30, 2024
2 parents 79705b5 + 327a4ce commit a105923
Show file tree
Hide file tree
Showing 17 changed files with 2,798 additions and 84 deletions.
15 changes: 15 additions & 0 deletions .SourceSageignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
.git
__pycache__
LICENSE
output.md
assets
Style-Bert-VITS2
output
streamlit
SourceSage.md
data
SourceSage
.gitignore
.SourceSageignore
*.png
Changelog
6 changes: 6 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"gitlens.ai.experimental.openai.url": "",
"gitlens.ai.experimental.provider": "anthropic",
"gitlens.ai.experimental.anthropic.model": "claude-3-haiku-20240307",
"gitlens.experimental.generateCommitMessagePrompt": "日本語でシンプルなコミットメッセージ"
}
114 changes: 100 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,65 +12,151 @@

SourceSageは、プロジェクトのソースコードとファイル構成を単一のマークダウンファイルに統合するPythonスクリプトです。これにより、大規模言語モデル(AI)がプロジェクト全体の構造と内容を容易に理解できるようになります。

## 更新内容

- 【2024/03/30】 ChangelogGenerator classを導入し、コードの可読性と保守性を向上
- 【2024/03/30】 言語ごとのシンタックスハイライト機能を追加
- 【2024/03/30】 対象フォルダの指定やファイルの除外設定を複数行対応
- 【2024/03/30】 コード生成時のエラー処理を改善
- 【2024/03/30】 設定ファイルの場所を外部化し、柔軟性を向上
- 【2024/03/30】 .SourceSageignoreファイルを導入し、不要なファイルやフォルダを自動的に除外
- 【2024/03/29】 初期リリース

## 特徴

- プロジェクトのディレクトリ構成とファイル内容を1つのマークダウンファイルにまとめます
- AIがプロジェクトの概要を素早く把握できる構造化された形式で出力します
- 不要なファイルやディレクトリを除外する設定が可能です
- プロジェクトの全体像を明確かつ読みやすい方法で提示します
- 複数のプログラミング言語に対応し、シンタックスハイライト機能を提供します
- 設定ファイルを外部化することで、柔軟性と保守性を向上させています
- Gitの変更履歴を自動生成し、ドキュメント化することができます

## 使用方法

プロジェクトでSourceSageを使用するには、次の手順に従います:

1. `SourceSage.py`ファイルを、分析対象のプロジェクトのルートディレクトリにコピーします。
1. `SourceSage.py`ファイルと`modules`フォルダを、分析対象のプロジェクトのルートディレクトリにコピーします。

2. 必要に応じて、`.SourceSageignore`ファイルを作成し、除外したいファイルやフォルダのパターンを記述します。

2. 必要に応じて、`SourceSage.py`内の以下の設定を変更します:
3. `config/language_map.json`ファイルを編集し、必要なプログラミング言語とそれに対応するシンタックスハイライトの識別子を設定します。

4. 必要に応じて、`SourceSage.py`内の以下の設定を変更します:

```python
folders = ['./'] # 分析対象のディレクトリ(現在のディレクトリを指定)
exclude_patterns = ['.git', '__pycache__', 'LICENSE', 'output.md', 'README.md', 'docs'] # 除外するファイル/フォルダのパターン
output_file = 'output.md' # 出力するマークダウンファイル名
ignore_file = '.SourceSageignore' # 無視するファイル/フォルダのパターンを記述したファイル
output_file = 'docs/SourceSage.md' # 出力するマークダウンファイル名
language_map_file = 'config/language_map.json' # 言語マッピングの設定ファイル
```

3. ターミナルまたはコマンドプロンプトで、プロジェクトのルートディレクトリに移動し、以下のコマンドを実行します:
5. ターミナルまたはコマンドプロンプトで、プロジェクトのルートディレクトリに移動し、以下のコマンドを実行します:

```
```bash
python SourceSage.py
```

これにより、AIがプロジェクトの構造と内容を理解しやすい形式のマークダウンファイル(デフォルトでは `output.md`)が生成されます。
これにより、AIがプロジェクトの構造と内容を理解しやすい形式のマークダウンファイル(デフォルトでは `docs/SourceSage.md`)が生成されます。また、Gitの変更履歴が`docs/Changelog`ディレクトリに自動生成されます

## 出力例

生成されるマークダウンファイルの例は次のようになります:

```markdown
# プロジェクト名: YourProjectName
````markdown
# Project: YourProjectName

```plaintext
OS: nt
Directory: C:\Prj\YourProjectName

## ディレクトリ構造
├─ src/
│ ├─ main.py
│ ├─ utils/
│ │ ├─ helper.py
│ │ └─ constants.py
│ └─ tests/
│ └─ test_main.py
├─ docs/
│ └─ README.md
├─ .gitignore
└─ README.md
```

## ファイルの内容
## src

`src/main.py`
'''python
### main.py

```python
def main():
print("Hello, World!")

if __name__ == "__main__":
main()
'''
```

### utils

#### helper.py

```python
def greet(name):
return f"Hello, {name}!"
```

#### constants.py

```python
PI = 3.14159
```

...

## docs

### README.md

```markdown
# YourProjectName Documentation

This is the documentation for YourProjectName.

...
```
````

## 変更履歴の統合

SourceSageは、Gitリポジトリの変更履歴を自動的に生成し、ブランチごとにマークダウンファイルに出力します。さらに、すべてのブランチの変更履歴を1つのファイルに統合することができます。

生成される変更履歴の例は次のようになります:

````markdown
# Integrated Changelog

# Changelog

## develop

- [f26fca5] - Merge branch 'feature/modules' into develop (John Doe, 2023-03-30)
- [36d6a4a] - Refactor SourceSage.py to use modules (John Doe, 2023-03-30)
- [60ccecb] - Update SourceSage.md (John Doe, 2023-03-30)
- [6796a56] - Create language_map.json (John Doe, 2023-03-30)
- [d6e1af6] - Delete language_map.json (John Doe, 2023-03-30)

...

# Changelog - Features

## feature/add-git-logs

- [c346a22] - Introduce ChangelogGenerator class for improved readability and maintainability (Jane Smith, 2023-03-30)
- [0344765] - Update CHANGELOG.md (Jane Smith, 2023-03-30)
- [5c5e6ac] - Create get_git_log.py (Jane Smith, 2023-03-30)
- [8d4a253] - Create CHANGELOG.md (Jane Smith, 2023-03-30)

...
````

## 貢献

Expand Down
90 changes: 20 additions & 70 deletions SourceSage.py
Original file line number Diff line number Diff line change
@@ -1,77 +1,27 @@
import os

class SourceSage:
def __init__(self, folders, exclude_patterns=None, output_file='output.md'):
self.folders = folders
self.exclude_patterns = exclude_patterns or []
self.output_file = output_file

def generate_markdown(self):
with open(self.output_file, 'w', encoding='utf-8') as md_file:
project_name = os.path.basename(os.path.abspath(self.folders[0]))
md_file.write(f"# Project: {project_name}\n\n")
for folder in self.folders:
markdown_content = self._generate_markdown_for_folder(folder)
md_file.write(markdown_content + '\n\n')
import os
import sys
import pprint

sys.path.append(os.path.join(os.path.dirname(__file__), 'modules'))
pprint.pprint(sys.path)

def _generate_markdown_for_folder(self, folder_path):
markdown_content = "```plaintext\n"
markdown_content += self._display_tree(dir_path=folder_path)
markdown_content += "\n```\n\n"
base_level = folder_path.count(os.sep)
for root, dirs, files in os.walk(folder_path, topdown=True):
if self._is_excluded(root):
dirs[:] = [] # Don't walk into excluded directories
continue
level = root.count(os.sep) - base_level + 1
header_level = '#' * (level + 1)
relative_path = os.path.relpath(root, folder_path)
markdown_content += f"{header_level} {relative_path}\n\n"
for f in files:
file_path = os.path.join(root, f)
if self._is_excluded(file_path):
continue
relative_file_path = os.path.relpath(file_path, folder_path)
try:
with open(file_path, 'r', encoding='utf-8') as file_content:
content = file_content.read().strip()
markdown_content += f"`{relative_file_path}`\n\n```plaintext\n{content}\n```\n\n"
except Exception as e:
markdown_content += f"`{relative_file_path}` - Error reading file: {e}\n\n"
return markdown_content
from modules.source_sage import SourceSage
from modules.ChangelogGenerator import ChangelogGenerator

def _display_tree(self, dir_path='.', string_rep=True, header=True, max_depth=None, show_hidden=False):
tree_string = ""
if header:
tree_string += f"OS: {os.name}\nDirectory: {os.path.abspath(dir_path)}\n\n"
tree_string += self._build_tree_string(dir_path, max_depth, show_hidden, depth=0)
if string_rep:
return tree_string.strip()
else:
print(tree_string.strip())
if __name__ == "__main__":
folders = ['./']
source_sage = SourceSage(folders, ignore_file='.SourceSageignore',
output_file='docs/SourceSage.md',
language_map_file='config/language_map.json')
source_sage.generate_markdown()

def _build_tree_string(self, dir_path, max_depth, show_hidden, depth=0):
tree_string = ""
if depth == max_depth:
return tree_string
for item in os.listdir(dir_path):
if not show_hidden and item.startswith('.'):
continue
if self._is_excluded(item):
continue
item_path = os.path.join(dir_path, item)
if os.path.isdir(item_path):
tree_string += '│ ' * depth + '├─ ' + item + '/\n'
tree_string += self._build_tree_string(item_path, max_depth, show_hidden, depth + 1)
else:
tree_string += '│ ' * depth + '├─ ' + item + '\n'
return tree_string

def _is_excluded(self, path):
return any(pattern in path for pattern in self.exclude_patterns)
repo_path = "./"
output_dir = "docs/Changelog"
os.makedirs(output_dir, exist_ok=True) # ディレクトリが存在しない場合は作成する

# 使用例
folders = ['./'] # 現在のディレクトリを対象に
exclude_patterns = ['.git', '__pycache__', 'LICENSE', 'output.md', 'assets', 'Style-Bert-VITS2', 'output', 'streamlit', 'SourceSage.md', 'data', 'SourceSage'] # 除外するファイル/フォルダのパターン
source_sage = SourceSage(folders, exclude_patterns=exclude_patterns, output_file='SourceSage.md')
source_sage.generate_markdown()
generator = ChangelogGenerator(repo_path, output_dir)
generator.generate_changelog_for_all_branches()
generator.integrate_changelogs()
27 changes: 27 additions & 0 deletions config/language_map.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
".py": "python",
".js": "javascript",
".java": "java",
".c": "c",
".cpp": "cpp",
".cs": "csharp",
".go": "go",
".php": "php",
".rb": "ruby",
".rs": "rust",
".ts": "typescript",
".html": "html",
".css": "css",
".json": "json",
".xml": "xml",
".yml": "yaml",
".yaml": "yaml",
".md": "markdown",
".txt": "plaintext",
".sh": "bash",
".sql": "sql",
"Dockerfile": "dockerfile",
".dockerfile": "dockerfile",
"docker-compose.yml": "yaml",
"docker-compose.yaml": "yaml"
}
Loading

0 comments on commit a105923

Please sign in to comment.