redsnow 0.2.1 → 0.3.0

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2 -0
  3. data/ext/snowcrash/bin/snowcrash +0 -0
  4. data/ext/snowcrash/snowcrash.xcworkspace/contents.xcworkspacedata +10 -0
  5. data/ext/snowcrash/src/ActionParser.h +35 -33
  6. data/ext/snowcrash/src/AssetParser.h +17 -17
  7. data/ext/snowcrash/src/Blueprint.h +101 -66
  8. data/ext/snowcrash/src/BlueprintParser.h +219 -10
  9. data/ext/snowcrash/src/BlueprintSourcemap.h +1 -1
  10. data/ext/snowcrash/src/BlueprintUtility.h +14 -14
  11. data/ext/snowcrash/src/CBlueprint.cc +29 -10
  12. data/ext/snowcrash/src/CBlueprint.h +19 -3
  13. data/ext/snowcrash/src/CBlueprintSourcemap.cc +20 -10
  14. data/ext/snowcrash/src/CBlueprintSourcemap.h +12 -3
  15. data/ext/snowcrash/src/CodeBlockUtility.h +25 -25
  16. data/ext/snowcrash/src/HTTP.cc +3 -0
  17. data/ext/snowcrash/src/HTTP.h +9 -6
  18. data/ext/snowcrash/src/HeadersParser.h +34 -14
  19. data/ext/snowcrash/src/ParameterParser.h +21 -21
  20. data/ext/snowcrash/src/ParametersParser.h +6 -5
  21. data/ext/snowcrash/src/PayloadParser.h +174 -129
  22. data/ext/snowcrash/src/RegexMatch.h +3 -3
  23. data/ext/snowcrash/src/ResourceGroupParser.h +5 -4
  24. data/ext/snowcrash/src/ResourceParser.h +30 -26
  25. data/ext/snowcrash/src/Section.cc +6 -6
  26. data/ext/snowcrash/src/Section.h +2 -2
  27. data/ext/snowcrash/src/SectionParser.h +41 -41
  28. data/ext/snowcrash/src/SectionParserData.h +10 -10
  29. data/ext/snowcrash/src/SectionProcessor.h +70 -30
  30. data/ext/snowcrash/src/Serialize.h +3 -3
  31. data/ext/snowcrash/src/SerializeJSON.cc +124 -96
  32. data/ext/snowcrash/src/SerializeJSON.h +1 -1
  33. data/ext/snowcrash/src/SerializeYAML.cc +71 -53
  34. data/ext/snowcrash/src/SerializeYAML.h +1 -1
  35. data/ext/snowcrash/src/Signature.cc +2 -2
  36. data/ext/snowcrash/src/Signature.h +1 -1
  37. data/ext/snowcrash/src/SourceAnnotation.h +23 -23
  38. data/ext/snowcrash/src/StringUtility.h +71 -9
  39. data/ext/snowcrash/src/SymbolTable.h +17 -17
  40. data/ext/snowcrash/src/UriTemplateParser.cc +5 -5
  41. data/ext/snowcrash/src/UriTemplateParser.h +9 -9
  42. data/ext/snowcrash/src/ValuesParser.h +2 -2
  43. data/ext/snowcrash/src/Version.h +1 -1
  44. data/ext/snowcrash/src/csnowcrash.cc +10 -8
  45. data/ext/snowcrash/src/snowcrash.cc +9 -9
  46. data/ext/snowcrash/src/snowcrash.h +6 -8
  47. data/ext/snowcrash/src/snowcrash/snowcrash.cc +14 -14
  48. data/ext/snowcrash/src/win/RegexMatch.cc +7 -7
  49. data/ext/snowcrash/tools/gyp/pylib/gyp/__init__.pyc +0 -0
  50. data/ext/snowcrash/tools/gyp/pylib/gyp/common.pyc +0 -0
  51. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.pyc +0 -0
  52. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/make.pyc +0 -0
  53. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/xcode.pyc +0 -0
  54. data/ext/snowcrash/tools/gyp/pylib/gyp/input.pyc +0 -0
  55. data/ext/snowcrash/tools/gyp/pylib/gyp/xcode_emulation.pyc +0 -0
  56. data/ext/snowcrash/tools/gyp/pylib/gyp/xcodeproj_file.pyc +0 -0
  57. data/ext/snowcrash/tools/homebrew/snowcrash.rb +1 -1
  58. data/lib/redsnow/binding.rb +8 -2
  59. data/lib/redsnow/blueprint.rb +4 -3
  60. data/lib/redsnow/sourcemap.rb +6 -4
  61. data/lib/redsnow/version.rb +1 -1
  62. metadata +4 -17
