mirror of
https://github.com/pantor/inja.git
synced 2026-05-20 03:05:23 +00:00
Merge branch 'master' of https://github.com/pantor/inja
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
name: Documentation
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build-deploy:
|
||||
runs-on: ubuntu-18.04
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
|
||||
- name: dependencies
|
||||
env:
|
||||
dependency_packages: doxygen
|
||||
run: sudo apt-get update && sudo apt-get -y install ${dependency_packages}
|
||||
|
||||
- name: build
|
||||
run: cd doc && doxygen ./Doxyfile
|
||||
|
||||
- name: deploy
|
||||
uses: peaceiris/actions-gh-pages@v2.2.0
|
||||
env:
|
||||
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
||||
PUBLISH_BRANCH: gh-pages
|
||||
PUBLISH_DIR: ./doc/html
|
||||
+2
-1
@@ -36,7 +36,7 @@ target_include_directories(inja INTERFACE
|
||||
$<INSTALL_INTERFACE:${INJA_INSTALL_INCLUDE_DIR}>
|
||||
)
|
||||
|
||||
# target_compile_features(inja INTERFACE cxx_std_11)
|
||||
target_compile_features(inja INTERFACE cxx_std_11)
|
||||
|
||||
set(INJA_PACKAGE_USE_EMBEDDED_JSON OFF)
|
||||
|
||||
@@ -89,6 +89,7 @@ if(BUILD_TESTING)
|
||||
|
||||
|
||||
add_library(single_inja INTERFACE)
|
||||
target_compile_features(single_inja INTERFACE cxx_std_11)
|
||||
target_include_directories(single_inja INTERFACE single_include include third_party/include)
|
||||
|
||||
add_executable(single_inja_test
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "renderer.hpp"
|
||||
#include "string_view.hpp"
|
||||
#include "template.hpp"
|
||||
#include "utils.hpp"
|
||||
|
||||
|
||||
namespace inja {
|
||||
@@ -144,7 +145,7 @@ class Environment {
|
||||
}
|
||||
|
||||
json load_json(const std::string& filename) {
|
||||
std::ifstream file(m_impl->input_path + filename);
|
||||
std::ifstream file = open_file_or_throw(m_impl->input_path + filename);
|
||||
json j;
|
||||
file >> j;
|
||||
return j;
|
||||
|
||||
@@ -384,8 +384,10 @@ class Parser {
|
||||
}
|
||||
// sys::path::remove_dots(pathname, true, sys::path::Style::posix);
|
||||
|
||||
Template include_template = parse_template(pathname);
|
||||
m_included_templates.emplace(pathname, include_template);
|
||||
if (m_included_templates.find(pathname) == m_included_templates.end()) {
|
||||
Template include_template = parse_template(pathname);
|
||||
m_included_templates.emplace(pathname, include_template);
|
||||
}
|
||||
|
||||
// generate a reference bytecode
|
||||
tmpl.bytecodes.emplace_back(Bytecode::Op::Include, json(pathname), Bytecode::Flag::ValueImmediate);
|
||||
@@ -505,7 +507,7 @@ class Parser {
|
||||
}
|
||||
|
||||
std::string load_file(nonstd::string_view filename) {
|
||||
std::ifstream file(static_cast<std::string>(filename));
|
||||
std::ifstream file = open_file_or_throw(static_cast<std::string>(filename));
|
||||
std::string text((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
|
||||
return text;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#ifndef PANTOR_INJA_UTILS_HPP
|
||||
#define PANTOR_INJA_UTILS_HPP
|
||||
|
||||
#include <fstream>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "string_view.hpp"
|
||||
@@ -12,6 +13,17 @@ inline void inja_throw(const std::string& type, const std::string& message) {
|
||||
throw std::runtime_error("[inja.exception." + type + "] " + message);
|
||||
}
|
||||
|
||||
inline std::ifstream open_file_or_throw(const std::string& path) {
|
||||
std::ifstream file;
|
||||
file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||
try {
|
||||
file.open(path);
|
||||
} catch(const std::ios_base::failure& e) {
|
||||
inja_throw("file_error", "failed accessing file at '" + path + "'");
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
namespace string_view {
|
||||
inline nonstd::string_view slice(nonstd::string_view view, size_t start, size_t end) {
|
||||
start = std::min(start, view.size());
|
||||
|
||||
@@ -1693,6 +1693,7 @@ struct Token {
|
||||
#ifndef PANTOR_INJA_UTILS_HPP
|
||||
#define PANTOR_INJA_UTILS_HPP
|
||||
|
||||
#include <fstream>
|
||||
#include <stdexcept>
|
||||
|
||||
// #include "string_view.hpp"
|
||||
@@ -1705,6 +1706,17 @@ inline void inja_throw(const std::string& type, const std::string& message) {
|
||||
throw std::runtime_error("[inja.exception." + type + "] " + message);
|
||||
}
|
||||
|
||||
inline std::ifstream open_file_or_throw(const std::string& path) {
|
||||
std::ifstream file;
|
||||
file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||
try {
|
||||
file.open(path);
|
||||
} catch(const std::ios_base::failure& e) {
|
||||
inja_throw("file_error", "failed accessing file at '" + path + "'");
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
namespace string_view {
|
||||
inline nonstd::string_view slice(nonstd::string_view view, size_t start, size_t end) {
|
||||
start = std::min(start, view.size());
|
||||
@@ -2384,8 +2396,10 @@ class Parser {
|
||||
}
|
||||
// sys::path::remove_dots(pathname, true, sys::path::Style::posix);
|
||||
|
||||
Template include_template = parse_template(pathname);
|
||||
m_included_templates.emplace(pathname, include_template);
|
||||
if (m_included_templates.find(pathname) == m_included_templates.end()) {
|
||||
Template include_template = parse_template(pathname);
|
||||
m_included_templates.emplace(pathname, include_template);
|
||||
}
|
||||
|
||||
// generate a reference bytecode
|
||||
tmpl.bytecodes.emplace_back(Bytecode::Op::Include, json(pathname), Bytecode::Flag::ValueImmediate);
|
||||
@@ -2505,7 +2519,7 @@ class Parser {
|
||||
}
|
||||
|
||||
std::string load_file(nonstd::string_view filename) {
|
||||
std::ifstream file(static_cast<std::string>(filename));
|
||||
std::ifstream file = open_file_or_throw(static_cast<std::string>(filename));
|
||||
std::string text((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
|
||||
return text;
|
||||
}
|
||||
@@ -3184,6 +3198,8 @@ class Renderer {
|
||||
|
||||
// #include "template.hpp"
|
||||
|
||||
// #include "utils.hpp"
|
||||
|
||||
|
||||
|
||||
namespace inja {
|
||||
@@ -3313,7 +3329,7 @@ class Environment {
|
||||
}
|
||||
|
||||
json load_json(const std::string& filename) {
|
||||
std::ifstream file(m_impl->input_path + filename);
|
||||
std::ifstream file = open_file_or_throw(m_impl->input_path + filename);
|
||||
json j;
|
||||
file >> j;
|
||||
return j;
|
||||
|
||||
@@ -23,6 +23,12 @@ TEST_CASE("loading") {
|
||||
SECTION("File includes should be rendered") {
|
||||
CHECK( env.render_file(test_file_directory + "include.txt", data) == "Answer: Hello Jeff." );
|
||||
}
|
||||
|
||||
SECTION("File error should throw") {
|
||||
std::string path(test_file_directory + "does-not-exist");
|
||||
CHECK_THROWS_WITH( env.load_file(path), "[inja.exception.file_error] failed accessing file at '" + path + "'" );
|
||||
CHECK_THROWS_WITH( env.load_json(path), "[inja.exception.file_error] failed accessing file at '" + path + "'" );
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("complete-files") {
|
||||
|
||||
@@ -378,6 +378,7 @@ TEST_CASE("templates") {
|
||||
|
||||
inja::Template t2 = env.parse("{% include \"greeting\" %}!");
|
||||
CHECK( env.render(t2, data) == "Hello Peter!" );
|
||||
CHECK_THROWS_WITH( env.parse("{% include \"does-not-exist\" %}!"), "[inja.exception.file_error] failed accessing file at 'does-not-exist'" );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user