Skip to content

Commit

Permalink
python-parser: remove P: Pipe bounds
Browse files Browse the repository at this point in the history
Signed-off-by: Tibor Benke <[email protected]>
  • Loading branch information
Tibor Benke committed Aug 17, 2016
1 parent dca7b22 commit 9b0fea0
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 59 deletions.
30 changes: 12 additions & 18 deletions python-parser/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ pub mod py_logmsg;
pub mod utils;

use std::borrow::Borrow;
use std::marker::PhantomData;

use syslog_ng_common::{LogMessage, Parser, ParserBuilder, Error, Pipe, GlobalConfig};
use cpython::{Python, PyDict, NoArgs, PyObject, PyResult, PyModule, PyErr, PyString, ToPyObject};
Expand All @@ -23,19 +22,17 @@ pub mod options {
pub const CLASS: &'static str = "class";
}

pub struct PythonParser<P: Pipe> {
pub struct PythonParser {
parser: PyObject,
_marker: PhantomData<P>,
}

pub struct PythonParserBuilder<P: Pipe> {
pub struct PythonParserBuilder {
module: Option<String>,
class: Option<String>,
options: Vec<(String, String)>,
_marker: PhantomData<P>,
}

impl<P: Pipe> PythonParserBuilder<P> {
impl PythonParserBuilder {
// Although these functions are very small ones, they are very useful for testing
pub fn load_module<'p>(py: Python<'p>, module_name: &str) -> PyResult<PyModule> {
debug!("Trying to load Python module, module='{}'", module_name);
Expand Down Expand Up @@ -158,25 +155,23 @@ fn python_debug_callback(_: Python, debug_message: &str) -> PyResult<NoArgs> {
Ok(NoArgs)
}

impl<P: Pipe> Clone for PythonParserBuilder<P> {
impl Clone for PythonParserBuilder {
fn clone(&self) -> Self {
PythonParserBuilder {
module: self.module.clone(),
class: self.class.clone(),
options: self.options.clone(),
_marker: PhantomData,
}
}
}

impl<P: Pipe> ParserBuilder<P> for PythonParserBuilder<P> {
type Parser = PythonParser<P>;
impl ParserBuilder for PythonParserBuilder {
type Parser = PythonParser;
fn new(_: GlobalConfig) -> Self {
PythonParserBuilder {
module: None,
class: None,
options: Vec::new(),
_marker: PhantomData,
}
}
fn option(&mut self, name: String, value: String) -> Result<(), Error> {
Expand All @@ -200,13 +195,12 @@ impl<P: Pipe> ParserBuilder<P> for PythonParserBuilder<P> {
let module_name = try!(self.module.ok_or(Error::missing_required_option(options::MODULE)));
let class_name = try!(self.class.ok_or(Error::missing_required_option(options::CLASS)));

match PythonParserBuilder::<P>::load_and_init_class(py, &module_name, &class_name, &self.options) {
match PythonParserBuilder::load_and_init_class(py, &module_name, &class_name, &self.options) {
Ok(parser_instance) => {
debug!("Python parser successfully initialized, class='{}'",
&class_name);
Ok(PythonParser {
parser: parser_instance,
_marker: PhantomData,
})
}
Err(error) => {
Expand All @@ -219,7 +213,7 @@ impl<P: Pipe> ParserBuilder<P> for PythonParserBuilder<P> {
}
}

impl<P: Pipe> PythonParser<P> {
impl PythonParser {
pub fn process_parsing<'p>(&mut self, py: Python<'p>, logmsg: PyLogMessage, message: &str) -> PyResult<PyObject> {
debug!("Trying to call parse() method on Python parser");
self.parser.call_method(py, "parse", (logmsg, message), None)
Expand All @@ -230,12 +224,12 @@ impl<P: Pipe> PythonParser<P> {
}
pub fn call_parse<'p>(&mut self, py: Python<'p>, logmsg: PyLogMessage, input: &str) -> PyResult<bool> {
let result = try!(self.process_parsing(py, logmsg, input));
PythonParser::<P>::process_parse_result(py, result)
PythonParser::process_parse_result(py, result)
}
}

impl<P: Pipe> Parser<P> for PythonParser<P> {
fn parse(&mut self, _: &mut P, logmsg: &mut LogMessage, input: &str) -> bool {
impl Parser for PythonParser {
fn parse(&mut self, _: &mut Pipe, logmsg: &mut LogMessage, input: &str) -> bool {
let gil = Python::acquire_gil();
let py = gil.python();
match PyLogMessage::new(py, logmsg.clone()) {
Expand All @@ -258,4 +252,4 @@ impl<P: Pipe> Parser<P> for PythonParser<P> {
}
}

parser_plugin!(PythonParserBuilder<LogParser>);
parser_plugin!(PythonParserBuilder);
6 changes: 3 additions & 3 deletions python-parser/src/utils.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
use syslog_ng_common::{ParserBuilder, mock, GlobalConfig};
use syslog_ng_common::{ParserBuilder, GlobalConfig};

use PythonParser;
use PythonParserBuilder;

pub fn build_parser_with_options(module_name: &str,
class_name: &str,
options: &[(&str, &str)])
-> PythonParser<mock::MockPipe> {
-> PythonParser {
let cfg = GlobalConfig::new(0x0308);
let mut builder = PythonParserBuilder::new(cfg);
builder.option(::options::MODULE.to_owned(), module_name.to_owned()).ok().unwrap();
Expand All @@ -17,6 +17,6 @@ pub fn build_parser_with_options(module_name: &str,
builder.build().unwrap()
}

pub fn build_parser(module_name: &str, class_name: &str) -> PythonParser<mock::MockPipe> {
pub fn build_parser(module_name: &str, class_name: &str) -> PythonParser {
build_parser_with_options(module_name, class_name, &[])
}
5 changes: 2 additions & 3 deletions python-parser/tests/logging.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ extern crate log;
use std::env;
use python_parser::{options, PythonParserBuilder};
use syslog_ng_common::{ParserBuilder, SYSLOG_NG_INITIALIZED, syslog_ng_global_init, GlobalConfig};
use syslog_ng_common::mock::MockPipe;
use log::{LogRecord, LogLevel, LogMetadata};

use std::sync::Arc;
Expand Down Expand Up @@ -65,7 +64,7 @@ fn logging_callbacks_can_be_used_from_init_method(messages: Arc<Mutex<Vec<Simpli
SimplifiedLogRecord::new(LogLevel::Error, "ERROR"),
SimplifiedLogRecord::new(LogLevel::Debug, "DEBUG")];
let cfg = GlobalConfig::new(0x0308);
let mut builder = PythonParserBuilder::<MockPipe>::new(cfg);
let mut builder = PythonParserBuilder::new(cfg);
builder.option(options::MODULE.to_owned(), "_test_module".to_owned()).ok().unwrap();
builder.option(options::CLASS.to_owned(),
"LoggingIsUsedInInitMethod".to_owned())
Expand All @@ -92,7 +91,7 @@ fn logging_callbacks_are_not_overriden_if_they_are_already_defined(messages: Arc
SimplifiedLogRecord::new(LogLevel::Warn,
"Already implemented debug() function, omitting callback definition.")];
let cfg = GlobalConfig::new(0x0308);
let mut builder = PythonParserBuilder::<MockPipe>::new(cfg);
let mut builder = PythonParserBuilder::new(cfg);
builder.option(options::MODULE.to_owned(),
"_test_module.test_logging".to_owned())
.ok()
Expand Down
4 changes: 2 additions & 2 deletions python-parser/tests/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ fn test_error_is_returned_if_there_is_no_parse_method() {
let gil = Python::acquire_gil();
let py = gil.python();
let result = call_parse(py, TEST_MODULE_NAME, "ParseMethodReturnsNotBoolean").unwrap();
let _ = PythonParser::<MockPipe>::process_parse_result(py, result).err().unwrap();
let _ = PythonParser::process_parse_result(py, result).err().unwrap();
}

#[test]
Expand All @@ -47,7 +47,7 @@ fn test_parse_method_which_returns_boolean_does_not_raise_errors() {
let gil = Python::acquire_gil();
let py = gil.python();
let result = call_parse(py, TEST_MODULE_NAME, "ParserClassWithGoodParseMethod").unwrap();
let _ = PythonParser::<MockPipe>::process_parse_result(py, result).unwrap();
let _ = PythonParser::process_parse_result(py, result).unwrap();
}

#[test]
Expand Down
65 changes: 32 additions & 33 deletions python-parser/tests/parser_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ extern crate env_logger;
use std::env;
use python_parser::{PythonParserBuilder, options};
use syslog_ng_common::{ParserBuilder, SYSLOG_NG_INITIALIZED, syslog_ng_global_init, GlobalConfig};
use syslog_ng_common::mock::MockPipe;
use cpython::{Python, PyDict};

const TEST_MODULE_NAME: &'static str = "_test_module";
Expand All @@ -17,7 +16,7 @@ fn test_exising_module_can_be_imported() {
env::set_var("PYTHONPATH", env::current_dir().unwrap());
let gil = Python::acquire_gil();
let py = gil.python();
let _ = PythonParserBuilder::<MockPipe>::load_module(py, TEST_MODULE_NAME).unwrap();
let _ = PythonParserBuilder::load_module(py, TEST_MODULE_NAME).unwrap();
}

#[test]
Expand All @@ -26,7 +25,7 @@ fn test_non_exising_module_cannot_be_imported() {
env::set_var("PYTHONPATH", env::current_dir().unwrap());
let gil = Python::acquire_gil();
let py = gil.python();
let _ = PythonParserBuilder::<MockPipe>::load_module(py, "__non_existing_python_module_name").err().unwrap();
let _ = PythonParserBuilder::load_module(py, "__non_existing_python_module_name").err().unwrap();
}

#[test]
Expand All @@ -35,8 +34,8 @@ fn test_existing_class_be_imported_from_module() {
env::set_var("PYTHONPATH", env::current_dir().unwrap());
let gil = Python::acquire_gil();
let py = gil.python();
let module = PythonParserBuilder::<MockPipe>::load_module(py, TEST_MODULE_NAME).unwrap();
let _ = PythonParserBuilder::<MockPipe>::load_class(py, &module, "ExistingParser").unwrap();
let module = PythonParserBuilder::load_module(py, TEST_MODULE_NAME).unwrap();
let _ = PythonParserBuilder::load_class(py, &module, "ExistingParser").unwrap();
}

#[test]
Expand All @@ -45,8 +44,8 @@ fn test_non_exising_class_cannot_be_imported() {
env::set_var("PYTHONPATH", env::current_dir().unwrap());
let gil = Python::acquire_gil();
let py = gil.python();
let module = PythonParserBuilder::<MockPipe>::load_module(py, TEST_MODULE_NAME).unwrap();
let _ = PythonParserBuilder::<MockPipe>::load_class(py, &module, "NonExistingParser").err().unwrap();
let module = PythonParserBuilder::load_module(py, TEST_MODULE_NAME).unwrap();
let _ = PythonParserBuilder::load_class(py, &module, "NonExistingParser").err().unwrap();
}

#[test]
Expand All @@ -55,9 +54,9 @@ fn test_parser_class_is_callable() {
env::set_var("PYTHONPATH", env::current_dir().unwrap());
let gil = Python::acquire_gil();
let py = gil.python();
let module = PythonParserBuilder::<MockPipe>::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::<MockPipe>::load_class(py, &module, "CallableClass").unwrap();
let _ = PythonParserBuilder::<MockPipe>::instantiate_class(py, &class).unwrap();
let module = PythonParserBuilder::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::load_class(py, &module, "CallableClass").unwrap();
let _ = PythonParserBuilder::instantiate_class(py, &class).unwrap();
}

#[test]
Expand All @@ -66,9 +65,9 @@ fn test_not_callable_object_cannot_be_instantiated() {
env::set_var("PYTHONPATH", env::current_dir().unwrap());
let gil = Python::acquire_gil();
let py = gil.python();
let module = PythonParserBuilder::<MockPipe>::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::<MockPipe>::load_class(py, &module, "NotCallableObject").unwrap();
let _ = PythonParserBuilder::<MockPipe>::instantiate_class(py, &class).err().unwrap();
let module = PythonParserBuilder::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::load_class(py, &module, "NotCallableObject").unwrap();
let _ = PythonParserBuilder::instantiate_class(py, &class).err().unwrap();
}

#[test]
Expand All @@ -77,10 +76,10 @@ fn test_init_is_called_if_it_exists() {
env::set_var("PYTHONPATH", env::current_dir().unwrap());
let gil = Python::acquire_gil();
let py = gil.python();
let module = PythonParserBuilder::<MockPipe>::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::<MockPipe>::load_class(py, &module, "ClassWithInitMethod").unwrap();
let instance = PythonParserBuilder::<MockPipe>::instantiate_class(py, &class).unwrap();
let _ = PythonParserBuilder::<MockPipe>::initialize_instance(py, &instance, PyDict::new(py)).unwrap();
let module = PythonParserBuilder::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::load_class(py, &module, "ClassWithInitMethod").unwrap();
let instance = PythonParserBuilder::instantiate_class(py, &class).unwrap();
let _ = PythonParserBuilder::initialize_instance(py, &instance, PyDict::new(py)).unwrap();
}

#[test]
Expand All @@ -89,10 +88,10 @@ fn test_parser_may_not_have_init_method() {
env::set_var("PYTHONPATH", env::current_dir().unwrap());
let gil = Python::acquire_gil();
let py = gil.python();
let module = PythonParserBuilder::<MockPipe>::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::<MockPipe>::load_class(py, &module, "InitMethodReturnsNotNone").unwrap();
let instance = PythonParserBuilder::<MockPipe>::instantiate_class(py, &class).unwrap();
let _ = PythonParserBuilder::<MockPipe>::initialize_instance(py, &instance, PyDict::new(py)).err().unwrap();
let module = PythonParserBuilder::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::load_class(py, &module, "InitMethodReturnsNotNone").unwrap();
let instance = PythonParserBuilder::instantiate_class(py, &class).unwrap();
let _ = PythonParserBuilder::initialize_instance(py, &instance, PyDict::new(py)).err().unwrap();
}

#[test]
Expand All @@ -101,10 +100,10 @@ fn test_init_must_return_nothing() {
env::set_var("PYTHONPATH", env::current_dir().unwrap());
let gil = Python::acquire_gil();
let py = gil.python();
let module = PythonParserBuilder::<MockPipe>::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::<MockPipe>::load_class(py, &module, "ParserWithoutInitMethod").unwrap();
let instance = PythonParserBuilder::<MockPipe>::instantiate_class(py, &class).unwrap();
let _ = PythonParserBuilder::<MockPipe>::initialize_instance(py, &instance, PyDict::new(py)).unwrap();
let module = PythonParserBuilder::load_module(py, TEST_MODULE_NAME).unwrap();
let class = PythonParserBuilder::load_class(py, &module, "ParserWithoutInitMethod").unwrap();
let instance = PythonParserBuilder::instantiate_class(py, &class).unwrap();
let _ = PythonParserBuilder::initialize_instance(py, &instance, PyDict::new(py)).unwrap();
}

#[test]
Expand All @@ -114,20 +113,20 @@ fn test_module_loading_and_class_initialization() {
let gil = Python::acquire_gil();
let py = gil.python();
let options = [];
let _ = PythonParserBuilder::<MockPipe>::load_and_init_class(py,
let _ = PythonParserBuilder::load_and_init_class(py,
"__non_existing_python_module_name",
"ExistingParser",
&options)
.err()
.unwrap();
let _ = PythonParserBuilder::<MockPipe>::load_and_init_class(py, TEST_MODULE_NAME, "NonExistingParser", &options)
let _ = PythonParserBuilder::load_and_init_class(py, TEST_MODULE_NAME, "NonExistingParser", &options)
.err()
.unwrap();
let _ = PythonParserBuilder::<MockPipe>::load_and_init_class(py, TEST_MODULE_NAME, "ExistingParser", &options)
let _ = PythonParserBuilder::load_and_init_class(py, TEST_MODULE_NAME, "ExistingParser", &options)
.unwrap();
let _ = PythonParserBuilder::<MockPipe>::load_and_init_class(py, TEST_MODULE_NAME, "ClassWithInitMethod", &options)
let _ = PythonParserBuilder::load_and_init_class(py, TEST_MODULE_NAME, "ClassWithInitMethod", &options)
.unwrap();
let _ = PythonParserBuilder::<MockPipe>::load_and_init_class(py,
let _ = PythonParserBuilder::load_and_init_class(py,
TEST_MODULE_NAME,
"InitMethodReturnsNotNone",
&options)
Expand All @@ -144,7 +143,7 @@ fn test_parser_can_be_built_if_there_is_no_error() {
}
});
let cfg = GlobalConfig::new(0x0308);
let mut builder = PythonParserBuilder::<MockPipe>::new(cfg);
let mut builder = PythonParserBuilder::new(cfg);
builder.option(options::MODULE.to_owned(), "_test_module".to_owned()).ok().unwrap();
builder.option(options::CLASS.to_owned(), "ExistingParser".to_owned()).ok().unwrap();
let _ = builder.build().unwrap();
Expand All @@ -159,7 +158,7 @@ fn test_parser_cannot_be_built_if_there_is_an_error() {
}
});
let cfg = GlobalConfig::new(0x0308);
let mut builder = PythonParserBuilder::<MockPipe>::new(cfg);
let mut builder = PythonParserBuilder::new(cfg);
builder.option(options::MODULE.to_owned(), "_test_module".to_owned()).ok().unwrap();
builder.option(options::CLASS.to_owned(), "NonExistingParser".to_owned()).ok().unwrap();
let _ = builder.build().err().unwrap();
Expand All @@ -174,7 +173,7 @@ fn test_exception_is_raised_in_init_method() {
}
});
let cfg = GlobalConfig::new(0x0308);
let mut builder = PythonParserBuilder::<MockPipe>::new(cfg);
let mut builder = PythonParserBuilder::new(cfg);
builder.option(options::MODULE.to_owned(), "_test_module".to_owned()).ok().unwrap();
builder.option(options::CLASS.to_owned(),
"ExceptionIsRaisedInInitMethod".to_owned())
Expand Down

0 comments on commit 9b0fea0

Please sign in to comment.