https://mooseframework.inl.gov
YAMLFormatter.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "YAMLFormatter.h"
11 
12 // MOOSE includes
13 #include "MooseEnum.h"
14 #include "MultiMooseEnum.h"
15 #include "Parser.h"
16 
17 #include "libmesh/vector_value.h"
18 #include "libmesh/point.h"
19 
20 // C++ includes
21 #include <sstream>
22 #include <vector>
23 
24 YAMLFormatter::YAMLFormatter(bool dump_mode) : SyntaxTree(true), _dump_mode(dump_mode) {}
25 
26 std::string
28 {
29  // important: start and end yaml data delimiters used by python
30  return "**START YAML DATA**\n";
31 }
32 
33 std::string
35 {
36  return "**END YAML DATA**\n";
37 }
38 
39 std::string
40 YAMLFormatter::printParams(const std::string & prefix,
41  const std::string & /*fully_qualified_name*/,
42  InputParameters & params,
43  short depth,
44  const std::string & search_string,
45  bool & found)
46 {
47  std::ostringstream oss;
48  std::string indent(depth * 2, ' ');
49 
50  for (auto & iter : params)
51  {
52  std::string name = iter.first;
53  // First make sure we want to see this parameter, also block active and type
54  if (params.isPrivate(iter.first) || name == "active" ||
55  (search_string != "" && search_string != iter.first) || haveSeenIt(prefix, iter.first))
56  continue;
57 
58  found = true;
59 
60  // Mark it as "seen"
61  seenIt(prefix, iter.first);
62 
63  // Block params may be required and will have a doc string
64  std::string required = params.isParamRequired(iter.first) ? "Yes" : "No";
65 
66  oss << indent << " - name: " << name << "\n";
67  oss << indent << " required: " << required << "\n";
68  oss << indent << " default: !!str ";
69 
70  // Only output default if it has one
71  if (params.isParamValid(iter.first))
72  {
73  // prints the value, which is the default value when dumping the tree
74  // because it hasn't been changed
75 
76  // Output stream, performing special operations for writing objects such as Points and
77  // RealVectorValues
78  std::ostringstream toss;
79  buildOutputString(toss, iter);
80 
81  // remove additional '\n' possibly generated in output (breaks YAML parsing)
82  std::string tmp_str = toss.str();
83  for (auto & ch : tmp_str)
84  if (ch == '\n')
85  ch = ' ';
86  if (tmp_str == ",")
87  oss << "\"" << tmp_str << "\"";
88  else
89  oss << tmp_str;
90  }
91  else if (params.hasDefaultCoupledValue(iter.first))
92  oss << params.defaultCoupledValue(iter.first);
93 
94  std::string doc = params.getDocString(iter.first);
95  MooseUtils::escape(doc);
96  // Print the type
97  oss << "\n"
98  << indent << " cpp_type: " << params.type(iter.first) << "\n"
99  << indent << " group_name: ";
100  std::string group_name = params.getGroupName(iter.first);
101  if (!group_name.empty())
102  oss << "'" << group_name << "'";
103  oss << "\n";
104 
105  oss << indent << " doc_unit: ";
106  std::string doc_unit = params.getDocUnit(iter.first);
107  if (!doc_unit.empty())
108  oss << "'" << doc_unit << "'";
109  oss << "\n";
110 
111  if (params.have_parameter<MooseEnum>(name))
112  addEnumOptionsAndDocs(oss, params.get<MooseEnum>(name), indent);
113  if (params.have_parameter<MultiMooseEnum>(name))
114  addEnumOptionsAndDocs(oss, params.get<MultiMooseEnum>(name), indent);
115  if (params.have_parameter<ExecFlagEnum>(name))
116  addEnumOptionsAndDocs(oss, params.get<ExecFlagEnum>(name), indent);
117  if (params.have_parameter<std::vector<MooseEnum>>(name))
118  addEnumOptionsAndDocs(oss, params.get<std::vector<MooseEnum>>(name)[0], indent);
119 
120  oss << indent << " description: |\n " << indent << doc << std::endl;
121  }
122 
123  return oss.str();
124 }
125 
126 template <typename T>
127 void
128 YAMLFormatter::addEnumOptionsAndDocs(std::ostringstream & oss,
129  T & param,
130  const std::string & indent)
131 {
132  oss << indent << " options: " << param.getRawNames() << '\n';
133  const auto & docs = param.getItemDocumentation();
134  if (!docs.empty())
135  {
136  oss << indent << " option_docs:\n";
137  for (const auto & doc : docs)
138  {
139  oss << indent << " - name: " << doc.first.name() << "\n";
140  oss << indent << " description: |\n";
141  oss << indent << " " << doc.second << "\n";
142  }
143  }
144 }
145 
146 std::string
147 YAMLFormatter::preTraverse(short depth) const
148 {
149  std::string indent(depth * 2, ' ');
150 
151  return indent + " subblocks:\n";
152 }
153 
154 std::string
155 YAMLFormatter::printBlockOpen(const std::string & name, short depth, const std::string & doc)
156 {
157  std::ostringstream oss;
158  std::string indent(depth * 2, ' ');
159 
160  std::string docEscaped = doc;
161  MooseUtils::escape(docEscaped);
162 
163  oss << indent << "- name: " << name << "\n";
164  oss << indent << " description: |\n" << indent << " " << docEscaped << "\n";
165  oss << indent << " parameters:\n";
166 
167  return oss.str();
168 }
169 
170 std::string
171 YAMLFormatter::printBlockClose(const std::string & /*name*/, short /*depth*/) const
172 {
173  return std::string();
174 }
175 
176 void
178  std::ostringstream & output,
179  const std::iterator_traits<InputParameters::iterator>::value_type & p)
180 {
182 
183  // Account for Point
184  InputParameters::Parameter<Point> * ptr0 = dynamic_cast<InputParameters::Parameter<Point> *>(val);
185 
186  // Account for RealVectorValues
187  InputParameters::Parameter<RealVectorValue> * ptr1 =
188  dynamic_cast<InputParameters::Parameter<RealVectorValue> *>(val);
189 
190  // Output the Point components
191  if (ptr0)
192  output << ptr0->get().operator()(0) << " " << ptr0->get().operator()(1) << " "
193  << ptr0->get().operator()(2);
194 
195  // Output the RealVectorValue components
196  else if (ptr1)
197  output << ptr1->get().operator()(0) << " " << ptr1->get().operator()(1) << " "
198  << ptr1->get().operator()(2);
199 
200  // General case, call the print operator
201  else
202  p.second->print(output);
203 }
std::string name(const ElemQuality q)
std::string indent(unsigned int spaces)
Create empty string for indenting.
Definition: ConsoleUtils.C:41
virtual std::string postscript() const override
This method is called once at the end of the tree traversal and can be used to add any necessary trai...
Definition: YAMLFormatter.C:34
A MultiMooseEnum object to hold "execute_on" flags.
Definition: ExecFlagEnum.h:21
void buildOutputString(std::ostringstream &output, const std::iterator_traits< InputParameters::iterator >::value_type &p)
Method for building an output string that accounts for specific types (e.g., Point) ...
T * get(const std::unique_ptr< T > &u)
The MooseUtils::get() specializations are used to support making forwards-compatible code changes fro...
Definition: MooseUtils.h:1155
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
virtual std::string printBlockClose(const std::string &name, short depth) const override
This method is called at the end of of each Node in the tree.
void addEnumOptionsAndDocs(std::ostringstream &oss, T &param, const std::string &indent)
virtual std::string printBlockOpen(const std::string &name, short depth, const std::string &doc) override
This method is called at the beginning of each Node in the tree.
YAMLFormatter(bool dump_mode)
Definition: YAMLFormatter.C:24
virtual std::string preamble() const override
This method is called once at the beginning of the tree traversal and can be used to build up header ...
Definition: YAMLFormatter.C:27
virtual std::string printParams(const std::string &prefix, const std::string &fully_qualified_name, InputParameters &params, short depth, const std::string &search_string, bool &found) override
This function is called for each InputParameters object stored at a particular node.
Definition: YAMLFormatter.C:40
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33
virtual std::string preTraverse(short depth) const override
This method is called once at each node in the syntax tree before traversing child nodes...
bool haveSeenIt(const std::string &prefix, const std::string &item) const
Definition: SyntaxTree.C:63
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...
void seenIt(const std::string &prefix, const std::string &item)
Definition: SyntaxTree.C:57
void escape(std::string &str)
This function will escape all of the standard C++ escape characters so that they can be printed...
Definition: MooseUtils.C:203