facter 3.11.2.cfacter.20180612 → 3.11.3.cfacter.20180716

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/ext/facter/cpp-hocon/CMakeLists.txt +1 -1
  3. data/ext/facter/cpp-hocon/README.md +7 -0
  4. data/ext/facter/cpp-hocon/appveyor.yml +28 -21
  5. data/ext/facter/cpp-hocon/lib/inc/hocon/config_value.hpp +3 -3
  6. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_delayed_merge_object.hpp +3 -1
  7. data/ext/facter/cpp-hocon/lib/src/simple_includer.cc +1 -1
  8. data/ext/facter/cpp-hocon/lib/src/tokenizer.cc +1 -1
  9. data/ext/facter/cpp-hocon/lib/src/values/config_delayed_merge_object.cc +10 -0
  10. data/ext/facter/cpp-hocon/lib/src/values/config_value.cc +2 -2
  11. data/ext/facter/cpp-hocon/lib/src/values/simple_config_list.cc +1 -1
  12. data/ext/facter/cpp-hocon/lib/src/values/simple_config_object.cc +2 -2
  13. data/ext/facter/cpp-hocon/lib/tests/conf_parser_test.cc +8 -3
  14. data/ext/facter/cpp-hocon/lib/tests/config_document_parser_test.cc +2 -2
  15. data/ext/facter/cpp-hocon/lib/tests/config_document_tests.cc +2 -2
  16. data/ext/facter/cpp-hocon/lib/tests/config_substitution_test.cc +16 -20
  17. data/ext/facter/cpp-hocon/lib/tests/test_utils.cc +6 -6
  18. data/ext/facter/cpp-hocon/lib/tests/test_utils.hpp +7 -6
  19. data/ext/facter/cpp-hocon/lib/tests/tokenizer_test.cc +1 -1
  20. data/ext/facter/cpp-hocon/locales/cpp-hocon.pot +1 -1
  21. data/ext/facter/facter/CMakeLists.txt +1 -1
  22. data/ext/facter/facter/acceptance/lib/facter/acceptance/base_fact_utils.rb +2 -2
  23. data/ext/facter/facter/lib/Doxyfile +1 -1
  24. data/ext/facter/facter/lib/src/facts/linux/os_linux.cc +3 -1
  25. data/ext/facter/facter/lib/src/util/solaris/k_stat.cc +22 -30
  26. data/ext/facter/facter/locales/FACTER.pot +1 -5
  27. data/ext/facter/leatherman/CMakeLists.txt +1 -1
  28. data/ext/facter/leatherman/curl/inc/leatherman/curl/client.hpp +9 -0
  29. data/ext/facter/leatherman/curl/src/client.cc +15 -0
  30. data/ext/facter/leatherman/curl/tests/client_test.cc +15 -0
  31. data/ext/facter/leatherman/curl/tests/mock_curl.cc +8 -0
  32. data/ext/facter/leatherman/curl/tests/mock_curl.hpp +2 -1
  33. data/ext/facter/leatherman/locales/leatherman.pot +1 -1
  34. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7588ac463dcd3b514ae465ba049b1920bbdde2ee
4
- data.tar.gz: 80e9f0eceee6a484f3ed5d48abf6ac8796fcb1cb
3
+ metadata.gz: 59604eb95692d9fe7a11d3c65c28f32a4b807e11
4
+ data.tar.gz: e11014d9bfff774641b5fe5c75f81c831671bbe1
5
5
  SHA512:
6
- metadata.gz: 91b319c115bfcfe844434de4f9c55e8a6af87338bd8076bcf254fc593a2a90103686d7fa22427833be3aab2d91ed6dc84caf33d4fe659a36e51d1c637d5b531f
7
- data.tar.gz: e808eee29eb7dda579de56e443aa2a9e31c2cae64891f57331fc1c9ae1ffaea31216c8193210c396bdc7dafae0effdff22fdd622bd100d8fd614df021aac2756
6
+ metadata.gz: dee599e4596509d648066b32ade20990dbe4d430c6a7b8364f3ee75423827e65a6194f871541301a05aed4c28b0e1f79c0590c3d1eabb0f7f12749b91389c6ff
7
+ data.tar.gz: 68e4ab3e73b07dbba067e591582199a996a6fd2b58c5f887e010e0dbb4c220d31bed3d7da7eae085c1800233aa96791fb80fa34a6d2c91b9a94de1c17ce8324d
@@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.2.2)
4
4
  # Project Setup - modify to match project naming
5
5
  ## Source code for a simple command-line executable for a dynamic library will be generated from the project name.
6
6
  ## The command-line and library names will be based off the project name.
7
- project(cpp-hocon VERSION 0.1.5)
7
+ project(cpp-hocon VERSION 0.1.7)
8
8
 
9
9
  string(MAKE_C_IDENTIFIER ${PROJECT_NAME} PROJECT_C_NAME)
10
10
  string(TOUPPER ${PROJECT_C_NAME} PROJECT_NAME_UPPER)
@@ -37,6 +37,13 @@ M=MMMMMMMM++ FOR HUMANS ++M8MMMMMM7M
37
37
  7MM MMMDMMMM?MM88MM?MMMMOMM8 MM8
