Skip to content

Commit

Permalink
Remove package managers from MetaCall CLI.
Browse files Browse the repository at this point in the history
  • Loading branch information
viferga committed Jan 23, 2020
1 parent 35e05e0 commit 4dd06b2
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 340 deletions.
42 changes: 1 addition & 41 deletions source/examples/metacallcli/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -54,23 +54,6 @@ add_executable(${target}
# Create namespaced alias
add_executable(${META_PROJECT_NAME}::${target} ALIAS ${target})

# Configure package manager path
if(MSVC)
set(PROJECT_METACALL_PACK_MAN_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}")
else()
set(PROJECT_METACALL_PACK_MAN_DIR "${CMAKE_BINARY_DIR}")
endif()

# Copy package manager scripts
add_custom_target(${target}-scripts ALL
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/package_manager/pip.py ${PROJECT_METACALL_PACK_MAN_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/package_manager/npm.js ${PROJECT_METACALL_PACK_MAN_DIR}
)

# Set dependency to metacallcli
add_dependencies(${target} ${target}-scripts)

#
# Project options
#
Expand Down Expand Up @@ -138,22 +121,11 @@ install(TARGETS ${target}
BUNDLE DESTINATION ${INSTALL_BIN} COMPONENT examples
)

# Scripts (Package Managers)
install(FILES
${CMAKE_CURRENT_SOURCE_DIR}/package_manager/pip.py
${CMAKE_CURRENT_SOURCE_DIR}/package_manager/npm.js
DESTINATION ${INSTALL_LIB}
COMPONENT runtime
)

#
# Define test
#

#set(TEST_COMMAND_LINE_ARGS "help") # TODO: Forward all commands, create an adaptor to existing system
set(TEST_COMMAND_LINE_ARGS "load mock test.mock")
#set(TEST_COMMAND_LINE_ARGS "install py numpy")
#set(TEST_COMMAND_LINE_ARGS "install node rambda") # TODO: This segfaults during ctest but not when running it normally
set(TEST_COMMAND_LINE_ARGS "test.mock")

if(WIN32)
set(TEST_COMMAND cmd /c)
Expand All @@ -176,19 +148,7 @@ set_property(TEST ${target}

include(TestEnvironmentVariables)

if(NOT OPTION_BUILD_GUIX)
# Get node path for npm
execute_process(
COMMAND npm root --quiet -g
OUTPUT_VARIABLE NODE_PATH
)
set(NODE_PATH "NODE_PATH=${NODE_PATH}")
else()
set(NODE_PATH "NODE_PATH=$ENV{NODE_PATH}")
endif()

test_environment_variables(${target}
${TEST_COMMAND_LINE_ARGS}
${TESTS_ENVIRONMENT_VARIABLES}
${NODE_PATH}
)
128 changes: 16 additions & 112 deletions source/examples/metacallcli/application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -315,8 +315,8 @@ bool command_cb_exit(application & app, tokenizer & /*t*/)

/* -- Methods -- */

application::parameter_iterator::parameter_iterator(application & app, const char * command, const char * tag, application::arg_list & arguments) :
app(app), command(command), tag(tag), arguments(arguments)
application::parameter_iterator::parameter_iterator(application & app) :
app(app)
{

}
Expand All @@ -328,115 +328,22 @@ application::parameter_iterator::~parameter_iterator()

void application::parameter_iterator::operator()(const char * parameter)
{
arguments.push_back(parameter);
}

void application::parameter_iterator::evaluate()
{
typedef std::function<void(application &, const std::string &, const std::string &, application::arg_list &)> parameter_callback;
std::string script(parameter);

/* List of scripts that run pip/npm/gem */
static std::unordered_map<std::string, std::string> install_scripts =
static std::unordered_map<std::string, std::string> extension_to_tag =
{
{
"py",

"#!/usr/bin/env python3\n"
"\n"
"try:\n"
" from pip import main as pipmain\n"
"except ImportError:\n"
" from pip._internal import main as pipmain\n"
"\n"
"def package_manager(args):\n"
" return pipmain(args);\n"
},
{
"node",

"const path = require('path');\n"
"let npm = { package_manager: function (args) { console.log('NPM could not be found, please set up LOADER_LIBRARY_PATH enviroment variable,'); } };\n"
"try {\n"
" npm = require(path.join(process.env['LOADER_LIBRARY_PATH'], 'npm.js'));\n"
"} catch (e) {\n"
" console.log(e);\n"
"}\n"
"module.exports = npm;\n"
}
{ "mock", "mock" },
{ "py", "py" },
{ "js", "node" },
{ "rb", "rb" },
{ "cs", "cs" }
};

/* List of available commands when installing */
static std::unordered_map<std::string, parameter_callback> parameter_commands =
{
{
"load", [](application & app, const std::string & tag, const std::string &, application::arg_list & args)
{
std::for_each(args.begin(), args.end(), [&app, &tag](const std::string & script)
{
app.load(tag, script);
});
}
},
{
"install", [](application & app, const std::string & tag, const std::string & command, application::arg_list & args)
{
const std::string & script = install_scripts[tag];

if (script == "")
{
std::cout << "Package manager script not available for tag (" << tag << ")" << std::endl;

app.shutdown();

return;
}

if (metacall_load_from_memory(tag.c_str(), script.c_str(), script.size(), NULL) != 0)
{
std::cout << "Error when loading (" << tag << ") package manager script" << std::endl;

app.shutdown();
const std::string tag = extension_to_tag[script.substr(script.find_last_of(".") + 1)];

return;
}

void * args_values[1] =
{
metacall_value_create_array(NULL, args.size() + 1)
};

void ** array_value = static_cast<void **>(metacall_value_to_array(args_values[0]));

size_t iterator = 0;

array_value[iterator++] = metacall_value_create_string(command.c_str(), command.length());

std::for_each(args.begin(), args.end(), [&array_value, &iterator](const std::string & arg)
{
array_value[iterator++] = metacall_value_create_string(arg.c_str(), arg.length());
});

void * result = metacallv("package_manager", args_values);

metacall_value_destroy(args_values[0]);

/* TODO: Do something with result */

if (result != NULL)
{
metacall_value_destroy(result);
}

app.shutdown();
}
}
};

const parameter_callback cb = parameter_commands[command];

if (cb != nullptr)
if (!app.load(tag, script))
{
cb(app, tag, command, arguments);
app.shutdown();
}
}

Expand Down Expand Up @@ -548,16 +455,13 @@ application::application(int argc, char * argv[]) : exit_condition(false), log_p
/* Print MetaCall information */
metacall_print_info();

/* Parse program arguments if any (e.g metacall (0) load (1) py (2) asd.py (3)) */
if (argc > 3)
/* Parse program arguments if any (e.g metacall (0) a.py (1) b.js (2) c.rb (3)) */
if (argc > 1)
{
parameter_iterator param_it(*this, argv[1], argv[2], arguments);
parameter_iterator param_it(*this);

/* Parse program parameters */
std::for_each(&argv[3], argv + argc, param_it);

/* Execute the action */
param_it.evaluate();
std::for_each(&argv[1], argv + argc, param_it);
}

/* Define available commands */
Expand Down
20 changes: 1 addition & 19 deletions source/examples/metacallcli/application.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,17 +234,8 @@ class application
*
* @param[in] app
* Reference to the application
*
* @param[in] command
* Command to be executed
*
* @param[in] tag
* Loader tag reference
*
* @param[in] arguments
* Reference to list of arguments to be iterated
*/
parameter_iterator(application & app, const char * command, const char * tag, arg_list & arguments);
parameter_iterator(application & app);

/**
* @brief
Expand All @@ -261,12 +252,6 @@ class application
*/
void operator()(const char * parameter);

/**
* @brief
* Execute the action parsed by parameters
*/
void evaluate();

/**
* @brief
* Assignement operator for parameter iterator
Expand All @@ -281,9 +266,6 @@ class application
/* -- Private Member Data -- */

application & app; /**< Reference to the application */
std::string command; /**< Command to be executed */
std::string tag; /**< Loader tag reference */
arg_list & arguments; /**< Reference to the argument list */
};

/* -- Private Member Data -- */
Expand Down
Loading

0 comments on commit 4dd06b2

Please sign in to comment.