@@ -33,18 +33,18 @@ namespace snowcrash {
33
33
  s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(isSpace))));
34
34
  return s;
35
35
  }
36
-
36
+
37
37
  // Trim string from end
38
38
  inline std::string& TrimStringEnd(std::string &s) {
39
39
  s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(isSpace))).base(), s.end());
40
40
  return s;
41
41
  }
42
-
42
+
43
43
  // Trim both ends of string
44
44
  inline std::string& TrimString(std::string &s) {
45
45
  return TrimStringStart(TrimStringEnd(s));
46
46
  }
47
-
47
+
48
48
  // Split string by delim
49
49
  inline std::vector<std::string>& Split(const std::string& s, char delim, std::vector<std::string>& elems) {
50
50
  std::stringstream ss(s);
@@ -54,14 +54,14 @@ namespace snowcrash {
54
54
  }
55
55
  return elems;
56
56
  }
57
-
58
- // Split string by delim
57
+
58
+ // Split string by delim
59
59
  inline std::vector<std::string> Split(const std::string& s, char delim) {
60
60
  std::vector<std::string> elems;
61
61
  Split(s, delim, elems);
62
62
  return elems;
63
63
  }
64
-
64
+
65
65
  // Split string on the first occurrence of delim
66
66
  inline std::vector<std::string> SplitOnFirst(const std::string& s, char delim) {
67
67
  std::string::size_type pos = s.find(delim);
@@ -75,7 +75,7 @@ namespace snowcrash {
75
75
  }
76
76
  return elems;
77
77
  }
78
-
78
+
79
79
  // Make sure last two characters are newlines
80
80
  inline std::string& TwoNewLines(std::string& s) {
81
81
 
@@ -108,10 +108,10 @@ namespace snowcrash {
108
108
  }
109
109
  return target;
110
110
  }
111
-
111
+
112
112
  /**
113
113
  * \brief Extract the first line from a string.
114
- *
114
+ *
115
115
  * \param s Subject of the extraction
116
116
  * \param r Remaining content aftert the extraction
117
117
  * \return First line from the subject string
@@ -124,6 +124,68 @@ namespace snowcrash {
124
124
  r = elem.back();
125
125
  return elem.front();
126
126
  }
127
+
128
+
129
+ /**
130
+ * \brief compare equality - allow compare diferent types
131
+ *
132
+ * \return true if args era equal
133
+ */
134
+ struct IsEqual {
135
+ template<typename T1, typename T2>
136
+ bool operator()(const T1& a1, const T2& a2) const {
137
+ return a1 == a2;
138
+ }
139
+ };
140
+
141
+ /**
142
+ * \brief compare equality - character are compare case insensitive
143
+ *
144
+ * \return true if args era equal
145
+ */
146
+ struct IsIEqual {
147
+ template<typename T1, typename T2>
148
+ bool operator()(const T1& a1, const T2& a2) const {
149
+ return std::tolower(a1) == std::tolower(a2);
150
+ }
151
+ };
152
+
153
+ /**
154
+ * \brief compare containers equality
155
+ *
156
+ * \requirements
157
+ * - both containers must support methods ::length(), ::begin(), ::end()
158
+ * - both containers must be iterable
159
+ * - both containers must contain comparable types
160
+ *
161
+ * \param arg1, arg2 - containers to compare
162
+ * \param predicate - testing equality
163
+ *
164
+ * \return true if containers contains same content
165
+ */
166
+
167
+ template <typename T1, typename T2, typename Predicate>
168
+ inline bool MatchContainers(const T1& arg1, const T2& arg2, const Predicate& predicate) {
169
+ if (arg1.length() != arg2.length()) {
170
+ return false;
171
+ }
172
+ return std::equal(arg1.begin(), arg1.end(), arg2.begin(), predicate);
173
+ }
174
+
175
+ template <typename T>
176
+ struct Equal : std::binary_function<T, T, bool> {
177
+ bool operator()(const T& left, const T& right) const {
178
+ return MatchContainers(left, right, IsEqual());
179
+ }
180
+ };
181
+
182
+ template <typename T>
183
+ struct IEqual : std::binary_function<T, T, bool> {
184
+ bool operator()(const T& left, const T& right) const {
185
+ return MatchContainers(left, right, IsIEqual());
186
+ }
187
+ };
188
+
127
189
  }
