Skip to content

Commit

Permalink
Merge pull request #10 from NexSabre/add-download-action
Browse files Browse the repository at this point in the history
Add an option to download a package locally
  • Loading branch information
NexSabre authored Aug 10, 2020
2 parents 60487e7 + 43eae9c commit 24d7fdf
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 6 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# 1.1
- Add an option to download latest package locally

# 1.0
- Introduce refactored code
- Better messages
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.0
1.1
3 changes: 2 additions & 1 deletion src/pip2spack/actions/action_dispatcher.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from argparse import ArgumentParser

from pip2spack.actions.create.create_action import CreateAction
from pip2spack.actions.dowload.download_action import DownloadAction
from pip2spack.actions.update.update_action import UpdateAction
from pip2spack.actions.version import ShowVersion
from pip2spack.framework.messages import Messages


class ActionDispatcher:
ACTION_HANDLERS = [CreateAction, ShowVersion, UpdateAction]
ACTION_HANDLERS = [CreateAction, DownloadAction, ShowVersion, UpdateAction]

def __init__(self):
self.parser = ArgumentParser()
Expand Down
Empty file.
24 changes: 24 additions & 0 deletions src/pip2spack/actions/dowload/download_action.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from pip2spack.actions.action import Action
from pip2spack.framework.messages import Messages
from pip2spack.core.pypi_package import PyPiPackage
from pip2spack.core.verification import Verification


class DownloadAction(Action):
ACTION = "download"
PARAM_NAME = "ACTION"

def fill_parser_arguments(self):
self.parser.add_argument('name', type=str, nargs='+', help='Package name on the pypi.org')

def process_action(self, configuration):
ready_packages = Verification(configuration.name).available_packages
self.download(ready_packages)

@staticmethod
def download(ready_packages):
for key, value in ready_packages.items():
Messages.info(f"Download latest package for the {key}")

d_package = PyPiPackage(value)
d_package.download_versions()
2 changes: 1 addition & 1 deletion src/pip2spack/core/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def replace_marker_with_template(self):

def update_newest_versions(self, package_name):
sp = PyPiPackage(package_name)
file = sp.generate_custom_file(os.path.dirname(os.path.realpath(self.package_path)), sp.get_versions)
file = sp.generate_custom_file(os.path.dirname(os.path.realpath(self.package_path)), sp._get_versions)
return file

def save(self, new_file):
Expand Down
27 changes: 26 additions & 1 deletion src/pip2spack/core/pypi_package.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import json
from typing import List
from urllib.request import Request

import requests
from jinja2 import Environment, PackageLoader, select_autoescape, FileSystemLoader

from pip2spack.framework.messages import Messages


class PyPiPackage:
content: dict = {}
Expand All @@ -25,7 +29,7 @@ def __init__(self, content):
self.homepage_builder()

@property
def get_versions(self):
def _get_versions(self):
self.versions = []
self._versions_formatter()
self.version_builder()
Expand Down Expand Up @@ -131,3 +135,24 @@ def generate_custom_file(abspath: str, versions):
env = Environment(loader=FileSystemLoader(abspath))
template = env.get_template('package.py')
return template.render({"versions": versions})

def download_versions(self, versions: List = None):
if not versions:
latest_version = self.content['info']['version']
latest_filename = self.content['releases'].get(latest_version)[0]["filename"]
Messages.warn(f"Missing versions parameter, downloading a latest one v{latest_version}")
r = requests.get(url=self.url)
self.__save_content(latest_filename, r.content)

@staticmethod
def __save_content(name: str, content: bytes):
import os
import tempfile
path = tempfile.gettempdir()
pip2spack = os.path.join(path, "pip2spack")
content_filename = os.path.join(pip2spack, name)
os.makedirs(pip2spack, exist_ok=True)

with open(content_filename, 'wb') as content_to_save:
content_to_save.write(content)
Messages.info(f"Content was saved into {content_filename}")
4 changes: 2 additions & 2 deletions src/pip2spack/framework/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ class Messages:
def package_availability(available: list, unavailable: list):
Messages.info("Package status")
if available:
print("Available to convert:")
print("Available:")
for key in available:
print(f"\t{key}")

Expand All @@ -12,7 +12,7 @@ def package_availability(available: list, unavailable: list):
print()
return

print("\nUnavailable to convert:")
print("\nUnavailable:")
for p in packages_not_found:
print(f'\t{p}')
else:
Expand Down

0 comments on commit 24d7fdf

Please sign in to comment.