-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Move package metadata into pyproject.toml and all other python code into separate file #4970
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 5 commits
Commits
Show all changes
46 commits
Select commit
Hold shift + click to select a range
a6f02b7
Move package metadata into pyproject.toml and all other python code i…
marthacryan 7be470b
Cleanup extra changes
marthacryan 7170a51
Revert changes to command names
marthacryan 6a2d9bc
Add version attr
marthacryan 37807da
Add correct output directory for artifacts
marthacryan 41cd025
Move version into separate file
marthacryan 7fd6870
Attempt to fix version issues
marthacryan cdd0204
Attempt to fix version issues
marthacryan 48cc36a
Merge with master
marthacryan 9795406
Add pip install editable to CI config
marthacryan 39750d5
Add version attribute
marthacryan 937ad46
Remove extra reference to version.py
marthacryan 0d06ded
Code format
marthacryan ca9aa0a
Explicitly import importlib.metadata
marthacryan ec7c557
Add __name__ == main wrapper around command line arg parsing
marthacryan 6ea167d
update to python 3.9 for dev build to fix importlib error
marthacryan 6f40cdc
Remove unnecessary widget version
marthacryan 2ef2559
Update version of python for dev build CI
marthacryan 634c787
Add pip install editable
marthacryan 8abdeaf
Add pyproject.toml to conda recipe
marthacryan dafa57f
Fix filepath in conda recipe
marthacryan 370efcd
Fix accessing of pyproject.toml version in conda recipe
marthacryan dc1b55b
Merge with master
marthacryan 011d410
Remove setup.py from root
marthacryan 48e7de3
Fix filepath in commands.py
marthacryan d1905cb
Use new variable name for project root in commands.py
marthacryan f68d997
Remove conda from CI and release
marthacryan 2a366ef
Add license file and pytest to pyproject.toml
marthacryan 69897ae
Fix syntax issues with pyproject.toml
marthacryan bcfa6a7
Update release instructions
marthacryan 1f1dae9
remove versioneer from manifest.in
marthacryan 2ca6dae
Pin narwhals version
marthacryan a7499c1
Update pyproject.toml
marthacryan 56d2096
Remove wheel install from CI
marthacryan ac57d7d
Merge branch 'use-pyprojecttoml' of github.com:plotly/plotly.py into …
marthacryan c6992fc
Update pin of pandas instead of narwhals
marthacryan 5111cfa
Merge branch 'master' of github.com:plotly/plotly.py into use-pyproje…
marthacryan 15a7028
Move tests out of the plotly directory
marthacryan f3db071
Rename any references to plotly/tests with just tests
marthacryan 6acd25a
Move plotly_utils tests into root tests directory
marthacryan 0c343ef
Reset filepath to one that will cause import to fail
marthacryan 98f2c8f
Fix filepath in optional_imports test
marthacryan 28a5b74
Update filepaths to plotly_utils tests
marthacryan 39032fb
Black
marthacryan 4573074
Black
marthacryan 10b2b87
Merge with master
marthacryan File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,304 @@ | ||
import os | ||
import sys | ||
import time | ||
import platform | ||
import json | ||
import shutil | ||
|
||
from subprocess import check_call | ||
from distutils import log | ||
|
||
here = os.path.dirname(os.path.abspath(__file__)) | ||
project_root = os.path.dirname(os.path.dirname(os.path.dirname(here))) | ||
node_root = os.path.join(project_root, "packages", "python", "plotly", "js") | ||
is_repo = os.path.exists(os.path.join(project_root, ".git")) | ||
node_modules = os.path.join(node_root, "node_modules") | ||
targets = [ | ||
os.path.join(here, "plotly", "package_data", "widgetbundle.js"), | ||
] | ||
|
||
npm_path = os.pathsep.join( | ||
[ | ||
os.path.join(node_root, "node_modules", ".bin"), | ||
os.environ.get("PATH", os.defpath), | ||
] | ||
) | ||
|
||
# Load plotly.js version from js/package.json | ||
def plotly_js_version(): | ||
path = os.path.join(here, "js", "package.json") | ||
with open(path, "rt") as f: | ||
package_json = json.load(f) | ||
version = package_json["dependencies"]["plotly.js"] | ||
version = version.replace("^", "") | ||
|
||
return version | ||
|
||
|
||
# install package.json dependencies using npm | ||
def install_js_deps(local): | ||
npmName = "npm" | ||
if platform.system() == "Windows": | ||
npmName = "npm.cmd" | ||
|
||
try: | ||
check_call([npmName, "--version"]) | ||
has_npm = True | ||
except: | ||
has_npm = False | ||
|
||
|
||
skip_npm = os.environ.get("SKIP_NPM", False) | ||
if skip_npm: | ||
log.info("Skipping npm-installation") | ||
return | ||
|
||
if not has_npm: | ||
log.error( | ||
"`npm` unavailable. If you're running this command using sudo, make sure `npm` is available to sudo" | ||
) | ||
|
||
env = os.environ.copy() | ||
env["PATH"] = npm_path | ||
|
||
if has_npm: | ||
log.info( | ||
"Installing build dependencies with npm. This may take a while..." | ||
) | ||
check_call( | ||
[npmName, "install"], | ||
cwd=node_root, | ||
stdout=sys.stdout, | ||
stderr=sys.stderr, | ||
) | ||
if local is not None: | ||
plotly_archive = os.path.join(local, "plotly.js.tgz") | ||
check_call( | ||
[npmName, "install", plotly_archive], | ||
cwd=node_root, | ||
stdout=sys.stdout, | ||
stderr=sys.stderr, | ||
) | ||
check_call( | ||
[npmName, "run", "build"], | ||
cwd=node_root, | ||
stdout=sys.stdout, | ||
stderr=sys.stderr, | ||
) | ||
os.utime(node_modules, None) | ||
|
||
for t in targets: | ||
if not os.path.exists(t): | ||
msg = "Missing file: %s" % t | ||
raise ValueError(msg) | ||
|
||
# Generate class hierarchy from Plotly JSON schema | ||
def run_codegen(): | ||
if sys.version_info < (3, 8): | ||
raise ImportError("Code generation must be executed with Python >= 3.8") | ||
|
||
from codegen import perform_codegen | ||
|
||
perform_codegen() | ||
|
||
|
||
def overwrite_schema_local(uri): | ||
path = os.path.join(here, "codegen", "resources", "plot-schema.json") | ||
shutil.copyfile(uri, path) | ||
|
||
|
||
def overwrite_schema(url): | ||
import requests | ||
|
||
req = requests.get(url) | ||
assert req.status_code == 200 | ||
path = os.path.join(here, "codegen", "resources", "plot-schema.json") | ||
with open(path, "wb") as f: | ||
f.write(req.content) | ||
|
||
|
||
def overwrite_bundle_local(uri): | ||
path = os.path.join(here, "plotly", "package_data", "plotly.min.js") | ||
shutil.copyfile(uri, path) | ||
|
||
|
||
def overwrite_bundle(url): | ||
import requests | ||
|
||
req = requests.get(url) | ||
print('url:', url) | ||
assert req.status_code == 200 | ||
path = os.path.join(here, "plotly", "package_data", "plotly.min.js") | ||
with open(path, "wb") as f: | ||
f.write(req.content) | ||
|
||
|
||
def overwrite_plotlyjs_version_file(plotlyjs_version): | ||
path = os.path.join(here, "plotly", "offline", "_plotlyjs_version.py") | ||
with open(path, "w") as f: | ||
f.write( | ||
"""\ | ||
# DO NOT EDIT | ||
# This file is generated by the updatebundle commands.py command | ||
__plotlyjs_version__ = "{plotlyjs_version}" | ||
""".format( | ||
plotlyjs_version=plotlyjs_version | ||
) | ||
) | ||
|
||
def request_json(url): | ||
import requests | ||
|
||
req = requests.get(url) | ||
return json.loads(req.content.decode("utf-8")) | ||
|
||
|
||
def get_latest_publish_build_info(repo, branch): | ||
url = ( | ||
r"https://circleci.com/api/v1.1/project/github/" | ||
r"{repo}/tree/{branch}?limit=100&filter=completed" | ||
).format(repo=repo, branch=branch) | ||
|
||
branch_jobs = request_json(url) | ||
|
||
# Get most recent successful publish build for branch | ||
builds = [ | ||
j | ||
for j in branch_jobs | ||
if j.get("workflows", {}).get("job_name", None) == "publish-dist" | ||
and j.get("status", None) == "success" | ||
] | ||
build = builds[0] | ||
|
||
# Extract build info | ||
return {p: build[p] for p in ["vcs_revision", "build_num", "committer_date"]} | ||
|
||
|
||
def get_bundle_schema_local(local): | ||
plotly_archive = os.path.join(local, "plotly.js.tgz") | ||
plotly_bundle = os.path.join(local, "dist/plotly.min.js") | ||
plotly_schemas = os.path.join(local, "dist/plot-schema.json") | ||
return plotly_archive, plotly_bundle, plotly_schemas | ||
|
||
|
||
def get_bundle_schema_urls(build_num): | ||
url = ( | ||
"https://circleci.com/api/v1.1/project/github/" | ||
"plotly/plotly.js/{build_num}/artifacts" | ||
).format(build_num=build_num) | ||
|
||
artifacts = request_json(url) | ||
|
||
# Find archive | ||
archives = [a for a in artifacts if a.get("path", None) == "plotly.js.tgz"] | ||
archive = archives[0] | ||
|
||
# Find bundle | ||
bundles = [a for a in artifacts if a.get("path", None) == "dist/plotly.min.js"] | ||
bundle = bundles[0] | ||
|
||
# Find schema | ||
schemas = [a for a in artifacts if a.get("path", None) == "dist/plot-schema.json"] | ||
schema = schemas[0] | ||
|
||
return archive["url"], bundle["url"], schema["url"] | ||
|
||
|
||
# Download latest version of the plot-schema JSON file | ||
def update_schema(plotly_js_version): | ||
url = ( | ||
"https://raw.githubusercontent.com/plotly/plotly.js/" | ||
"v%s/dist/plot-schema.json" % plotly_js_version | ||
) | ||
overwrite_schema(url) | ||
|
||
# Download latest version of the plotly.js bundle | ||
def update_bundle(plotly_js_version): | ||
url = ( | ||
"https://raw.githubusercontent.com/plotly/plotly.js/" | ||
"v%s/dist/plotly.min.js" % plotly_js_version | ||
) | ||
overwrite_bundle(url) | ||
|
||
# Write plotly.js version file | ||
plotlyjs_version = plotly_js_version | ||
overwrite_plotlyjs_version_file(plotlyjs_version) | ||
|
||
# Update project to a new version of plotly.js | ||
def update_plotlyjs(plotly_js_version): | ||
update_bundle(plotly_js_version) | ||
update_schema(plotly_js_version) | ||
run_codegen() | ||
|
||
# Update the plotly.js schema and bundle from master | ||
def update_schema_bundle_from_master(): | ||
|
||
if "--devrepo" in sys.argv: | ||
devrepo = sys.argv[sys.argv.index("--devrepo") + 1] | ||
else: | ||
devrepo = "plotly/plotly.js" | ||
|
||
if "--devbranch" in sys.argv: | ||
devbranch = sys.argv[sys.argv.index("--devbranch") + 1] | ||
else: | ||
devbranch = "master" | ||
|
||
if "--local" in sys.argv: | ||
local = sys.argv[sys.argv.index("--local") + 1] | ||
else: | ||
local = None | ||
|
||
if local is None: | ||
build_info = get_latest_publish_build_info(devrepo, devbranch) | ||
|
||
archive_url, bundle_url, schema_url = get_bundle_schema_urls( | ||
build_info["build_num"] | ||
) | ||
|
||
# Update bundle in package data | ||
overwrite_bundle(bundle_url) | ||
|
||
# Update schema in package data | ||
overwrite_schema(schema_url) | ||
else: | ||
# this info could be more informative but | ||
# it doesn't seem as useful in a local context | ||
# and requires dependencies and programming. | ||
build_info = {"vcs_revision": "local", "committer_date": str(time.time())} | ||
devrepo = local | ||
devbranch = "" | ||
|
||
archive_uri, bundle_uri, schema_uri = get_bundle_schema_local(local) | ||
overwrite_bundle_local(bundle_uri) | ||
overwrite_schema_local(schema_uri) | ||
|
||
# Update plotly.js url in package.json | ||
package_json_path = os.path.join(node_root, "package.json") | ||
with open(package_json_path, "r") as f: | ||
package_json = json.load(f) | ||
|
||
# Replace version with bundle url | ||
package_json["dependencies"]["plotly.js"] = ( | ||
archive_url if local is None else archive_uri | ||
) | ||
with open(package_json_path, "w") as f: | ||
json.dump(package_json, f, indent=2) | ||
|
||
# update plotly.js version in _plotlyjs_version | ||
rev = build_info["vcs_revision"] | ||
date = str(build_info["committer_date"]) | ||
version = "_".join([devrepo, devbranch, date[:10], rev[:8]]) | ||
overwrite_plotlyjs_version_file(version) | ||
install_js_deps(local) | ||
|
||
# Update project to a new development version of plotly.js | ||
def update_plotlyjs_dev(): | ||
update_schema_bundle_from_master() | ||
run_codegen() | ||
|
||
if "updateplotlyjsdev" in sys.argv: | ||
update_plotlyjs_dev() | ||
elif "updateplotlyjs" in sys.argv: | ||
print(plotly_js_version()) | ||
update_plotlyjs(plotly_js_version()) | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.