Skip to content

Commit

Permalink
🔀 Merge pull request #13 from T4rk1n/4-metadata
Browse files Browse the repository at this point in the history
Generate react-docs metadata from dazzler command.
  • Loading branch information
T4rk1n committed Oct 20, 2019
2 parents 29594a7 + 0ff8bac commit a3dc6ac
Show file tree
Hide file tree
Showing 10 changed files with 1,839 additions and 28 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Versions follow [Semantic Versioning](https://www.semver.org)
### Added

- :hammer: Connect websocket only if page has bindings. [#7](https://github.com/T4rk1n/dazzler/issues/7)
- :hammer: Generate react-docs metadata from dazzler command. [#4](https://github.com/T4rk1n/dazzler/issues/4)

## [0.1.0]
### Added
Expand Down
17 changes: 13 additions & 4 deletions dazzler/_assets.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,19 @@
assets_dist_path = os.path.join(assets_path, 'dist')
assets_dev_path = os.path.join(assets_path, 'dev')
vendors_path = os.path.join(assets_path, 'vendors')
meta_path = os.path.join(assets_path, 'meta.js')

_asset_json = os.path.join(assets_dist_path, 'assets.json')
_asset_json_dev = os.path.join(assets_dev_path, 'assets.json')

with open(os.path.join(assets_dist_path, 'assets.json')) as _file:
assets = json.load(_file)['chunks']
if os.path.exists(_asset_json):
with open(_asset_json) as _file:
assets = json.load(_file)['chunks']
else:
assets = {}

with open(os.path.join(assets_dev_path, 'assets.json')) as _file:
assets_dev = json.load(_file)['chunks']
if os.path.exists(_asset_json_dev):
with open(_asset_json_dev) as _file:
assets_dev = json.load(_file)['chunks']
else:
assets = {}
11 changes: 5 additions & 6 deletions dazzler/_dazzler.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import argparse
import functools
import importlib
import itertools
Expand All @@ -20,6 +19,7 @@
from .system import (
Package,
generate_components,
generate_meta,
Requirement,
Page,
Middleware,
Expand Down Expand Up @@ -230,19 +230,18 @@ async def application(self):

@precept.Command(
precept.Argument(
'metadata',
type=argparse.FileType('r'),
default=sys.stdin,
help='react-docgen output'
'source_directory',
help='Components source directory'
),
precept.Argument(
'output_dir',
help='Output the components in this folder.'
),
description='Generate dazzler components from react-docgen output'
)
async def generate(self, metadata, output_dir):
async def generate(self, source_directory, output_dir):
os.makedirs(output_dir, exist_ok=True)
metadata = await generate_meta(source_directory)
await generate_components(metadata, output_dir, self.executor)

@precept.Command(
Expand Down
1,731 changes: 1,731 additions & 0 deletions dazzler/assets/meta.js

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion dazzler/system/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
assets_to_requirements,
collect_requirements,
)
from ._generator import generate_components # noqa: F401
from ._generator import generate_components, generate_meta # noqa: F401
from ._undefined import UNDEFINED, Undefined # noqa: F401
from ._page import Page # noqa: F401
from ._middleware import Middleware # noqa: F401
Expand All @@ -37,6 +37,7 @@
'assets_to_requirements',
'collect_requirements',
'generate_components',
'generate_meta',
'UNDEFINED',
'Undefined',
'Page',
Expand Down
22 changes: 21 additions & 1 deletion dazzler/system/_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@
import json
import keyword
import os
import sys
import textwrap
import re
import shlex

import stringcase

from ..tools import OrderedSet, replace_all
from .._assets import meta_path


def _default_prop_type(_):
Expand Down Expand Up @@ -298,10 +301,27 @@ def generate_imports(output_path, components):
f.write(imports_string)


async def generate_meta(source_dir: str) -> dict:
cmd = shlex.split(
f'node {meta_path} {source_dir}',
posix=sys.platform != 'win32'
)
proc = await asyncio.create_subprocess_shell(
' '.join(cmd),
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
out, err = await proc.communicate()
if err:
print(err, file=sys.stderr)
sys.exit(1)
else:
return json.loads(out.decode())


async def generate_components(metadata, output_path, executor):
futures = []
names = []
metadata = json.load(metadata)

for data in metadata.values():
name = data['displayName']
Expand Down
17 changes: 16 additions & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
import sys
sys.path.insert(0, os.path.abspath('..'))

from dazzler import __version__ as version
# noinspection PyProtectedMember
from dazzler._version import __version__ as version

# -- Project information -----------------------------------------------------

Expand Down Expand Up @@ -194,3 +195,17 @@ def skip(app, what, name, obj, skip, options):
def setup(app):
app.connect("autodoc-skip-member", skip)
app.add_stylesheet('styles.css')

# Generate components for docstrings.
from dazzler import Dazzler

dazz = Dazzler('dazzler')

for source, output in (
('../src/core/js/components', 'dazzler/components/core'),
('../src/extra/js/components', 'dazzler/components/extra'),
('../src/calendar/js/components', 'dazzler/components/calendar'),
('../src/markdown/js/components', 'dazzler/components/markdown'),
('../src/auth/js/components', 'dazzler/components/auth')
):
dazz.start(['generate', source, output])
23 changes: 8 additions & 15 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,14 @@
"test": "npm run format:test && npm run lint",
"build:webpack": "npx webpack --config webpack.config.js",
"build:dev": "npm run build:webpack -- --mode=development",
"build:meta::core": "npx react-docgen src/core/js/components --pretty > dazzler/assets/dist/dazzler_core_meta.json",
"build:meta::test": "npx react-docgen src/internal/test_components/components --pretty > dazzler/assets/dist/dazzler_test_meta.json",
"build:meta::extra": "npx react-docgen src/extra/js/components --pretty > dazzler/assets/dist/dazzler_extra_meta.json",
"build:meta::calendar": "npx react-docgen src/calendar/js/components --pretty > dazzler/assets/dist/dazzler_calendar_meta.json",
"build:meta::markdown": "npx react-docgen src/markdown/js/components --pretty > dazzler/assets/dist/dazzler_markdown_meta.json",
"build:meta::auth": "npx react-docgen src/auth/js/components --pretty > dazzler/assets/dist/dazzler_auth_meta.json",
"build:meta": "npx run-p build:meta::core build:meta::test build:meta::extra build:meta::calendar build:meta::markdown build:meta::auth",
"build:dazzler::core": "dazzler generate dazzler/assets/dist/dazzler_core_meta.json dazzler/components/core",
"build:dazzler::test": "dazzler generate dazzler/assets/dist/dazzler_test_meta.json tests/components/spec_components",
"build:dazzler::extra": "dazzler generate dazzler/assets/dist/dazzler_extra_meta.json dazzler/components/extra",
"build:dazzler::calendar": "dazzler generate dazzler/assets/dist/dazzler_calendar_meta.json dazzler/components/calendar",
"build:dazzler::markdown": "dazzler generate dazzler/assets/dist/dazzler_markdown_meta.json dazzler/components/markdown",
"build:dazzler::auth": "dazzler generate dazzler/assets/dist/dazzler_auth_meta.json dazzler/components/auth",
":build:dazzler::all": "npx run-p build:dazzler::core build:dazzler::test build:dazzler::extra build:dazzler::calendar build:dazzler::markdown build:dazzler::auth",
"build:dazzler": "npx run-s build:meta :build:dazzler::all",
"build:meta": "npx webpack --config webpack.meta.config.js",
"build:dazzler::core": "dazzler generate src/core/js/components dazzler/components/core",
"build:dazzler::test": "dazzler generate src/internal/test_components/components tests/components/spec_components",
"build:dazzler::extra": "dazzler generate src/extra/js/components dazzler/components/extra",
"build:dazzler::calendar": "dazzler generate src/calendar/js/components dazzler/components/calendar",
"build:dazzler::markdown": "dazzler generate src/markdown/js/components dazzler/components/markdown",
"build:dazzler::auth": "dazzler generate src/auth/js/components dazzler/components/auth",
"build:dazzler": "npx run-p build:dazzler::core build:dazzler::test build:dazzler::extra build:dazzler::calendar build:dazzler::markdown build:dazzler::auth",
"build:docs": "docs/build.sh",
"build": "npx run-s build:webpack build:dev",
"watch": "npm run build:dev -- --watch",
Expand Down
27 changes: 27 additions & 0 deletions src/internal/meta.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
const reactDocs = require('react-docgen');
const fs = require('fs');
const path = require('path');


const args = process.argv.slice(2);
const src = args[0];

function walk(directory, components=null) {
return new Promise(resolve => {
components = components || {};
fs.readdirSync(src, {withFileTypes: true}).forEach(f => {
if (f.isDirectory()) {
components = walk(f, components);
} else {
const filepath = path.join(directory, f.name);
components[filepath] = reactDocs.parse(fs.readFileSync(filepath));
}
});
resolve(components);
});
}

walk(src).then((components) => {
process.stdout.write(JSON.stringify(components));
});

15 changes: 15 additions & 0 deletions webpack.meta.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const path = require('path');

module.exports = function(env, argv) {
return {
mode: 'production',
entry: {
meta: [path.join(__dirname, 'src/internal/meta.js')]
},
target: 'node',
output: {
path: path.resolve(__dirname, 'dazzler/assets'),
filename: 'meta.js',
},
}
};

0 comments on commit a3dc6ac

Please sign in to comment.