38
38
  ```
39
39
 
40
+ ## Caveats
41
+
42
+ This is a mostly complete implementation of the HOCON format. It currently has some known limitations
43
+
44
+ * Include requires the location specifier, i.e. `include "foo"` won't work but `include file("foo")` will. URL is not yet implemented, and classpath won't be supported as it makes less sense outside of the JVM.
45
+ * Unicode testing is absent so support is unknown. There are likely things that won't work.
46
+
40
47
 
41
48
  ## Build Requirements
42
49
 
@@ -1,31 +1,37 @@
1
1
  environment:
2
- LEATHERMAN_VERSION: 0.9.0
3
- install:
4
- - git submodule update --init --recursive
5
-
6
- - choco install -y mingw-w64 -Version 4.8.3 -source https://www.myget.org/F/puppetlabs
7
- - choco install -y cmake -Version 3.2.2 -source https://www.myget.org/F/puppetlabs
8
- - choco install -y gettext -Version 0.19.6 -source https://www.myget.org/F/puppetlabs
9
- - SET PATH=C:\Ruby21-x64\bin;C:\tools\mingw64\bin;C:\Program Files\gettext-iconv;%PATH%
10
- - ps: $env:PATH = $env:PATH.Replace("Git\bin", "Git\cmd")
11
- - ps: $env:PATH = $env:PATH.Replace("Git\usr\bin", "Git\cmd")
2
+ LEATHERMAN_VERSION: 1.4.0
3
+ matrix:
4
+ - shared: OFF
5
+
6
+ init:
7
+ - |
8
+ choco install -y mingw-w64 -Version 5.2.0 -source https://www.myget.org/F/puppetlabs
9
+ choco install -y cmake -Version 3.2.2 -source https://www.myget.org/F/puppetlabs
10
+ choco install -y gettext -Version 0.19.6 -source https://www.myget.org/F/puppetlabs
11
+ choco install -y pl-toolchain-x64 -Version 2015.12.01.1 -source https://www.myget.org/F/puppetlabs
12
+ choco install -y pl-boost-x64 -Version 1.58.0.2 -source https://www.myget.org/F/puppetlabs
13
+ choco install -y pl-openssl-x64 -Version 1.0.24.1 -source https://www.myget.org/F/puppetlabs
14
+ choco install -y pl-curl-x64 -Version 7.46.0.1 -source https://www.myget.org/F/puppetlabs
12
15
 
13
- - ps: wget 'https://s3.amazonaws.com/kylo-pl-bucket/boost_1_58_0-x86_64_mingw-w64_4.8.3_win32_seh.7z' -OutFile "$pwd\boost.7z"
14
- - ps: 7z.exe x boost.7z -oC:\tools | FIND /V "ing "
15
-
16
- - ps: wget 'https://s3.amazonaws.com/kylo-pl-bucket/curl-7.42.1-x86_64_mingw-w64_4.8.3_win32_seh.7z' -OutFile "$pwd\curl-7.42.1-x86_64_mingw-w64_4.8.3_win32_seh.7z"
17
- - ps: 7z.exe x "curl-7.42.1-x86_64_mingw-w64_4.8.3_win32_seh.7z" -oC:\tools | FIND /V "ing "
16
+ install:
17
+ - ps: |
18
+ wget "https://github.com/puppetlabs/leatherman/releases/download/$env:LEATHERMAN_VERSION/leatherman.7z" -OutFile "$pwd\leatherman.7z"
19
+ 7z.exe x leatherman.7z -oC:\tools | FIND /V "ing "
18
20
 
19
- - ps: wget "https://github.com/puppetlabs/leatherman/releases/download/$env:LEATHERMAN_VERSION/leatherman.7z" -OutFile "$pwd\leatherman.7z"
20
- - ps: 7z.exe x leatherman.7z -oC:\tools | FIND /V "ing "
21
+ # Minimize environment polution; previously we were linking against the wrong OpenSSL DLLs.
22
+ # Include Ruby and Powershell for unit tests.
23
+ - SET PATH=C:\tools\pl-build-tools\bin;C:\tools\mingw64\bin;C:\ProgramData\chocolatey\bin;C:\Ruby22-x64\bin;C:\Program Files\7-Zip;C:\Windows\system32;C:\Windows;C:\Windows\System32\WindowsPowerShell\v1.0
21
24
 
22
25
  build_script:
23
- - ps: cmake -G "MinGW Makefiles" -DBOOST_ROOT="C:\tools\boost_1_58_0-x86_64_mingw-w64_4.8.3_win32_seh" -DCMAKE_PREFIX_PATH="C:\tools\leatherman;C:\tools\curl-7.42.1-x86_64_mingw-w64_4.8.3_win32_seh" -DCURL_STATIC=ON -DBOOST_STATIC=ON -Wno-dev -DCMAKE_INSTALL_PREFIX=C:\tools\cpp-hocon .
24
- - ps: mingw32-make install
25
- - ps: 7z.exe a -t7z cpp-hocon.7z C:\tools\cpp-hocon\
26
+ - ps: |
27
+ cmake -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE="C:\tools\pl-build-tools\pl-build-toolchain.cmake" -DCMAKE_PREFIX_PATH="C:\tools\leatherman" -DCMAKE_INSTALL_PREFIX=C:\tools\cpp-hocon -DBOOST_STATIC=ON -DBUILD_SHARED_LIBS="$env:shared" .
28
+ mingw32-make -j2
26
29
 
27
30
  test_script:
28
- - ps: ctest -V 2>&1 | %{ if ($_ -is [System.Management.Automation.ErrorRecord]) { $_ | c++filt } else { $_ } }
31
+ - ps: |
32
+ ctest -V 2>&1 | %{ if ($_ -is [System.Management.Automation.ErrorRecord]) { $_ | c++filt } else { $_ } }
33
+ mingw32-make install
34
+ 7z.exe a -t7z cpp-hocon.7z C:\tools\cpp-hocon\
29
35
 
30
36
  artifacts:
31
37
  - path: cpp-hocon.7z
@@ -39,3 +45,4 @@ deploy:
39
45
  artifact: cpp-hocon.7z
40
46
  on:
41
47
  appveyor_repo_tag: true
48
+ shared: OFF
@@ -211,15 +211,15 @@ namespace hocon {
211
211
 
212
212
  class modifier {
213
213
  public:
214
- virtual shared_value modify_child_may_throw(std::string key_or_null, shared_value v) = 0;
214
+ virtual shared_value modify_child_may_throw(std::string const& key_or_null, shared_value v) = 0;
215
215
  };
216
216
 
217
217
  class no_exceptions_modifier : public modifier {
218
218
  public:
219
219
  no_exceptions_modifier(std::string prefix);
220
220
 
221
- shared_value modify_child_may_throw(std::string key_or_null, shared_value v) override;
222
- shared_value modify_child(std::string key, shared_value v) const;
221
+ shared_value modify_child_may_throw(std::string const &key_or_null, shared_value v) override;
222
+ shared_value modify_child(std::string const& key, shared_value v) const;
223
223
  private:
224
224
  std::string _prefix;
225
225
  };
@@ -7,10 +7,12 @@
7
7
 
8
8
  namespace hocon {
9
9
 
10
- class config_delayed_merge_object : public config_object, public replaceable_merge_stack {
10
+ class config_delayed_merge_object : public config_object, public unmergeable, public replaceable_merge_stack {
11
11
  public:
12
12
  config_delayed_merge_object(shared_origin origin, std::vector<shared_value> const& stack);
13
13
 
14
+ resolve_result<shared_value> resolve_substitutions(resolve_context const& context, resolve_source const& source) const override;
15
+ std::vector<shared_value> unmerged_values() const override;
14
16
  shared_value make_replacement(resolve_context const& context, int skipping) const override;
15
17
 
16
18
  shared_object with_value(path raw_path, shared_value value) const override;
@@ -58,7 +58,7 @@ namespace hocon {
58
58
  }
59
59
 
60
60
  shared_object simple_includer::include_file_without_fallback(shared_include_context context, std::string what) {
61
- return config::parse_file_any_syntax(move(what), context->parse_options())->root();
61
+ return config::parse_file_any_syntax(move(what), context->parse_options())->resolve(config_resolve_options(true, true))->root();
62
62
  }
63
63
 
64
64
  config_parse_options simple_includer::clear_for_include(config_parse_options const& options) {
@@ -304,7 +304,7 @@ namespace hocon {
304
304
  utf[i] = _input->get();
305
305
  }
306
306
  original += string(utf);
307
- short character;
307
+ unsigned short character;
308
308
  sscanf(utf, "%hx", &character);
309
309
  wchar_t buffer[] { static_cast<wchar_t>(character), '\0'};
310
310
  parsed += boost::nowide::narrow(buffer);
@@ -1,6 +1,7 @@
1
1
  #include <internal/values/config_delayed_merge_object.hpp>
2
2
  #include <internal/values/config_delayed_merge.hpp>
3
3
  #include <internal/values/simple_config_list.hpp>
4
+ #include <internal/resolve_result.hpp>
4
5
  #include <hocon/config_exception.hpp>
5
6
  #include <leatherman/locale/locale.hpp>
6
7
 
@@ -28,6 +29,15 @@ namespace hocon {
28
29
  }
29
30
  }
30
31
 
32
+ resolve_result<shared_value> config_delayed_merge_object::resolve_substitutions(resolve_context const& context,
33
+ resolve_source const& source) const {
34
+ return config_delayed_merge::resolve_substitutions(dynamic_pointer_cast<const replaceable_merge_stack>(shared_from_this()), _stack, context, source);
35
+ }
36
+
37
+ vector<shared_value> config_delayed_merge_object::unmerged_values() const {
38
+ return _stack;
39
+ }
40
+
31
41
  shared_value config_delayed_merge_object::make_replacement(resolve_context const &context, int skipping) const {
32
42
  return config_delayed_merge::make_replacement(move(context), _stack, move(skipping));
33
43
  }
@@ -164,7 +164,7 @@ namespace hocon {
164
164
 
165
165
  config_value::no_exceptions_modifier::no_exceptions_modifier(string prefix): _prefix(std::move(prefix)) {}
166
166
 
167
- shared_value config_value::no_exceptions_modifier::modify_child_may_throw(string key_or_null, shared_value v) {
167
+ shared_value config_value::no_exceptions_modifier::modify_child_may_throw(string const& key_or_null, shared_value v) {
168
168
  try {
169
169
  return modify_child(key_or_null, v);
170
170
  } catch (runtime_error& e) {
@@ -174,7 +174,7 @@ namespace hocon {
174
174
  }
175
175
  }
176
176
 
177
- shared_value config_value::no_exceptions_modifier::modify_child(string key, shared_value v) const {
177
+ shared_value config_value::no_exceptions_modifier::modify_child(string const& key, shared_value v) const {
178
178
  return v->relativized(_prefix);
179
179
  }
180
180
 
@@ -19,7 +19,7 @@ namespace hocon {
19
19
  struct simple_config_list::resolve_modifier : public modifier {
20
20
  resolve_modifier(resolve_context c, resolve_source s) : context(move(c)), source(move(s)) {}
21
21
 
22
- shared_value modify_child_may_throw(string key, shared_value v) override
22
+ shared_value modify_child_may_throw(string const& key, shared_value v) override
23
23
  {
24
24
  resolve_result<shared_value> result = context.resolve(v, source);
25
25
  context = result.context;
@@ -23,13 +23,13 @@ namespace hocon {
23
23
  resolve_modifier(resolve_context c, resolve_source s)
24
24
  : context(move(c)), source(move(s)), original_restrict(context.restrict_to_child()) {}
25
25
 
26
- shared_value modify_child_may_throw(string key, shared_value v) override
26
+ shared_value modify_child_may_throw(string const& key, shared_value v) override
27
27
  {
28
28
  if (context.is_restricted_to_child()) {
29
29
  if (key == *context.restrict_to_child().first()) {
30
30
  auto remainder = context.restrict_to_child().remainder();
31
31
 
32
- if (remainder.empty()) {
32
+ if (!remainder.empty()) {
33
33
  auto result = context.restrict(remainder).resolve(v, source);
34
34
  context = result.context.unrestricted().restrict(original_restrict);
35
35
  return result.value;
@@ -310,15 +310,15 @@ TEST_CASE("to string for parseables") {
310
310
  // TODO: are other APIs needed?
311
311
  }
312
312
 
313
- static void assert_comments(vector<string> comments, shared_config conf) {
313
+ static void assert_comments(vector<string> const& comments, shared_config conf) {
314
314
  REQUIRE(comments == conf->root()->origin()->comments());
315
315
  }
316
316
 
317
- static void assert_comments(vector<string> comments, shared_config conf, string path) {
317
+ static void assert_comments(vector<string> const& comments, shared_config conf, string const& path) {
318
318
  REQUIRE(comments == conf->get_value(path)->origin()->comments());
319
319
  }
320
320
 
321
- static void assert_comments(vector<string> comments, shared_config conf, string path, int index) {
321
+ static void assert_comments(vector<string> const& comments, shared_config conf, string const& path, int index) {
322
322
  // TODO:
323
323
  // auto v = conf->get_list(path)->get(index);
324
324
  // REQUIRE(comments == v->origin()->comments());
@@ -632,6 +632,11 @@ TEST_CASE("include file") {
632
632
  REQUIRE(1u == conf->get_int("fromJson1"));
633
633
  }
634
634
 
635
+ TEST_CASE("include file relative paths") {
636
+ auto conf = config::parse_string("root { include file(\"" + fixture_path("test01.conf") + "\") }");
637
+ REQUIRE("abcd" == conf->get_string("root.strings.abcdAgain"));
638
+ }
639
+
635
640
  TEST_CASE("include file with extension") {
636
641
  auto conf = config::parse_string("include file(\"" + fixture_path("test01.conf") + "\")");
637
642
 
@@ -91,7 +91,7 @@ TEST_CASE("parse values", "[doc-parser]") {
91
91
  }
92
92
  }
93
93
 
94
- void invalid_json_test(string original_text, string message) {
94
+ void invalid_json_test(string const& original_text, string const& message) {
95
95
  try {
96
96
  json_parse(original_text);
97
97
  } catch (parse_exception& ex) {
@@ -144,7 +144,7 @@ TEST_CASE("parse empty document", "[doc-parser]") {
144
144
  REQUIRE(dynamic_pointer_cast<const config_node_object>(node2->value()));
145
145
  }
146
146
 
147
- void parse_test_string(string original_text) {
147
+ void parse_test_string(string const& original_text) {
148
148
  auto node = conf_parse(original_text);
149
149
  REQUIRE(original_text == node->render());
150
150
  }
@@ -6,8 +6,8 @@
6
6
  using namespace hocon;
7
7
  using namespace std;
8
8
 
9
- void replace_test(string original_text, string final_text, string new_value,
10
- string replace_path, config_syntax syntax) {
9
+ void replace_test(string const& original_text, string const& final_text, string const& new_value,
10
+ string const& replace_path, config_syntax syntax) {
11
11
  auto config_doc = config_document_factory::parse_string(original_text,
12
12
  config_parse_options().set_syntax(syntax));
13
13
  REQUIRE(original_text == config_doc->render());
@@ -320,9 +320,7 @@ TEST_CASE("ignore hidden circular subst") {
320
320
  REQUIRE(42u == resolved->get_int("a"));
321
321
  }
322
322
 
323
- // TODO: the following tests dealing with delayed merge objects do not pass, see HC-78
324
-
325
- TEST_CASE("(pending HC-78) avoid delayed merge object problem 1", "[!shouldfail]") {
323
+ TEST_CASE("avoid delayed merge object problem 1") {
326
324
  auto problem = parse_object(R"(
327
325
  defaults {
328
326
  a = 1
@@ -346,9 +344,9 @@ TEST_CASE("(pending HC-78) avoid delayed merge object problem 1", "[!shouldfail]
346
344
  REQUIRE(3 == resolved->get_int("item2.b"));
347
345
  }
348
346
 
349
- TEST_CASE("(pending HC-78) avoid delayed merge object resolve problem 2", "[!shouldfail]") {
347
+ TEST_CASE("avoid delayed merge object resolve problem 2") {
350
348
  auto problem = parse_object(R"(
351
- defaults {
349
+ defaults {
352
350
  a = 1
353
351
  b = 2
354
352
  }
@@ -365,7 +363,7 @@ defaults {
365
363
  REQUIRE(dynamic_pointer_cast<const config_delayed_merge_object>(problem->attempt_peek_with_partial_resolve("item1")));
366
364
 
367
365
  auto resolved = resolve_without_fallbacks(problem);
368
- REQUIRE(parse_object("{ c : 43 }") == resolved->get_object("item1.b"));
366
+ REQUIRE(*parse_object("{ c : 43 }") == *resolved->get_object("item1.b"));
369
367
  REQUIRE(43 == resolved->get_int("item1.b.c"));
370
368
  REQUIRE(43 == resolved->get_int("item2.b.c"));
371
369
 
@@ -373,7 +371,7 @@ defaults {
373
371
 
374
372
  TEST_CASE("(pending HC-78) avoid delayed merge object resolve problem 3", "[!shouldfail]") {
375
373
  auto problem = parse_object(R"(
376
- item1.b.c = 100
374
+ item1.b.c = 100
377
375
  defaults {
378
376
  // we depend on item1.b.c
379
377
  a = ${item1.b.c}
@@ -392,15 +390,15 @@ item1.b.c = 100
392
390
  REQUIRE(dynamic_pointer_cast<const config_delayed_merge_object>(problem->attempt_peek_with_partial_resolve("item1")));
393
391
 
394
392
  auto resolved = resolve_without_fallbacks(problem);
395
- REQUIRE(parse_object("{ c : 43 }") == resolved->get_object("item1.b"));
393
+ REQUIRE(*parse_object("{ c : 43 }") == *resolved->get_object("item1.b"));
396
394
  REQUIRE(43 == resolved->get_int("item1.b.c"));
397
395
  REQUIRE(43 == resolved->get_int("item2.b.c"));
398
396
  REQUIRE(100 == resolved->get_int("defaults.a"));
399
397
  }
400
398
 
401
- TEST_CASE("(pending HC-78) avoid delayed merge object resolve problem 4", "[!shouldfail]") {
399
+ TEST_CASE("avoid delayed merge object resolve problem 4") {
402
400
  auto problem = parse_object(R"(
403
- defaults {
401
+ defaults {
404
402
  a = 1
405
403
  b = 2
406
404
  }
@@ -422,7 +420,7 @@ defaults {
422
420
 
423
421
  TEST_CASE("(pending HC-78) avoid delayed merge object resolve problem 5", "[!shouldfail]") {
424
422
  auto problem = parse_object(R"(
425
- defaults {
423
+ defaults {
426
424
  a = ${item1.b} // tricky cycle - we won't see ${defaults}
427
425
  // as we resolve this
428
426
  b = 2
@@ -441,12 +439,12 @@ defaults {
441
439
  auto resolved = resolve_without_fallbacks(problem);
442
440
  REQUIRE(2 == resolved->get_int("item1.b"));
443
441
  REQUIRE(2 == resolved->get_int("item2.b"));
444
- REQUIRE(7 == resolved->get_int("defauls.a"));
442
+ REQUIRE(7 == resolved->get_int("defaults.a"));
445
443
  }
446
444
 
447
445
  TEST_CASE("(pending HC-78) avoid delayed merge object resolve problem 6", "[!shouldfail]") {
448
446
  auto problem = parse_object(R"(
449
- z = 15
447
+ z = 15
450
448
  defaults-defaults-defaults {
451
449
  m = ${z}
452
450
  n.o.p = ${z}
@@ -480,12 +478,12 @@ z = 15
480
478
 
481
479
  REQUIRE(dynamic_pointer_cast<const config_delayed_merge_object>(problem->attempt_peek_with_partial_resolve("item1")));
482
480
 
483
- unwrapped_value expected(10);
481
+ unwrapped_value expected(101);
484
482
  bool test = expected == problem->to_config()->get_object("item1")->attempt_peek_with_partial_resolve("xyz")->unwrapped();
485
483
  REQUIRE(test);
486
484
 
487
485
  auto resolved = resolve_without_fallbacks(problem);
488
- REQUIRE(parse_object("{ c : 43 }") == resolved->get_object("item1.b"));
486
+ REQUIRE(*parse_object("{ c : 43 }") == *resolved->get_object("item1.b"));
489
487
  REQUIRE(43 == resolved->get_int("item1.b.c"));
490
488
  REQUIRE(43 == resolved->get_int("item2.b.c"));
491
489
  REQUIRE(15 == resolved->get_int("item1.n.o.p"));
@@ -493,7 +491,7 @@ z = 15
493
491
 
494
492
  TEST_CASE("Fetch known value from delayed merge object") {
495
493
  auto obj = parse_object(R"(
496
- defaults {
494
+ defaults {
497
495
  a = 1
498
496
  b = 2
499
497
  }
@@ -524,7 +522,7 @@ TEST_CASE("Fail to fetch from delayed merge object needs full resolve") {
524
522
  REQUIRE_THROWS(obj->to_config()->get_object("item1.b"));
525
523
  }
526
524
 
527
- TEST_CASE("(pending HC-78) resolve delayed merge object embrace", "[!shouldfail]") {
525
+ TEST_CASE("resolve delayed merge object embrace") {
528
526
  auto obj = parse_object(R"(
529
527
  defaults {
530
528
  a = 1
@@ -599,8 +597,7 @@ TEST_CASE("use relative to root when relativized") {
599
597
  REQUIRE("in parent" == resolved->get_string("a.bar"));
600
598
  }
601
599
 
602
- // TODO: this test legitimately fails: HC-73
603
- TEST_CASE("pending HC-73: complex resolve (pending)", "[!shouldfail]") {
600
+ TEST_CASE("complex resolve") {
604
601
  auto resolved = resolve_without_fallbacks(subst_complex_object());
605
602
 
606
603
  REQUIRE(57u == resolved->get_int("foo"));
@@ -610,7 +607,6 @@ TEST_CASE("pending HC-73: complex resolve (pending)", "[!shouldfail]") {
610
607
  REQUIRE(57u == resolved->get_int("objB.d"));
611
608
  }
612
609
 
613
-
614
610
  // TODO: env variable fallback legitimately fails: HC-74
615
611
  TEST_CASE("pending HC-74: fallback to env (pending)", "[!shouldfail]") {
616
612
  auto resolved = resolve(subst_env_var_object());
@@ -109,7 +109,7 @@ namespace hocon { namespace test_utils {
109
109
  return make_shared<config_node_simple_value>(bool_token(value));
110
110
  }
111
111
 
112
- shared_ptr<config_node_simple_value> string_node(string text) {
112
+ shared_ptr<config_node_simple_value> string_node(string const& text) {
113
113
  return make_shared<config_node_simple_value>(string_token(text));
114
114
  }
115
115
 
@@ -117,7 +117,7 @@ namespace hocon { namespace test_utils {
117
117
  return make_shared<config_node_simple_value>(null_token());
118
118
  }
119
119
 
120
- shared_ptr<config_node_simple_value> unquoted_text_node(string text) {
120
+ shared_ptr<config_node_simple_value> unquoted_text_node(string const& text) {
121
121
  return make_shared<config_node_simple_value>(unquoted_text_token(text));
122
122
  }
123
123
 
@@ -129,11 +129,11 @@ namespace hocon { namespace test_utils {
129
129
  return make_shared<config_node_single_token>(line_token(line_number));
130
130
  }
131
131
 
132
- shared_ptr<config_node_single_token> whitespace_node(string whitespace) {
132
+ shared_ptr<config_node_single_token> whitespace_node(string const& whitespace) {
133
133
  return make_shared<config_node_single_token>(whitespace_token(whitespace));
134
134
  }
135
135
 
136
- shared_ptr<config_node_comment> double_slash_comment_node(string text) {
136
+ shared_ptr<config_node_comment> double_slash_comment_node(string const& text) {
137
137
  return make_shared<config_node_comment>(double_slash_comment_token(text));
138
138
  }
139
139
 
@@ -161,7 +161,7 @@ namespace hocon { namespace test_utils {
161
161
  return make_shared<config_reference>(fake_origin(), make_shared<substitution_expression>(path::new_path(ref), optional));
162
162
  }
163
163
 
164
- shared_ptr<config_concatenation> subst_in_string(string ref, bool optional) {
164
+ shared_ptr<config_concatenation> subst_in_string(string const& ref, bool optional) {
165
165
  auto pieces = vector<shared_value> {string_value("start<"), subst(ref, optional), string_value(">end")};
166
166
  return make_shared<config_concatenation>(fake_origin(), pieces);
167
167
  }
@@ -446,7 +446,7 @@ namespace hocon { namespace test_utils {
446
446
  return new_tests;
447
447
  }
448
448
 
449
- std::string fixture_path(std::string fixture_name) {
449
+ std::string fixture_path(std::string const& fixture_name) {
450
450
  return string(TEST_FILE_DIR) + "/fixtures/" + fixture_name;
451
451
  }
452
452
  }} // namespace hocon::test_utils
@@ -75,21 +75,21 @@ namespace hocon { namespace test_utils {
75
75
 
76
76
  std::shared_ptr<config_node_simple_value> double_node(double number);
77
77
 
78
- std::shared_ptr<config_node_simple_value> string_node(std::string text);
78
+ std::shared_ptr<config_node_simple_value> string_node(std::string const& text);
79
79
 
80
80
  std::shared_ptr<config_node_simple_value> null_node();
81
81
 
82
82
  std::shared_ptr<config_node_simple_value> bool_node(bool value);
83
83
 
84
- std::shared_ptr<config_node_simple_value> unquoted_text_node(std::string text);
84
+ std::shared_ptr<config_node_simple_value> unquoted_text_node(std::string const& text);
85
85
 
86
86
  std::shared_ptr<config_node_simple_value> substitution_node(shared_token key, bool optional);
87
87
 
88
88
  std::shared_ptr<config_node_single_token> line_node(int line_number);
89
89
 
90
- std::shared_ptr<config_node_single_token> whitespace_node(std::string whitespace);
90
+ std::shared_ptr<config_node_single_token> whitespace_node(std::string const& whitespace);
91
91
 
92
- std::shared_ptr<config_node_comment> double_slash_comment_node(std::string text);
92
+ std::shared_ptr<config_node_comment> double_slash_comment_node(std::string const& text);
93
93
 
94
94
  // it's important that these do NOT use the public API to create the
95
95
  // instances, because we may be testing that the public API returns the
@@ -108,7 +108,7 @@ namespace hocon { namespace test_utils {
108
108
 
109
109
  std::shared_ptr<config_reference> subst(std::string ref, bool optional = false);
110
110
 
111
- std::shared_ptr<config_concatenation> subst_in_string(std::string ref, bool optional = false);
111
+ std::shared_ptr<config_concatenation> subst_in_string(std::string const& ref, bool optional = false);
112
112
 
113
113
  /** Paths */
114
114
  path test_path(std::initializer_list<std::string> path_elements);
@@ -118,6 +118,7 @@ namespace hocon { namespace test_utils {
118
118
  shared_config parse_config(std::string);
119
119
 
120
120
  struct parse_test {
121
+ // cppcheck-suppress passedByValue
121
122
  parse_test(std::string t, bool lbe = false, bool wm = false)
122
123
  : test(move(t)), lift_behavior_unexpected(lbe), whitespace_matters(wm) { }
123
124
 
@@ -135,5 +136,5 @@ namespace hocon { namespace test_utils {
135
136
 
136
137
  std::vector<parse_test> whitespace_variations(std::vector<parse_test> const& tests, bool valid_in_lift);
137
138
 
138
- std::string fixture_path(std::string fixture_name);
139
+ std::string fixture_path(std::string const& fixture_name);
139
140
  }} // namespace hocon::test_utils
@@ -17,7 +17,7 @@ token_list tokenize_as_list(string const& source) {
17
17
  return tokens;
18
18
  }
19
19
 
20
- void tokenizer_test(string source, token_list expected) {
20
+ void tokenizer_test(string const& source, token_list expected) {
21
21
  token_list result = tokenize_as_list(source);
22
22
  for (size_t i = 0; i < expected.size(); i++) {
23
23
  if (!(*expected[i] == *result[i])) {
@@ -6,7 +6,7 @@
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
- "Project-Id-Version: cpp-hocon 0.1.2\n"
9
+ "Project-Id-Version: cpp-hocon 0.1.7\n"
10
10
  "Report-Msgid-Bugs-To: docs@puppet.com\n"
11
11
  "POT-Creation-Date: \n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
@@ -1,5 +1,5 @@
1
1
  cmake_minimum_required(VERSION 3.2.2)
2
- project(FACTER VERSION 3.11.2)
2
+ project(FACTER VERSION 3.11.3)
3
3
 
4
4
  # Set this early, so it's available. AIX gets weird, man.
5
5
  if("${CMAKE_SYSTEM_NAME}" MATCHES "AIX")
@@ -227,9 +227,9 @@ module Facter
227
227
  'os.family' => 'RedHat',
228
228
  'os.hardware' => os_hardware,
229
229
  'os.name' => os_name,
230
- 'os.release.full' => /#{os_version}\.\d+(\.\d+)?/,
230
+ 'os.release.full' => /#{os_version}(\.\d+)?(\.\d+)?/,
231
231
  'os.release.major' => os_version,
232
- 'os.release.minor' => /\d+/,
232
+ 'os.release.minor' => /(\d+)?/,
233
233
  'processors.count' => /[1-9]/,
234
234
  'processors.physicalcount' => /[1-9]/,
235
235
  'processors.isa' => os_hardware,
@@ -38,7 +38,7 @@ PROJECT_NAME = facter
38
38
  # could be handy for archiving the generated documentation or if some version
39
39
  # control system is used.
40
40
 
41
- PROJECT_NUMBER = 3.11.2
41
+ PROJECT_NUMBER = 3.11.3
42
42
 
43
43
  # Using the PROJECT_BRIEF tag one can provide an optional one line description
44
44
  # for a project that appears at the top of each page and should give viewer a
@@ -285,8 +285,10 @@ namespace facter { namespace facts { namespace linux {
285
285
  })) {
286
286
  if (boost::ends_with(contents, "(Rawhide)")) {
287
287
  value = "Rawhide";
288
- } else {
288
+ } else if (contents.find("release") != string::npos) {
289
289
  re_search(contents, boost::regex("release (\\d[\\d.]*)"), &value);
290
+ } else {
291
+ re_search(contents, boost::regex("Amazon Linux (\\d+)"), &value);
290
292
  }
291
293
  }
292
294
  }
@@ -30,44 +30,36 @@ namespace facter { namespace util { namespace solaris {
30
30
  return lookup(entry.first, -1, entry.second);
31
31
  }
32
32
 
33
+ // I believe precedence to be sufficiently obvious in this function,
34
+ // but this is a worthwhile diagnostic in most cases. We disable it
35
+ // here, instead of globally.
36
+ #pragma GCC diagnostic push
37
+ #pragma GCC diagnostic ignored "-Wparentheses"
33
38
  vector<k_stat_entry> k_stat::lookup(string const& module, int instance, string const& name)
34
39
  {
35
- kstat_t* kp = kstat_lookup(ctrl, const_cast<char*>(module.c_str()), instance, name.empty() ? nullptr : const_cast<char *>(name.c_str()));
36
- if (kp == nullptr) {
37
- throw kstat_exception(_("kstat_lookup of module {1}/{2}/{3} failed: {4} ({5})",
38
- module,
39
- to_string(instance),
40
- name,
41
- string(strerror(errno)),
42
- to_string(errno)));
43
- }
44
-
40
+ kstat_t* kp = static_cast<kstat_ctl_t*>(ctrl)->kc_chain;
45
41
  vector<k_stat_entry> arr;
46
- while (kp) {
47
- if (kstat_read(ctrl, kp, 0) == -1) {
48
- throw kstat_exception(_("kstat_read failed: {1} ({2})",
49
- string(strerror(errno)),
50
- to_string(errno)));
51
- }
52
-
53
- bool insert = true;
54
- if (!module.empty() && module != kp->ks_module) {
55
- insert = false;
42
+ do {
43
+ if (!module.empty() && module != kp->ks_module ||
44
+ !name.empty() && name != kp->ks_name ||
45
+ instance != -1 && instance != kp->ks_instance) {
46
+ continue;
56
47
  }
57
- if (instance != -1 && instance != kp->ks_instance) {
58
- insert = false;
48
+ while (kstat_read(ctrl, kp, 0) == -1) {
49
+ if (errno == EAGAIN) {
50
+ continue;
51
+ } else {
52
+ throw kstat_exception(_("kstat_read failed: {1} ({2})",
53
+ string(strerror(errno)),
54
+ to_string(errno)));
55
+ }
59
56
  }
60
- if (!name.empty() && name != kp->ks_name) {
61
- insert = false;
62
- }
63
- if (insert) {
64
- arr.push_back(k_stat_entry(kp));
65
- }
66
- kp = kp->ks_next;
67
- }
57
+ arr.push_back(k_stat_entry(kp));
58
+ } while (kp = kp->ks_next);
68
59
 
69
60
  return arr;
70
61
  }
62
+ #pragma GCC diagnostic pop
71
63
 
72
64
  k_stat_entry::k_stat_entry(kstat_t* kp) :
73
65
  k_stat(kp)
@@ -6,7 +6,7 @@
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
- "Project-Id-Version: FACTER 3.11.2\n"
9
+ "Project-Id-Version: FACTER 3.11.3\n"
10
10
  "Report-Msgid-Bugs-To: docs@puppet.com\n"
11
11
  "POT-Creation-Date: \n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
@@ -1497,10 +1497,6 @@ msgstr ""
1497
1497
  msgid "kstat_open failed"
1498
1498
  msgstr ""
1499
1499
 
1500
- #: lib/src/util/solaris/k_stat.cc
1501
- msgid "kstat_lookup of module {1}/{2}/{3} failed: {4} ({5})"
1502
- msgstr ""
1503
-
1504
1500
  #: lib/src/util/solaris/k_stat.cc
1505
1501
  msgid "kstat_read failed: {1} ({2})"
1506
1502
  msgstr ""
@@ -1,5 +1,5 @@
1
1
  cmake_minimum_required(VERSION 3.2.2)
2
- project(leatherman VERSION 1.4.1)
2
+ project(leatherman VERSION 1.4.2)
3
3
 
4
4
  if (WIN32)
5
5
  link_libraries("-Wl,--nxcompat -Wl,--dynamicbase")
@@ -350,6 +350,13 @@ namespace leatherman { namespace curl {
350
350
  */
351
351
  void set_client_cert(std::string const& client_cert, std::string const& client_key);
352
352
 
353
+ /**
354
+ * Set proxy information.
355
+ * @param proxy String with following components [scheme]://[hostname]:[port].
356
+ * (see more: https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html)
357
+ */
358
+ void set_proxy(std::string const& proxy);
359
+
353
360
  /**
354
361
  * Set and limit what protocols curl will support
355
362
  * @param client_protocols bitmask of CURLPROTO_*
@@ -387,6 +394,7 @@ namespace leatherman { namespace curl {
387
394
  std::string _ca_cert;
388
395
  std::string _client_cert;
389
396
  std::string _client_key;
397
+ std::string _proxy;
390
398
  long _client_protocols = CURLPROTO_ALL;
391
399
 
392
400
  response perform(http_method method, request const& req);
@@ -407,6 +415,7 @@ namespace leatherman { namespace curl {
407
415
  LEATHERMAN_CURL_NO_EXPORT void set_client_info(context &ctx);
408
416
  LEATHERMAN_CURL_NO_EXPORT void set_ca_info(context& ctx);
409
417
  LEATHERMAN_CURL_NO_EXPORT void set_client_protocols(context& ctx);
418
+ LEATHERMAN_CURL_NO_EXPORT void set_proxy_info(context& ctx);
410
419
 
411
420
  template <typename ParamType>
412
421
  LEATHERMAN_CURL_NO_EXPORT void curl_easy_setopt_maybe(
@@ -231,6 +231,7 @@ namespace leatherman { namespace curl {
231
231
  set_ca_info(ctx);
232
232
  set_client_info(ctx);
233
233
  set_client_protocols(ctx);
234
+ set_proxy_info(ctx);
234
235
 
235
236
  // Perform the request
236
237
  auto result = curl_easy_perform(_handle);
@@ -275,6 +276,7 @@ namespace leatherman { namespace curl {
275
276
  set_ca_info(ctx);
276
277
  set_client_info(ctx);
277
278
  set_client_protocols(ctx);
279
+ set_proxy_info(ctx);
278
280
 
279
281
  // More detailed error messages
280
282
  curl_easy_setopt_maybe(ctx, CURLOPT_ERRORBUFFER, errbuf);
@@ -305,6 +307,11 @@ namespace leatherman { namespace curl {
305
307
  _ca_cert = cert_file;
306
308
  }
307
309
 
310
+ void client::set_proxy(string const& proxy)
311
+ {
312
+ _proxy = proxy;
313
+ }
314
+
308
315
  void client::set_client_cert(string const& client_cert, string const& client_key)
309
316
  {
310
317
  _client_cert = client_cert;
@@ -430,6 +437,14 @@ namespace leatherman { namespace curl {
430
437
  curl_easy_setopt_maybe(ctx, CURLOPT_SSLKEY, _client_key.c_str());
431
438
  }
432
439
 
440
+ void client::set_proxy_info(context &ctx) {
441
+ if (_proxy == "") {
442
+ return;
443
+ }
444
+
445
+ curl_easy_setopt_maybe(ctx, CURLOPT_PROXY, _proxy.c_str());
446
+ }
447
+
433
448
  void client::set_client_protocols(context& ctx) {
434
449
  curl_easy_setopt_maybe(ctx, CURLOPT_PROTOCOLS, _client_protocols);
435
450
  }
@@ -236,6 +236,21 @@ TEST_CASE("curl::client CA bundle and SSL setup") {
236
236
  REQUIRE(test_impl->cacert == "cacert");
237
237
  }
238
238
 
239
+ SECTION("Proxy should be unspecified by default") {
240
+ auto resp = test_client.get(test_request);
241
+ CURL* const& handle = test_client.get_handle();
242
+ auto test_impl = reinterpret_cast<curl_impl* const>(handle);
243
+ REQUIRE(test_impl->proxy == "");
244
+ }
245
+
246
+ SECTION("cURL should receive the proxy specified in the request") {
247
+ test_client.set_proxy("proxy");
248
+ auto resp = test_client.get(test_request);
249
+ CURL* const& handle = test_client.get_handle();
250
+ auto test_impl = reinterpret_cast<curl_impl* const>(handle);
251
+ REQUIRE(test_impl->proxy == "proxy");
252
+ }
253
+
239
254
  SECTION("Client cert name should be unspecified by default") {
240
255
  auto resp = test_client.get(test_request);
241
256
  CURL* const& handle = test_client.get_handle();
@@ -217,6 +217,14 @@ CURLcode curl_easy_setopt(CURL *handle, CURLoption option, ...)
217
217
  }
218
218
  h->client_cert = va_arg(vl, char*);
219
219
  break;
220
+ case CURLOPT_PROXY:
221
+ // Set the mock curl proxy to that which was passed in the request.
222
+ if (h->test_failure_mode == curl_impl::error_mode::proxy_error) {
223
+ va_end(vl);
224
+ return CURLE_OUT_OF_MEMORY;
225
+ }
226
+ h->proxy = va_arg(vl, char*);
227
+ break;
220
228
  case CURLOPT_SSLKEY:
221
229
  // Set the mock curl private keyfile name to that which was passed in the request.
222
230
  if (h->test_failure_mode == curl_impl::error_mode::ssl_key_error) {
@@ -40,6 +40,7 @@ struct curl_impl
40
40
  ssl_cert_error,
41
41
  ssl_key_error,
42
42
  protocol_error,
43
+ proxy_error
43
44
  };
44
45
 
45
46
  error_mode test_failure_mode = error_mode::success;
@@ -56,7 +57,7 @@ struct curl_impl
56
57
  std::function<size_t(char*, size_t, size_t, void*)> read_function;
57
58
  void* read_data; // Where to read the request body from
58
59
 
59
- std::string request_url, cookie, cacert, client_cert, client_key;
60
+ std::string request_url, cookie, cacert, client_cert, client_key, proxy;
60
61
  long protocols;
61
62
  long connect_timeout;
62
63
  http_method method = http_method::get;
@@ -6,7 +6,7 @@
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
- "Project-Id-Version: leatherman 1.4.0\n"
9
+ "Project-Id-Version: leatherman 1.5.0\n"
10
10
  "Report-Msgid-Bugs-To: docs@puppet.com\n"
11
11
  "POT-Creation-Date: \n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: facter
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.11.2.cfacter.20180612
4
+ version: 3.11.3.cfacter.20180716
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-06-12 00:00:00.000000000 Z
12
+ date: 2018-07-16 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email: info@puppet.com