Skip to content

Commit 4dd06b2

Browse files
committed
Remove package managers from MetaCall CLI.
1 parent 35e05e0 commit 4dd06b2

File tree

5 files changed

+18
-340
lines changed

5 files changed

+18
-340
lines changed

source/examples/metacallcli/CMakeLists.txt

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -54,23 +54,6 @@ add_executable(${target}
5454
# Create namespaced alias
5555
add_executable(${META_PROJECT_NAME}::${target} ALIAS ${target})
5656

57-
# Configure package manager path
58-
if(MSVC)
59-
set(PROJECT_METACALL_PACK_MAN_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}")
60-
else()
61-
set(PROJECT_METACALL_PACK_MAN_DIR "${CMAKE_BINARY_DIR}")
62-
endif()
63-
64-
# Copy package manager scripts
65-
add_custom_target(${target}-scripts ALL
66-
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
67-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/package_manager/pip.py ${PROJECT_METACALL_PACK_MAN_DIR}
68-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/package_manager/npm.js ${PROJECT_METACALL_PACK_MAN_DIR}
69-
)
70-
71-
# Set dependency to metacallcli
72-
add_dependencies(${target} ${target}-scripts)
73-
7457
#
7558
# Project options
7659
#
@@ -138,22 +121,11 @@ install(TARGETS ${target}
138121
BUNDLE DESTINATION ${INSTALL_BIN} COMPONENT examples
139122
)
140123

141-
# Scripts (Package Managers)
142-
install(FILES
143-
${CMAKE_CURRENT_SOURCE_DIR}/package_manager/pip.py
144-
${CMAKE_CURRENT_SOURCE_DIR}/package_manager/npm.js
145-
DESTINATION ${INSTALL_LIB}
146-
COMPONENT runtime
147-
)
148-
149124
#
150125
# Define test
151126
#
152127

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

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

177149
include(TestEnvironmentVariables)
178150

179-
if(NOT OPTION_BUILD_GUIX)
180-
# Get node path for npm
181-
execute_process(
182-
COMMAND npm root --quiet -g
183-
OUTPUT_VARIABLE NODE_PATH
184-
)
185-
set(NODE_PATH "NODE_PATH=${NODE_PATH}")
186-
else()
187-
set(NODE_PATH "NODE_PATH=$ENV{NODE_PATH}")
188-
endif()
189-
190151
test_environment_variables(${target}
191152
${TEST_COMMAND_LINE_ARGS}
192153
${TESTS_ENVIRONMENT_VARIABLES}
193-
${NODE_PATH}
194154
)

source/examples/metacallcli/application.cpp

Lines changed: 16 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,8 @@ bool command_cb_exit(application & app, tokenizer & /*t*/)
315315

316316
/* -- Methods -- */
317317

318-
application::parameter_iterator::parameter_iterator(application & app, const char * command, const char * tag, application::arg_list & arguments) :
319-
app(app), command(command), tag(tag), arguments(arguments)
318+
application::parameter_iterator::parameter_iterator(application & app) :
319+
app(app)
320320
{
321321

322322
}
@@ -328,115 +328,22 @@ application::parameter_iterator::~parameter_iterator()
328328

329329
void application::parameter_iterator::operator()(const char * parameter)
330330
{
331-
arguments.push_back(parameter);
332-
}
333-
334-
void application::parameter_iterator::evaluate()
335-
{
336-
typedef std::function<void(application &, const std::string &, const std::string &, application::arg_list &)> parameter_callback;
331+
std::string script(parameter);
337332

338-
/* List of scripts that run pip/npm/gem */
339-
static std::unordered_map<std::string, std::string> install_scripts =
333+
static std::unordered_map<std::string, std::string> extension_to_tag =
340334
{
341-
{
342-
"py",
343-
344-
"#!/usr/bin/env python3\n"
345-
"\n"
346-
"try:\n"
347-
" from pip import main as pipmain\n"
348-
"except ImportError:\n"
349-
" from pip._internal import main as pipmain\n"
350-
"\n"
351-
"def package_manager(args):\n"
352-
" return pipmain(args);\n"
353-
},
354-
{
355-
"node",
356-
357-
"const path = require('path');\n"
358-
"let npm = { package_manager: function (args) { console.log('NPM could not be found, please set up LOADER_LIBRARY_PATH enviroment variable,'); } };\n"
359-
"try {\n"
360-
" npm = require(path.join(process.env['LOADER_LIBRARY_PATH'], 'npm.js'));\n"
361-
"} catch (e) {\n"
362-
" console.log(e);\n"
363-
"}\n"
364-
"module.exports = npm;\n"
365-
}
335+
{ "mock", "mock" },
336+
{ "py", "py" },
337+
{ "js", "node" },
338+
{ "rb", "rb" },
339+
{ "cs", "cs" }
366340
};
367341

368-
/* List of available commands when installing */
369-
static std::unordered_map<std::string, parameter_callback> parameter_commands =
370-
{
371-
{
372-
"load", [](application & app, const std::string & tag, const std::string &, application::arg_list & args)
373-
{
374-
std::for_each(args.begin(), args.end(), [&app, &tag](const std::string & script)
375-
{
376-
app.load(tag, script);
377-
});
378-
}
379-
},
380-
{
381-
"install", [](application & app, const std::string & tag, const std::string & command, application::arg_list & args)
382-
{
383-
const std::string & script = install_scripts[tag];
384-
385-
if (script == "")
386-
{
387-
std::cout << "Package manager script not available for tag (" << tag << ")" << std::endl;
388-
389-
app.shutdown();
390-
391-
return;
392-
}
393-
394-
if (metacall_load_from_memory(tag.c_str(), script.c_str(), script.size(), NULL) != 0)
395-
{
396-
std::cout << "Error when loading (" << tag << ") package manager script" << std::endl;
397-
398-
app.shutdown();
342+
const std::string tag = extension_to_tag[script.substr(script.find_last_of(".") + 1)];
399343

400-
return;
401-
}
402-
403-
void * args_values[1] =
404-
{
405-
metacall_value_create_array(NULL, args.size() + 1)
406-
};
407-
408-
void ** array_value = static_cast<void **>(metacall_value_to_array(args_values[0]));
409-
410-
size_t iterator = 0;
411-
412-
array_value[iterator++] = metacall_value_create_string(command.c_str(), command.length());
413-
414-
std::for_each(args.begin(), args.end(), [&array_value, &iterator](const std::string & arg)
415-
{
416-
array_value[iterator++] = metacall_value_create_string(arg.c_str(), arg.length());
417-
});
418-
419-
void * result = metacallv("package_manager", args_values);
420-
421-
metacall_value_destroy(args_values[0]);
422-
423-
/* TODO: Do something with result */
424-
425-
if (result != NULL)
426-
{
427-
metacall_value_destroy(result);
428-
}
429-
430-
app.shutdown();
431-
}
432-
}
433-
};
434-
435-
const parameter_callback cb = parameter_commands[command];
436-
437-
if (cb != nullptr)
344+
if (!app.load(tag, script))
438345
{
439-
cb(app, tag, command, arguments);
346+
app.shutdown();
440347
}
441348
}
442349

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

551-
/* Parse program arguments if any (e.g metacall (0) load (1) py (2) asd.py (3)) */
552-
if (argc > 3)
458+
/* Parse program arguments if any (e.g metacall (0) a.py (1) b.js (2) c.rb (3)) */
459+
if (argc > 1)
553460
{
554-
parameter_iterator param_it(*this, argv[1], argv[2], arguments);
461+
parameter_iterator param_it(*this);
555462

556463
/* Parse program parameters */
557-
std::for_each(&argv[3], argv + argc, param_it);
558-
559-
/* Execute the action */
560-
param_it.evaluate();
464+
std::for_each(&argv[1], argv + argc, param_it);
561465
}
562466

563467
/* Define available commands */

source/examples/metacallcli/application.hpp

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -234,17 +234,8 @@ class application
234234
*
235235
* @param[in] app
236236
* Reference to the application
237-
*
238-
* @param[in] command
239-
* Command to be executed
240-
*
241-
* @param[in] tag
242-
* Loader tag reference
243-
*
244-
* @param[in] arguments
245-
* Reference to list of arguments to be iterated
246237
*/
247-
parameter_iterator(application & app, const char * command, const char * tag, arg_list & arguments);
238+
parameter_iterator(application & app);
248239

249240
/**
250241
* @brief
@@ -261,12 +252,6 @@ class application
261252
*/
262253
void operator()(const char * parameter);
263254

264-
/**
265-
* @brief
266-
* Execute the action parsed by parameters
267-
*/
268-
void evaluate();
269-
270255
/**
271256
* @brief
272257
* Assignement operator for parameter iterator
@@ -281,9 +266,6 @@ class application
281266
/* -- Private Member Data -- */
282267

283268
application & app; /**< Reference to the application */
284-
std::string command; /**< Command to be executed */
285-
std::string tag; /**< Loader tag reference */
286-
arg_list & arguments; /**< Reference to the argument list */
287269
};
288270

289271
/* -- Private Member Data -- */

0 commit comments

Comments
 (0)