128
190
 
129
191
  #endif
@@ -26,42 +26,42 @@
26
26
  #define SYMBOL_IDENTIFIER "([^][()]+)"
27
27
 
28
28
  namespace snowcrashconst {
29
-
29
+
30
30
  /** Symbol reference matching regex */
31
31
  const char* const SymbolReferenceRegex("^[[:blank:]]*\\[" SYMBOL_IDENTIFIER "]\\[][[:blank:]]*$");
32
32
  }
33
33
 
34
34
  namespace snowcrash {
35
-
35
+
36
36
  // Resource Object Symbol
37
- typedef std::pair<SymbolName, ResourceModel> ResourceModelSymbol;
37
+ typedef std::pair<Identifier, ResourceModel> ResourceModelSymbol;
38
38
 
39
39
  // Resource Object Symbol source map
40
- typedef std::pair<SymbolName, SourceMap<ResourceModel> > ResourceModelSymbolSourceMap;
40
+ typedef std::pair<Identifier, SourceMap<ResourceModel> > ResourceModelSymbolSourceMap;
41
41
 
42
42
  // Resource Object Symbol Table
43
- typedef std::map<SymbolName, ResourceModel> ResourceModelSymbolTable;
44
-
45
- // Reesource Object Symbol Table source map
46
- typedef std::map<SymbolName, SourceMap<ResourceModel> > ResourceModelSymbolSourceMapTable;
43
+ typedef std::map<Identifier, ResourceModel> ResourceModelSymbolTable;
44
+
45
+ // Resource Object Symbol Table source map
46
+ typedef std::map<Identifier, SourceMap<ResourceModel> > ResourceModelSymbolSourceMapTable;
47
47
 
48
48
  struct SymbolTable {
49
-
49
+
50
50
  // Resource Object Symbol Table
51
51
  ResourceModelSymbolTable resourceModels;
52
52
  };
53
-
53
+
54
54
  struct SymbolSourceMapTable {
55
55
 
56
56
  // Resource Object Symbol Table source map
57
57
  ResourceModelSymbolSourceMapTable resourceModels;
58
58
  };
59
-
59
+
60
60
  // Checks whether given source data represents reference to a symbol returning true if so,
61
61
  // false otherwise. If source data is represent reference referred symbol name is filled in.
62
62
  inline bool GetSymbolReference(const mdp::ByteBuffer& sourceData,
63
- SymbolName& referredSymbol) {
64
-
63
+ Identifier& referredSymbol) {
64
+
65
65
  CaptureGroups captureGroups;
66
66
 
67
67
  if (RegexCapture(sourceData, snowcrashconst::SymbolReferenceRegex, captureGroups, 3)) {
@@ -72,7 +72,7 @@ namespace snowcrash {
72
72
 
73
73
  return false;
74
74
  }
75
-
75
+
76
76
  #ifdef DEBUG
77
77
  // Prints markdown block recursively to stdout
78
78
  inline void PrintSymbolTable(const SymbolTable& symbolTable) {
@@ -81,14 +81,14 @@ namespace snowcrash {
81
81
  for (ResourceModelSymbolTable::const_iterator it = symbolTable.resourceModels.begin();
82
82
  it != symbolTable.resourceModels.end();
83
83
  ++it) {
84
-
84
+
85
85
  std::cout << "- " << it->first << " - body: '" << EscapeNewlines(it->second.body) << "'\n";
86
86
  }
87
-
87
+
88
88
  std::cout << std::endl;
89
89
  }
90
90
  #endif
91
-
91
+
92
92
  }
93
93
 
94
94
  #endif
@@ -53,7 +53,7 @@ static Expressions GetUriTemplateExpressions(const URITemplate& uriTemplate) {
53
53
  Expressions expressions;
54
54
  size_t expressionStartPos = 0;
55
55
  size_t expressionEndPos = 0;
56
-
56
+
57
57
  while (expressionStartPos != std::string::npos && expressionEndPos != std::string::npos && expressionStartPos < uriTemplate.length()) {
58
58
  expressionStartPos = uriTemplate.find("{", expressionStartPos);
59
59
  expressionEndPos = uriTemplate.find("}", expressionStartPos);
@@ -105,12 +105,12 @@ static ClassifiedExpression ClassifyExpression(const Expression& expression) {
105
105
  }
106
106
 
107
107
  FormStyleQueryContinuationExpression formStyleQueryContinuationExpression(expression);
108
- if (formStyleQueryContinuationExpression.IsExpressionType()) {
108
+ if (formStyleQueryContinuationExpression.IsExpressionType()) {
109
109
  return formStyleQueryContinuationExpression;
110
110
  }
111
111
 
112
112
  UndefinedExpression undefinedExpression(expression);
113
-
113
+
114
114
  return undefinedExpression;
115
115
  }
116
116
 
@@ -131,7 +131,7 @@ void URITemplateParser::parse(const URITemplate& uri, const mdp::CharactersRange
131
131
  result.report.warnings.push_back(Warning("The URI template contains mismatched expression brackets", URIWarning, sourceBlock));
132
132
  return;
133
133
  }
134
-
134
+
135
135
  if (HasNestedCurlyBrackets(result.path)) {
136
136
  result.report.warnings.push_back(Warning("The URI template contains nested expression brackets", URIWarning, sourceBlock));
137
137
  return;
@@ -172,7 +172,7 @@ void URITemplateParser::parse(const URITemplate& uri, const mdp::CharactersRange
172
172
  result.report.warnings.push_back(Warning(ss.str(), URIWarning, sourceBlock));
173
173
  hasIllegalCharacters = true;
174
174
  }
175
-
175
+
176
176
  if (!hasIllegalCharacters) {
177
177
  if (classifiedExpression.IsInvalidExpressionName()) {
178
178
  std::stringstream ss;
@@ -18,7 +18,7 @@
18
18
  #define URI_TEMPLATE_EXPRESSION_REGEX "^([?|#|+|&]?(([A-Z|a-z|0-9|_|,])*|(%[A-F|a-f|0-9]{2})*)*\\*?)$"
19
19
 
20
20
  namespace snowcrash {
21
-
21
+
22
22
  /**
23
23
  * \brief URI template parse result.
24
24
  */
@@ -26,10 +26,10 @@ namespace snowcrash {
26
26
  std::string scheme;
27
27
  std::string host;
28
28
  std::string path;
29
-
29
+
30
30
  Report report;
31
31
  };
32
-
32
+
33
33
  /**
34
34
  * \brief URI template expression.
35
35
  */
@@ -59,13 +59,13 @@ namespace snowcrash {
59
59
  }
60
60
 
61
61
  std::string unsupportedWarningText;
62
-
62
+
63
63
  snowcrash::Expression innerExpression;
64
-
64
+
65
65
  virtual bool IsExpressionType() const {
66
66
  return false;
67
67
  }
68
-
68
+
69
69
  bool ContainsSpaces() {
70
70
  return innerExpression.find(" ") != std::string::npos;
71
71
  }
@@ -81,11 +81,11 @@ namespace snowcrash {
81
81
  bool IsInvalidExpressionName() {
82
82
  std::string tmpExpression = innerExpression;
83
83
  if (tmpExpression.find("..") != std::string::npos) return true;
84
-
84
+
85
85
  size_t start_pos = 0;
86
86
  while ((start_pos = tmpExpression.find(".", start_pos)) != std::string::npos) {
87
87
  tmpExpression.replace(start_pos, 1, "_");
88
- start_pos++;
88
+ start_pos++;
89
89
  }
90
90
 
91
91
  return !RegexMatch(tmpExpression, URI_TEMPLATE_EXPRESSION_REGEX);
@@ -193,7 +193,7 @@ namespace snowcrash {
193
193
  return innerExpression.substr(0, 1) == ";";
194
194
  }
195
195
  };
196
-
196
+
197
197
  /**
198
198
  * \brief level three form style query continuation expansion URI template expression.
199
199
  */
@@ -30,7 +30,7 @@ namespace snowcrash {
30
30
  static MarkdownNodeIterator processNestedSection(const MarkdownNodeIterator& node,
31
31
  const MarkdownNodes& siblings,
32
32
  SectionParserData& pd,
33
- ParseResult<Values>& out) {
33
+ const ParseResultRef<Values>& out) {
34
34
 
35
35
  if (pd.sectionContext() == ValueSectionType) {
36
36
 
@@ -70,7 +70,7 @@ namespace snowcrash {
70
70
  static MarkdownNodeIterator processDescription(const MarkdownNodeIterator& node,
71
71
  const MarkdownNodes& siblings,
72
72
  SectionParserData& pd,
73
- ParseResult<Values>& out) {
73
+ const ParseResultRef<Values>& out) {
74
74
 
75
75
  return node;
76
76
  }
@@ -15,7 +15,7 @@
15
15
  #define SNOWCRASH_VERSION_H
16
16
 
17
17
  #define SNOWCRASH_MAJOR_VERSION 0
18
- #define SNOWCRASH_MINOR_VERSION 15
18
+ #define SNOWCRASH_MINOR_VERSION 16
19
19
  #define SNOWCRASH_PATCH_VERSION 0
20
20
 
21
21
  #define SNOWCRASH_VERSION_IS_RELEASE 1
@@ -9,19 +9,21 @@
9
9
  #include "csnowcrash.h"
10
10
  #include "snowcrash.h"
11
11
 
12
+ using namespace snowcrash;
13
+
12
14
  int sc_c_parse(const char* source, sc_blueprint_parser_options option, sc_report_t** report, sc_blueprint_t** blueprint, sc_sm_blueprint_t** sm_blueprint)
13
15
  {
14
- snowcrash::Report* t_report = ::new snowcrash::Report;
15
- snowcrash::Blueprint* t_blueprint = ::new snowcrash::Blueprint;
16
- snowcrash::SourceMap<snowcrash::Blueprint>* t_sm_blueprint = ::new snowcrash::SourceMap<snowcrash::Blueprint>;
16
+ Report* resultReport = ::new snowcrash::Report;
17
+ Blueprint* resultblueprint = ::new snowcrash::Blueprint;
18
+ SourceMap<snowcrash::Blueprint>* resultSourceMap = ::new SourceMap<snowcrash::Blueprint>;
17
19
 
18
- snowcrash::ParseResult<snowcrash::Blueprint>* t_parse_result = ::new snowcrash::ParseResult<snowcrash::Blueprint>(*t_report, *t_blueprint, *t_sm_blueprint);
20
+ ParseResultRef<Blueprint> result(*resultReport, *resultblueprint, *resultSourceMap);
19
21
 
20
- int ret = snowcrash::parse(source, option, *t_parse_result);
22
+ int ret = snowcrash::parse(source, option, result);
21
23
 
22
- *report = AS_TYPE(sc_report_t, t_report);
23
- *blueprint = AS_TYPE(sc_blueprint_t, t_blueprint);
24
- *sm_blueprint = AS_TYPE(sc_sm_blueprint_t, t_sm_blueprint);
24
+ *report = AS_TYPE(sc_report_t, resultReport);
25
+ *blueprint = AS_TYPE(sc_blueprint_t, resultblueprint);
26
+ *sm_blueprint = AS_TYPE(sc_sm_blueprint_t, resultSourceMap);
25
27
 
26
28
  return ret;
27
29
  }
@@ -13,7 +13,7 @@ const int snowcrash::SourceAnnotation::OK = 0;
13
13
 
14
14
  using namespace snowcrash;
15
15
 
16
- /**
16
+ /**
17
17
  * \brief Check source for unsupported character \t & \r
18
18
  * \return True if passed (not found), false otherwise
19
19
  */
@@ -23,7 +23,7 @@ static bool CheckSource(const mdp::ByteBuffer& source, Report& report)
23
23
  std::string::size_type pos = source.find("\t");
24
24
 
25
25
  if (pos != std::string::npos) {
26
-
26
+
27
27
  mdp::BytesRangeSet rangeSet;
28
28
  rangeSet.push_back(mdp::BytesRange(pos, 1));
29
29
  report.error = Error("the use of tab(s) '\\t' in source data isn't currently supported, please contact makers",
@@ -31,7 +31,7 @@ static bool CheckSource(const mdp::ByteBuffer& source, Report& report)
31
31
  mdp::BytesRangeSetToCharactersRangeSet(rangeSet, source));
32
32
  return false;
33
33
  }
34
-
34
+
35
35
  pos = source.find("\r");
36
36
 
37
37
  if (pos != std::string::npos) {
@@ -43,20 +43,20 @@ static bool CheckSource(const mdp::ByteBuffer& source, Report& report)
43
43
  mdp::BytesRangeSetToCharactersRangeSet(rangeSet, source));
44
44
  return false;
45
45
  }
46
-
46
+
47
47
  return true;
48
48
  }
49
49
 
50
50
  int snowcrash::parse(const mdp::ByteBuffer& source,
51
51
  BlueprintParserOptions options,
52
- ParseResult<Blueprint>& out)
52
+ const ParseResultRef<Blueprint>& out)
53
53
  {
54
54
  try {
55
-
55
+
56
56
  // Sanity Check
57
57
  if (!CheckSource(source, out.report))
58
58
  return out.report.error.code;
59
-
59
+
60
60
  // Do nothing if blueprint is empty
61
61
  if (source.empty())
62
62
  return out.report.error.code;
@@ -73,13 +73,13 @@ int snowcrash::parse(const mdp::ByteBuffer& source,
73
73
  BlueprintParser::parse(markdownAST.children().begin(), markdownAST.children(), pd, out);
74
74
  }
75
75
  catch (const std::exception& e) {
76
-
76
+
77
77
  std::stringstream ss;
78
78
  ss << "parser exception: '" << e.what() << "'";
79
79
  out.report.error = Error(ss.str(), 1);
80
80
  }
81
81
  catch (...) {
82
-
82
+
83
83
  out.report.error = Error("parser exception has occured", 1);
84
84
  }
85
85
 
@@ -22,25 +22,23 @@
22
22
  * For Snow Crash users, this is the only interface to use.
23
23
  *
24
24
  * For binding writers, this is the point to start wrapping.
25
- * Refer to https://github.com/apiaryio/snowcrash/wiki/Writing-a-binding
25
+ * Refer to https://github.com/apiaryio/snowcrash/wiki/Writing-a-binding
26
26
  * for details on how to write a Snow Crash binding.
27
27
  */
28
28
 
29
29
  namespace snowcrash {
30
-
30
+
31
31
  /**
32
32
  * \brief Parse the source data into a blueprint abstract source tree (AST).
33
33
  *
34
- * \param source A textual source data to be parsed.
35
- * \param options Parser options. Use 0 for no additional options.
36
- * \param report Parsing report.
37
- * \param blueprint Parsed blueprint AST.
38
- * \param blueprintSM Blueprint sourcemap AST
34
+ * \param source A textual source data to be parsed.
35
+ * \param options Parser options. Use 0 for no additional options.
36
+ * \param out Output buffer to store parsing result into.
39
37
  * \return Error status code. Zero represents success, non-zero a failure.
40
38
  */
41
39
  int parse(const mdp::ByteBuffer& source,
42
40
  BlueprintParserOptions options,
43
- ParseResult<Blueprint>& out);
41
+ const ParseResultRef<Blueprint>& out);
44
42
  }
45
43
 
46
44
  #endif