redsnow 0.0.8

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 (174) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +34 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +20 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +21 -0
  8. data/README.md +62 -0
  9. data/Rakefile +36 -0
  10. data/Vagrantfile +20 -0
  11. data/ext/snowcrash/Makefile +64 -0
  12. data/ext/snowcrash/Vagrantfile +20 -0
  13. data/ext/snowcrash/bin/snowcrash +0 -0
  14. data/ext/snowcrash/common.gypi +163 -0
  15. data/ext/snowcrash/config.gypi +10 -0
  16. data/ext/snowcrash/config.mk +5 -0
  17. data/ext/snowcrash/configure +213 -0
  18. data/ext/snowcrash/provisioning.sh +15 -0
  19. data/ext/snowcrash/snowcrash.gyp +141 -0
  20. data/ext/snowcrash/src/ActionParser.h +503 -0
  21. data/ext/snowcrash/src/AssetParser.h +215 -0
  22. data/ext/snowcrash/src/BlockUtility.h +186 -0
  23. data/ext/snowcrash/src/Blueprint.h +283 -0
  24. data/ext/snowcrash/src/BlueprintParser.h +347 -0
  25. data/ext/snowcrash/src/BlueprintParserCore.h +190 -0
  26. data/ext/snowcrash/src/BlueprintSection.h +140 -0
  27. data/ext/snowcrash/src/BlueprintUtility.h +126 -0
  28. data/ext/snowcrash/src/CBlueprint.cc +600 -0
  29. data/ext/snowcrash/src/CBlueprint.h +354 -0
  30. data/ext/snowcrash/src/CSourceAnnotation.cc +140 -0
  31. data/ext/snowcrash/src/CSourceAnnotation.h +106 -0
  32. data/ext/snowcrash/src/CodeBlockUtility.h +189 -0
  33. data/ext/snowcrash/src/DescriptionSectionUtility.h +156 -0
  34. data/ext/snowcrash/src/HTTP.cc +46 -0
  35. data/ext/snowcrash/src/HTTP.h +105 -0
  36. data/ext/snowcrash/src/HeaderParser.h +289 -0
  37. data/ext/snowcrash/src/ListBlockUtility.h +273 -0
  38. data/ext/snowcrash/src/ListUtility.h +95 -0
  39. data/ext/snowcrash/src/MarkdownBlock.cc +176 -0
  40. data/ext/snowcrash/src/MarkdownBlock.h +93 -0
  41. data/ext/snowcrash/src/MarkdownParser.cc +266 -0
  42. data/ext/snowcrash/src/MarkdownParser.h +88 -0
  43. data/ext/snowcrash/src/ParameterDefinitonParser.h +570 -0
  44. data/ext/snowcrash/src/ParametersParser.h +252 -0
  45. data/ext/snowcrash/src/Parser.cc +71 -0
  46. data/ext/snowcrash/src/Parser.h +29 -0
  47. data/ext/snowcrash/src/ParserCore.cc +120 -0
  48. data/ext/snowcrash/src/ParserCore.h +82 -0
  49. data/ext/snowcrash/src/PayloadParser.h +672 -0
  50. data/ext/snowcrash/src/Platform.h +54 -0
  51. data/ext/snowcrash/src/RegexMatch.h +32 -0
  52. data/ext/snowcrash/src/ResourceGroupParser.h +195 -0
  53. data/ext/snowcrash/src/ResourceParser.h +584 -0
  54. data/ext/snowcrash/src/SectionUtility.h +142 -0
  55. data/ext/snowcrash/src/Serialize.cc +52 -0
  56. data/ext/snowcrash/src/Serialize.h +69 -0
  57. data/ext/snowcrash/src/SerializeJSON.cc +601 -0
  58. data/ext/snowcrash/src/SerializeJSON.h +21 -0
  59. data/ext/snowcrash/src/SerializeYAML.cc +336 -0
  60. data/ext/snowcrash/src/SerializeYAML.h +21 -0
  61. data/ext/snowcrash/src/SourceAnnotation.h +177 -0
  62. data/ext/snowcrash/src/StringUtility.h +109 -0
  63. data/ext/snowcrash/src/SymbolTable.h +83 -0
  64. data/ext/snowcrash/src/UriTemplateParser.cc +195 -0
  65. data/ext/snowcrash/src/UriTemplateParser.h +243 -0
  66. data/ext/snowcrash/src/Version.h +39 -0
  67. data/ext/snowcrash/src/csnowcrash.cc +23 -0
  68. data/ext/snowcrash/src/csnowcrash.h +38 -0
  69. data/ext/snowcrash/src/posix/RegexMatch.cc +99 -0
  70. data/ext/snowcrash/src/snowcrash.cc +18 -0
  71. data/ext/snowcrash/src/snowcrash.h +41 -0
  72. data/ext/snowcrash/src/snowcrash/snowcrash.cc +170 -0
  73. data/ext/snowcrash/src/win/RegexMatch.cc +78 -0
  74. data/ext/snowcrash/sundown/CONTRIBUTING.md +10 -0
  75. data/ext/snowcrash/sundown/Makefile +83 -0
  76. data/ext/snowcrash/sundown/Makefile.win +33 -0
  77. data/ext/snowcrash/sundown/examples/smartypants.c +72 -0
  78. data/ext/snowcrash/sundown/examples/sundown.c +80 -0
  79. data/ext/snowcrash/sundown/html/houdini.h +37 -0
  80. data/ext/snowcrash/sundown/html/houdini_href_e.c +108 -0
  81. data/ext/snowcrash/sundown/html/houdini_html_e.c +84 -0
  82. data/ext/snowcrash/sundown/html/html.c +647 -0
  83. data/ext/snowcrash/sundown/html/html.h +77 -0
  84. data/ext/snowcrash/sundown/html/html_smartypants.c +389 -0
  85. data/ext/snowcrash/sundown/html_block_names.txt +25 -0
  86. data/ext/snowcrash/sundown/src/autolink.c +297 -0
  87. data/ext/snowcrash/sundown/src/autolink.h +51 -0
  88. data/ext/snowcrash/sundown/src/buffer.c +225 -0
  89. data/ext/snowcrash/sundown/src/buffer.h +96 -0
  90. data/ext/snowcrash/sundown/src/html_blocks.h +206 -0
  91. data/ext/snowcrash/sundown/src/markdown.c +2701 -0
  92. data/ext/snowcrash/sundown/src/markdown.h +147 -0
  93. data/ext/snowcrash/sundown/src/src_map.c +200 -0
  94. data/ext/snowcrash/sundown/src/src_map.h +58 -0
  95. data/ext/snowcrash/sundown/src/stack.c +81 -0
  96. data/ext/snowcrash/sundown/src/stack.h +29 -0
  97. data/ext/snowcrash/sundown/sundown.def +20 -0
  98. data/ext/snowcrash/tools/gyp/AUTHORS +11 -0
  99. data/ext/snowcrash/tools/gyp/DEPS +24 -0
  100. data/ext/snowcrash/tools/gyp/OWNERS +1 -0
  101. data/ext/snowcrash/tools/gyp/PRESUBMIT.py +120 -0
  102. data/ext/snowcrash/tools/gyp/buildbot/buildbot_run.py +190 -0
  103. data/ext/snowcrash/tools/gyp/codereview.settings +10 -0
  104. data/ext/snowcrash/tools/gyp/data/win/large-pdb-shim.cc +12 -0
  105. data/ext/snowcrash/tools/gyp/gyp +8 -0
  106. data/ext/snowcrash/tools/gyp/gyp.bat +5 -0
  107. data/ext/snowcrash/tools/gyp/gyp_main.py +18 -0
  108. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSNew.py +340 -0
  109. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSProject.py +208 -0
  110. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSSettings.py +1063 -0
  111. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSToolFile.py +58 -0
  112. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSUserFile.py +147 -0
  113. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSUtil.py +267 -0
  114. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSVersion.py +409 -0
  115. data/ext/snowcrash/tools/gyp/pylib/gyp/__init__.py +537 -0
  116. data/ext/snowcrash/tools/gyp/pylib/gyp/__init__.pyc +0 -0
  117. data/ext/snowcrash/tools/gyp/pylib/gyp/common.py +521 -0
  118. data/ext/snowcrash/tools/gyp/pylib/gyp/common.pyc +0 -0
  119. data/ext/snowcrash/tools/gyp/pylib/gyp/easy_xml.py +157 -0
  120. data/ext/snowcrash/tools/gyp/pylib/gyp/flock_tool.py +49 -0
  121. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.py +0 -0
  122. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.pyc +0 -0
  123. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/android.py +1069 -0
  124. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/cmake.py +1143 -0
  125. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/dump_dependency_json.py +81 -0
  126. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/eclipse.py +335 -0
  127. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/gypd.py +87 -0
  128. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/gypsh.py +56 -0
  129. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/make.py +2181 -0
  130. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/make.pyc +0 -0
  131. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/msvs.py +3335 -0
  132. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/ninja.py +2156 -0
  133. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/xcode.py +1224 -0
  134. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/xcode.pyc +0 -0
  135. data/ext/snowcrash/tools/gyp/pylib/gyp/input.py +2809 -0
  136. data/ext/snowcrash/tools/gyp/pylib/gyp/input.pyc +0 -0
  137. data/ext/snowcrash/tools/gyp/pylib/gyp/mac_tool.py +510 -0
  138. data/ext/snowcrash/tools/gyp/pylib/gyp/msvs_emulation.py +972 -0
  139. data/ext/snowcrash/tools/gyp/pylib/gyp/ninja_syntax.py +160 -0
  140. data/ext/snowcrash/tools/gyp/pylib/gyp/ordered_dict.py +289 -0
  141. data/ext/snowcrash/tools/gyp/pylib/gyp/win_tool.py +292 -0
  142. data/ext/snowcrash/tools/gyp/pylib/gyp/xcode_emulation.py +1440 -0
  143. data/ext/snowcrash/tools/gyp/pylib/gyp/xcode_emulation.pyc +0 -0
  144. data/ext/snowcrash/tools/gyp/pylib/gyp/xcodeproj_file.py +2889 -0
  145. data/ext/snowcrash/tools/gyp/pylib/gyp/xcodeproj_file.pyc +0 -0
  146. data/ext/snowcrash/tools/gyp/pylib/gyp/xml_fix.py +69 -0
  147. data/ext/snowcrash/tools/gyp/pylintrc +307 -0
  148. data/ext/snowcrash/tools/gyp/samples/samples +81 -0
  149. data/ext/snowcrash/tools/gyp/samples/samples.bat +5 -0
  150. data/ext/snowcrash/tools/gyp/setup.py +19 -0
  151. data/ext/snowcrash/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec +27 -0
  152. data/ext/snowcrash/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec +226 -0
  153. data/ext/snowcrash/tools/gyp/tools/emacs/gyp.el +252 -0
  154. data/ext/snowcrash/tools/gyp/tools/graphviz.py +100 -0
  155. data/ext/snowcrash/tools/gyp/tools/pretty_gyp.py +155 -0
  156. data/ext/snowcrash/tools/gyp/tools/pretty_sln.py +168 -0
  157. data/ext/snowcrash/tools/gyp/tools/pretty_vcproj.py +329 -0
  158. data/ext/snowcrash/tools/homebrew/snowcrash.rb +11 -0
  159. data/ext/snowcrash/vcbuild.bat +184 -0
  160. data/lib/redsnow.rb +31 -0
  161. data/lib/redsnow/binding.rb +132 -0
  162. data/lib/redsnow/blueprint.rb +365 -0
  163. data/lib/redsnow/object.rb +18 -0
  164. data/lib/redsnow/parseresult.rb +107 -0
  165. data/lib/redsnow/version.rb +4 -0
  166. data/provisioning.sh +20 -0
  167. data/redsnow.gemspec +35 -0
  168. data/test/_helper.rb +15 -0
  169. data/test/fixtures/sample-api-ast.json +97 -0
  170. data/test/fixtures/sample-api.apib +20 -0
  171. data/test/redsnow_binding_test.rb +35 -0
  172. data/test/redsnow_parseresult_test.rb +50 -0
  173. data/test/redsnow_test.rb +285 -0
  174. metadata +358 -0
@@ -0,0 +1,11 @@
1
+ require 'formula'
2
+
3
+ class Snowcrash < Formula
4
+ homepage 'http://apiblueprint.org'
5
+ head 'https://github.com/apiaryio/snowcrash.git', :tag => 'v0.12.0'
6
+
7
+ def install
8
+ system "./configure"
9
+ system "make", "install"
10
+ end
11
+ end
@@ -0,0 +1,184 @@
1
+ @echo off
2
+
3
+ @rem Attribution Notice
4
+ @rem ------------------
5
+ @rem This file uses parts of Node.js `vcbuild.bat`.
6
+ @rem Please refer to https://github.com/joyent/node.
7
+
8
+ cd %~dp0
9
+
10
+ if /i "%1"=="help" goto help
11
+ if /i "%1"=="--help" goto help
12
+ if /i "%1"=="-help" goto help
13
+ if /i "%1"=="/help" goto help
14
+ if /i "%1"=="?" goto help
15
+ if /i "%1"=="-?" goto help
16
+ if /i "%1"=="--?" goto help
17
+ if /i "%1"=="/?" goto help
18
+
19
+ @rem Process arguments.
20
+ set config=Release
21
+ set target=Build
22
+ set target_arch=ia32
23
+ set noprojgen=
24
+ set nobuild=
25
+ set test=
26
+
27
+ :next-arg
28
+ if "%1"=="" goto args-done
29
+ if /i "%1"=="debug" set config=Debug&goto arg-ok
30
+ if /i "%1"=="release" set config=Release&goto arg-ok
31
+ if /i "%1"=="clean" set target=Clean&goto arg-ok
32
+ if /i "%1"=="ia32" set target_arch=ia32&goto arg-ok
33
+ if /i "%1"=="x86" set target_arch=ia32&goto arg-ok
34
+ if /i "%1"=="x64" set target_arch=x64&goto arg-ok
35
+ if /i "%1"=="noprojgen" set noprojgen=1&goto arg-ok
36
+ if /i "%1"=="nobuild" set nobuild=1&goto arg-ok
37
+ if /i "%1"=="test" set test=test&goto arg-ok
38
+ if /i "%1"=="inttest" set inttest=1&goto arg-ok
39
+ if /i "%1"=="MSVC2012" set GYP_MSVS_VERSION=2012&goto arg-ok
40
+ if /i "%1"=="MSVC2010" set GYP_MSVS_VERSION=2010&goto arg-ok
41
+ if /i "%1"=="MSVC2008" set GYP_MSVS_VERSION=2008&goto arg-ok
42
+
43
+ echo Warning: ignoring invalid command line option `%1`.
44
+
45
+ :arg-ok
46
+ shift
47
+ goto next-arg
48
+
49
+ :args-done
50
+ if "%config%"=="Debug" set debug_arg=--debug
51
+
52
+ :project-gen
53
+ @rem Skip project generation if requested.
54
+ if defined noprojgen goto msbuild
55
+ if "%GYP_MSVS_VERSION%"=="" set GYP_MSVS_VERSION=2012
56
+
57
+ @rem Generate the VS project.
58
+ SETLOCAL
59
+ if defined VS100COMNTOOLS call "%VS100COMNTOOLS%\VCVarsQueryRegistry.bat"
60
+ if defined inttest python configure %debug_arg% --dest-cpu=%target_arch% --include-integration-tests
61
+ if not defined inttest python configure %debug_arg% --dest-cpu=%target_arch%
62
+ if errorlevel 1 goto create-msvs-files-failed
63
+ if not exist build/snowcrash.sln goto create-msvs-files-failed
64
+ echo Project files generated.
65
+ ENDLOCAL
66
+
67
+ @rem Skip to the end for now
68
+ @rem goto exit
69
+
70
+ :msbuild
71
+ @rem Skip project generation if requested.
72
+ if defined nobuild goto exit
73
+ if "%GYP_MSVS_VERSION%"=="2010" goto vc-set-2010
74
+ if "%GYP_MSVS_VERSION%"=="2008" goto vc-set-2008
75
+
76
+ @rem Look for Visual Studio 2012
77
+ if not defined VS110COMNTOOLS goto vc-set-2010
78
+ if not exist "%VS110COMNTOOLS%\..\..\vc\vcvarsall.bat" goto vc-set-2010
79
+ call "%VS110COMNTOOLS%\..\..\vc\vcvarsall.bat"
80
+ if not defined VCINSTALLDIR goto msbuild-not-found
81
+ goto msbuild-found
82
+
83
+ :vc-set-2010
84
+ if not defined VS100COMNTOOLS goto vc-set-2008
85
+ if not exist "%VS100COMNTOOLS%\..\..\vc\vcvarsall.bat" goto vc-set-2008
86
+ call "%VS100COMNTOOLS%\..\..\vc\vcvarsall.bat"
87
+ if not defined VCINSTALLDIR goto msbuild-not-found
88
+ goto msbuild-found
89
+
90
+ :vc-set-2008
91
+ if not defined VS90COMNTOOLS goto msbuild-not-found
92
+ if not exist "%VS90COMNTOOLS%\..\..\vc\vcvarsall.bat" goto msbuild-not-found
93
+ call "%VS90COMNTOOLS%\..\..\vc\vcvarsall.bat"
94
+ if not defined VCINSTALLDIR goto msbuild-not-found
95
+ goto msbuild-found
96
+
97
+ :msbuild-not-found
98
+ echo Build skipped. To build, this file needs to run from VS cmd prompt.
99
+ goto exit
100
+
101
+ :msbuild-found
102
+ @rem Build the sln with msbuild.
103
+ @rem Refer to http://msdn.microsoft.com/en-us/library/ms164311.aspx
104
+ echo Building Snow Crash...
105
+ msbuild build/snowcrash.sln /m /clp:NoSummary;NoItemAndPropertyList;Verbosity=normal /nologo /property:Configuration=%config%
106
+ if errorlevel 1 goto exit
107
+
108
+ :run
109
+ @rem Run tests if requested.
110
+ if "%test%"=="" goto intigration-test
111
+ echo Running tests...
112
+ .\build\%config%\test-libsnowcrash.exe
113
+
114
+ :intigration-test
115
+ if defined inttest goto run-integration-test
116
+
117
+ @rem All Done
118
+ goto exit
119
+
120
+ :run-integration-test
121
+ if "%config%"=="Debug" (
122
+ SET "Replacement= ENV['PATH'] = "../../build/Debug""
123
+ goto :run-cucumber
124
+ )
125
+ SET "Replacement= ENV['PATH'] = "../../build/Release""
126
+ goto :run-cucumber
127
+
128
+ :run-cucumber
129
+ SET "file=features\support\env-win.rb"
130
+ if exist "%file%" goto env-exist
131
+ SETLOCAL ENABLEDELAYEDEXPANSION
132
+ SET "line=require 'aruba/cucumber'"
133
+ ECHO !line! >"%file%"
134
+ SET "line=require 'rbconfig'"
135
+ ECHO !line! >>"%file%"
136
+ SET "line=Before do"
137
+ ECHO !line! >>"%file%"
138
+ SET "line= @dirs << "../../features/fixtures""
139
+ ECHO !line! >>"%file%"
140
+ SET "line= case RbConfig::CONFIG['host_os']"
141
+ ECHO !line! >>"%file%"
142
+ SET "line= when /mswin|msys|mingw|cygwin|bccwin|wince|emc/"
143
+ ECHO !line! >>"%file%"
144
+ ECHO !Replacement! >>"%file%"
145
+ SET "line=end"
146
+ ECHO !line! >>"%file%"
147
+ SET "line=end"
148
+ ECHO !line! >>"%file%"
149
+ ENDLOCAL
150
+
151
+ bundle exec cucumber
152
+ goto exit
153
+
154
+ :env-exist
155
+ SET /a Line#ToSearch=7
156
+ (FOR /f "tokens=1*delims=:" %%a IN ('findstr /n "^" "%file%"') DO (
157
+ SET "Line=%%b"
158
+ IF %%a equ %Line#ToSearch% SET "Line=%Replacement%"
159
+ SETLOCAL ENABLEDELAYEDEXPANSION
160
+ ECHO(!Line!)
161
+ ENDLOCAL
162
+ )>"%file%.new"
163
+ MOVE "%file%.new" "%file%" >nul
164
+
165
+ bundle exec cucumber
166
+ goto exit
167
+
168
+ :create-msvs-files-failed
169
+ echo Failed to create vc project files.
170
+ goto exit
171
+
172
+ :help
173
+ echo vcbuild.bat [debug/release] [test] [clean] [noprojgen] [nobuild] [x86/x64] [inttest] [MSVC2008/MSVC2010/MSVC2012]
174
+ echo Examples:
175
+ echo vcbuild.bat : builds release build
176
+ echo vcbuild.bat nobuild : generate MSVS project files only
177
+ echo vcbuild.bat debug : builds debug build
178
+ echo vcbuild.bat test : builds debug build and runs tests
179
+ echo vcbuild.bat inttest : include integration tests
180
+ echo vcbuild.bat MSVC2012 : indicate target solution's version, could also define as MSVC2008 , MSVC2010 , MSVC2012
181
+ goto exit
182
+
183
+ :exit
184
+ goto :EOF
@@ -0,0 +1,31 @@
1
+ require "redsnow/version"
2
+ require "redsnow/binding"
3
+ require "redsnow/blueprint"
4
+ require "redsnow/parseresult"
5
+ require "ffi"
6
+
7
+ module RedSnow
8
+ include Binding
9
+ # parse
10
+ # parsing API Blueprint into Ruby objects
11
+ # @param rawBlueprint [String] API Blueprint
12
+ # @param options [Number] Parsing Options
13
+ #
14
+ # @return [ParseResult]
15
+ def self.parse(rawBlueprint, options = 0)
16
+ blueprint = FFI::MemoryPointer.new :pointer
17
+ result = FFI::MemoryPointer.new :pointer
18
+ ret = RedSnow::Binding.sc_c_parse(rawBlueprint, options, result, blueprint)
19
+
20
+ blueprint = blueprint.get_pointer(0)
21
+ result = result.get_pointer(0)
22
+
23
+ parseResult = ParseResult.new(blueprint, result)
24
+
25
+ return parseResult
26
+ ensure
27
+ RedSnow::Binding.sc_blueprint_free(blueprint)
28
+ RedSnow::Binding.sc_result_free(result)
29
+ end
30
+
31
+ end
@@ -0,0 +1,132 @@
1
+ require "ffi"
2
+
3
+ module RedSnow
4
+ # C-binding with Snow Crash Library using [FFI](https://github.com/ffi/ffi)
5
+ # @see https://github.com/apiaryio/snowcrash/blob/master/src/csnowcrash.cc
6
+ # @see https://github.com/apiaryio/snowcrash/blob/master/src/CBlueprint.cc
7
+ module Binding
8
+ extend FFI::Library
9
+
10
+ prefix = "lib.target/"
11
+ if FFI::Platform.mac?
12
+ prefix = ""
13
+ end
14
+
15
+ ffi_lib File.expand_path("../../../ext/snowcrash/build/out/Release/#{prefix}libsnowcrash.#{FFI::Platform::LIBSUFFIX}", __FILE__)
16
+ # @see https://github.com/apiaryio/snowcrash/blob/master/src/BlueprintParserCore.h#L31
17
+ enum :option, [
18
+ :render_descriptions_option,
19
+ :require_blueprint_name_option
20
+ ]
21
+
22
+ attach_function("sc_c_parse", "sc_c_parse", [ :string, :option, :pointer, :pointer ], :int)
23
+
24
+ attach_function("sc_blueprint_free", "sc_blueprint_free", [ :pointer ], :void)
25
+ attach_function("sc_blueprint_name", "sc_blueprint_name", [ :pointer ], :string)
26
+ attach_function("sc_blueprint_description", "sc_blueprint_description", [ :pointer ], :string)
27
+
28
+ attach_function("sc_metadata_collection_handle", "sc_metadata_collection_handle", [ :pointer ], :pointer)
29
+ attach_function("sc_metadata_collection_size", "sc_metadata_collection_size", [ :pointer ], :int)
30
+
31
+ attach_function("sc_metadata_handle", "sc_metadata_handle", [ :pointer, :int ], :pointer)
32
+ attach_function("sc_metadata_key", "sc_metadata_key", [ :pointer ], :string)
33
+ attach_function("sc_metadata_value", "sc_metadata_value",[ :pointer ], :string)
34
+
35
+ attach_function("sc_resource_groups_collection_handle", "sc_resource_groups_collection_handle", [ :pointer ], :pointer)
36
+ attach_function("sc_resource_groups_collection_size", "sc_resource_groups_collection_size", [ :pointer ], :int)
37
+
38
+ attach_function("sc_resource_groups_handle", "sc_resource_groups_handle", [ :pointer, :int ], :pointer)
39
+ attach_function("sc_resource_groups_name", "sc_resource_groups_name", [ :pointer ], :string)
40
+ attach_function("sc_resource_groups_description", "sc_resource_groups_description", [ :pointer ], :string)
41
+
42
+ attach_function("sc_resource_collection_handle", "sc_resource_collection_handle", [ :pointer ] , :pointer)
43
+ attach_function("sc_resource_collection_size", "sc_resource_collection_size", [ :pointer ], :int)
44
+ # Resource
45
+ attach_function("sc_resource_handle", "sc_resource_handle", [ :pointer, :int ] , :pointer)
46
+ attach_function("sc_resource_uritemplate", "sc_resource_uritemplate", [ :pointer ], :string)
47
+ attach_function("sc_resource_name", "sc_resource_name", [ :pointer ], :string)
48
+ attach_function("sc_resource_description", "sc_resource_description", [ :pointer ], :string)
49
+
50
+ attach_function("sc_payload_collection_handle_requests", "sc_payload_collection_handle_requests", [ :pointer ], :pointer)
51
+ attach_function("sc_payload_collection_handle_responses", "sc_payload_collection_handle_responses", [ :pointer ], :pointer)
52
+ attach_function("sc_payload_collection_size", "sc_payload_collection_size", [ :pointer ], :int)
53
+ # Resource.model
54
+ attach_function("sc_payload_handle", "sc_payload_handle", [ :pointer, :int ], :pointer)
55
+ attach_function("sc_payload_handle_resource", "sc_payload_handle_resource", [ :pointer ], :pointer)
56
+ attach_function("sc_payload_name", "sc_payload_name", [ :pointer ], :string)
57
+ attach_function("sc_payload_description", "sc_payload_description", [ :pointer ], :string)
58
+ attach_function("sc_payload_body", "sc_payload_body", [ :pointer ], :string)
59
+ attach_function("sc_payload_schema", "sc_payload_schema", [ :pointer ], :string)
60
+
61
+ attach_function("sc_parameter_collection_handle_payload", "sc_parameter_collection_handle_payload", [ :pointer ], :pointer)
62
+ attach_function("sc_parameter_collection_handle_resource", "sc_parameter_collection_handle_resource", [ :pointer ], :pointer)
63
+ attach_function("sc_parameter_collection_handle_action", "sc_parameter_collection_handle_action", [ :pointer ], :pointer)
64
+ attach_function("sc_parameter_collection_size", "sc_parameter_collection_size", [ :pointer ], :int)
65
+
66
+ # @see https://github.com/apiaryio/snowcrash/blob/master/src/Blueprint.h#L85
67
+ enum :parameter_use, [:undefined,
68
+ :optional,
69
+ :required,
70
+ ]
71
+
72
+ attach_function("sc_parameter_handle", "sc_parameter_handle", [ :pointer, :int ], :pointer)
73
+ attach_function("sc_parameter_name", "sc_parameter_name", [ :pointer ], :string)
74
+ attach_function("sc_parameter_description", "sc_parameter_description", [ :pointer ], :string)
75
+ attach_function("sc_parameter_type", "sc_parameter_type", [ :pointer ], :string)
76
+ attach_function("sc_parameter_parameter_use", "sc_parameter_parameter_use", [ :pointer ], :parameter_use)
77
+ attach_function("sc_parameter_default_value", "sc_parameter_default_value", [ :pointer ], :string)
78
+ attach_function("sc_parameter_example_value", "sc_parameter_example_value", [ :pointer ], :string)
79
+
80
+ attach_function("sc_value_collection_handle", "sc_value_collection_handle", [ :pointer], :pointer)
81
+ attach_function("sc_value_collection_size", "sc_value_collection_size", [ :pointer ], :int)
82
+
83
+ attach_function("sc_value_handle", "sc_value_handle", [ :pointer, :int ], :pointer)
84
+ attach_function("sc_value_string", "sc_value_string", [ :pointer], :string)
85
+
86
+ attach_function("sc_header_collection_handle_payload", "sc_header_collection_handle_payload", [ :pointer ], :pointer)
87
+ attach_function("sc_header_collection_handle_resource", "sc_header_collection_handle_resource", [ :pointer ], :pointer)
88
+ attach_function("sc_header_collection_handle_action", "sc_header_collection_handle_action", [ :pointer ], :pointer)
89
+ attach_function("sc_header_collection_size", "sc_header_collection_size", [ :pointer ], :int)
90
+
91
+ attach_function("sc_header_handle", "sc_header_handle", [ :pointer, :int ], :pointer)
92
+ attach_function("sc_header_key", "sc_header_key", [ :pointer ], :string)
93
+ attach_function("sc_header_value", "sc_header_value", [ :pointer], :string)
94
+
95
+ attach_function("sc_action_collection_handle", "sc_action_collection_handle", [ :pointer ], :pointer)
96
+ attach_function("sc_action_collection_size", "sc_action_collection_size", [ :pointer], :int)
97
+
98
+ attach_function("sc_action_handle", "sc_action_handle", [ :pointer, :int ], :pointer)
99
+ attach_function("sc_action_httpmethod", "sc_action_httpmethod", [ :pointer], :string)
100
+ attach_function("sc_action_name", "sc_action_name", [ :pointer], :string)
101
+ attach_function("sc_action_description", "sc_action_description", [ :pointer ], :string)
102
+
103
+ attach_function("sc_transaction_example_collection_handle", "sc_transaction_example_collection_handle", [ :pointer ], :pointer)
104
+ attach_function("sc_transaction_example_collection_size", "sc_transaction_example_collection_size", [ :pointer ], :int)
105
+
106
+ attach_function("sc_transaction_example_handle", "sc_transaction_example_handle", [ :pointer, :int ], :pointer)
107
+ attach_function("sc_transaction_example_name", "sc_transaction_example_name", [ :pointer ], :string)
108
+ attach_function("sc_transaction_example_description", "sc_transaction_example_description", [ :pointer ], :string)
109
+
110
+ attach_function("sc_result_free", "sc_result_free", [ :pointer ], :void)
111
+
112
+ attach_function("sc_location_handler", "sc_location_handler", [ :pointer ], :pointer)
113
+ attach_function("sc_location_size", "sc_location_size", [ :pointer ], :int)
114
+ attach_function("sc_location_length", "sc_location_length", [ :pointer, :int ], :int)
115
+ attach_function("sc_location_location", "sc_location_location", [ :pointer, :int ], :int)
116
+
117
+ attach_function("sc_error_handler", "sc_error_handler", [ :pointer ], :pointer)
118
+ attach_function("sc_error_message", "sc_error_message", [ :pointer ], :string)
119
+ attach_function("sc_error_code", "sc_error_code", [ :pointer ], :int)
120
+ attach_function("sc_error_ok", "sc_error_ok", [ :pointer ], :int)
121
+
122
+ attach_function("sc_warnings_handler", "sc_warnings_handler", [ :pointer ], :pointer)
123
+ attach_function("sc_warnings_size", "sc_warnings_size", [ :pointer ], :int)
124
+ attach_function("sc_warning_handler", "sc_warning_handler", [ :pointer, :int ], :pointer)
125
+ attach_function("sc_warning_message", "sc_warning_message", [ :pointer ], :string)
126
+ attach_function("sc_warning_code", "sc_warning_code", [ :pointer], :int)
127
+ attach_function("sc_warning_ok", "sc_warning_ok", [ :pointer ], :int)
128
+
129
+
130
+ end
131
+
132
+ end
@@ -0,0 +1,365 @@
1
+ require "redsnow/object"
2
+
3
+ # The classes in this module should be 1:1 with the Snow Crash AST
4
+ # counterparts (https://github.com/apiaryio/snowcrash/blob/master/src/Blueprint.h).
5
+ module RedSnow
6
+
7
+ # Blueprint AST node
8
+ # Base class for API Blueprint AST nodes
9
+ #
10
+ # @abstract
11
+ class BlueprintNode
12
+ end
13
+
14
+ # Blueprint AST node with name and description associated
15
+ #
16
+ # @attr name [String] name of the node
17
+ # @attr description [String] description of the node
18
+ #
19
+ # @abstract
20
+ class NamedBlueprintNode < BlueprintNode
21
+
22
+ attr_accessor :name
23
+ attr_accessor :description
24
+
25
+ # Ensure the input string buffer ends with two newlines.
26
+ #
27
+ # @param buffer [String] a buffer to check
28
+ # If the buffer does not ends with two newlines the newlines are added.
29
+ def ensure_description_newlines(buffer)
30
+ return if description.empty?
31
+
32
+ if description[-1, 1] != "\n"
33
+ buffer << "\n\n"
34
+ elsif description.length > 1 && description[-2, 1] != "\n"
35
+ buffer << "\n"
36
+ end
37
+ end
38
+ end
39
+
40
+ # Blueprint AST node for key-value collections
41
+ #
42
+ # @abstract
43
+ # @attr collection [Array<Hash>] array of key value hashes
44
+ class KeyValueCollection < BlueprintNode
45
+
46
+ attr_accessor :collection
47
+
48
+ # Filter collection keys
49
+ #
50
+ # @return [Array<Hash>] collection without ignored keys
51
+ def filter_collection(ignore_keys)
52
+ return @collection if ignore_keys.blank?
53
+ @collection.select { |kv_item| !ignore_keys.include?(kv_item.keys.first) }
54
+ end
55
+ end
56
+
57
+ # Metadata collection Blueprint AST node
58
+ # represents 'metadata section'
59
+ class Metadata < KeyValueCollection
60
+ # Constructor
61
+ # @param sc_metadata_collection_handle [FFI::Pointer]
62
+ def initialize(sc_metadata_collection_handle)
63
+ sc_metadata_collection_size = RedSnow::Binding.sc_metadata_collection_size(sc_metadata_collection_handle)
64
+ if sc_metadata_collection_size > 0
65
+ metadata_size = sc_metadata_collection_size - 1
66
+ @collection = Array.new
67
+ for index in 0..metadata_size do
68
+ sc_metadata_handle = RedSnow::Binding.sc_metadata_handle(sc_metadata_collection_handle, index)
69
+ @collection << Hash[:name => RedSnow::Binding.sc_metadata_key(sc_metadata_handle), :value => RedSnow::Binding.sc_metadata_value(sc_metadata_handle)]
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ # Headers collection Blueprint AST node
76
+ # represents 'headers section'
77
+ class Headers < KeyValueCollection
78
+
79
+ # HTTP 'Content-Type' header
80
+ CONTENT_TYPE_HEADER_KEY = :'Content-Type'
81
+
82
+
83
+ # @return [String] the value of 'Content-type' header if present or nil
84
+ def content_type
85
+ content_type_header = @collection.detect { |header| header.has_key?(CONTENT_TYPE_HEADER_KEY) }
86
+ return (content_type_header.nil?) ? nil : content_type_header[CONTENT_TYPE_HEADER_KEY]
87
+ end
88
+ # @param sc_header_collection_handle_payload [FFI::Pointer]
89
+ def initialize(sc_header_collection_handle_payload)
90
+ sc_header_collection_size = RedSnow::Binding.sc_header_collection_size(sc_header_collection_handle_payload)
91
+ if sc_header_collection_size > 0
92
+ headers_size = sc_header_collection_size - 1
93
+ @collection = Array.new
94
+ for index in 0..headers_size do
95
+ sc_header_handle = RedSnow::Binding.sc_header_handle(sc_header_collection_handle_payload, index)
96
+ @collection << Hash[:name => RedSnow::Binding.sc_header_key(sc_header_handle), :value => RedSnow::Binding.sc_header_value(sc_header_handle)]
97
+ end
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ # URI parameter Blueprint AST node
104
+ # represents one 'parameters section' parameter
105
+ #
106
+ # @attr type [String] an arbitrary type of the parameter or nil
107
+ # @attr use [Symbol] parameter necessity flag, `:required` or `:optional`
108
+ # @attr default_value [String] default value of the parameter or nil
109
+ # This is a value used when the parameter is ommited in the request.
110
+ # @attr example_value [String] example value of the parameter or nil
111
+ # @attr values [Array<String>] an enumeration of possible parameter values
112
+ class Parameter < NamedBlueprintNode
113
+
114
+ attr_accessor :type
115
+ attr_accessor :use
116
+ attr_accessor :default_value
117
+ attr_accessor :example_value
118
+ attr_accessor :values
119
+ # @param sc_parameter_handle [FFI::Pointer]
120
+ def initialize(sc_parameter_handle)
121
+ @name = RedSnow::Binding.sc_parameter_name(sc_parameter_handle)
122
+ @description = RedSnow::Binding.sc_parameter_description(sc_parameter_handle)
123
+ @type = RedSnow::Binding.sc_parameter_type(sc_parameter_handle)
124
+ @use = RedSnow::Binding.sc_parameter_parameter_use(sc_parameter_handle)
125
+ @default_value = RedSnow::Binding.sc_parameter_default_value(sc_parameter_handle)
126
+ @example_value = RedSnow::Binding.sc_parameter_example_value(sc_parameter_handle)
127
+ @values = Array.new
128
+ sc_value_collection_handle = RedSnow::Binding.sc_value_collection_handle(sc_parameter_handle)
129
+ sc_value_collection_size = RedSnow::Binding.sc_value_collection_size(sc_value_collection_handle)
130
+ if sc_value_collection_size > 0
131
+ values_size = sc_value_collection_size - 1
132
+ for valueIndex in 0..values_size do
133
+ sc_value_handle = RedSnow::Binding.sc_value_handle(sc_value_collection_handle, valueIndex)
134
+ value = RedSnow::Binding.sc_value_string(sc_value_handle)
135
+ @values << value
136
+ end
137
+ end
138
+ end
139
+
140
+ end
141
+
142
+ # Collection of URI parameters Blueprint AST node
143
+ # represents 'parameters section'
144
+ #
145
+ # @attr collection [Array<Parameter>] an array of URI parameters
146
+ class Parameters < BlueprintNode
147
+
148
+ attr_accessor :collection
149
+ # @param sc_parameter_collection_handle [FFI::Pointer]
150
+ def initialize(sc_parameter_collection_handle)
151
+ sc_parameter_collection_size = RedSnow::Binding.sc_parameter_collection_size(sc_parameter_collection_handle)
152
+ @collection = Array.new
153
+ if sc_parameter_collection_size > 0
154
+ parameters_size = sc_parameter_collection_size - 1
155
+ for index in 0..parameters_size do
156
+ sc_parameter_handle = RedSnow::Binding.sc_parameter_handle(sc_parameter_collection_handle, index)
157
+ parameter = Parameter.new(sc_parameter_handle)
158
+ @collection << parameter
159
+ end
160
+ end
161
+ end
162
+
163
+ end
164
+
165
+ # HTTP message payload Blueprint AST node
166
+ # base class for 'payload sections'
167
+ #
168
+ # @abstract
169
+ # @attr parameters [Array] ignored
170
+ # @attr headers [Array<Headers>] array of HTTP header fields of the message or nil
171
+ # @attr body [String] HTTP-message body or nil
172
+ # @attr schema [String] HTTP-message body validation schema or nil
173
+ class Payload < NamedBlueprintNode
174
+
175
+ attr_accessor :parameters
176
+ attr_accessor :headers
177
+ attr_accessor :body
178
+ attr_accessor :schema
179
+ # @param sc_payload_handle_resource [FFI::Pointer]
180
+ def initialize(sc_payload_handle_resource)
181
+ @name = RedSnow::Binding.sc_payload_name(sc_payload_handle_resource)
182
+ @description = RedSnow::Binding.sc_payload_description(sc_payload_handle_resource)
183
+ @body = RedSnow::Binding.sc_payload_body(sc_payload_handle_resource)
184
+ @schema = RedSnow::Binding.sc_payload_schema(sc_payload_handle_resource)
185
+
186
+ sc_header_collection_handle_payload = RedSnow::Binding.sc_header_collection_handle_payload(sc_payload_handle_resource)
187
+ @headers = Headers.new(sc_header_collection_handle_payload)
188
+ end
189
+
190
+ end
191
+
192
+ # Transaction example Blueprint AST node
193
+ #
194
+ # @attr requests [Array<Request>] example request payloads
195
+ # @attr response [Array<Response>] example response payloads
196
+ class TransactionExample < NamedBlueprintNode
197
+
198
+ attr_accessor :requests
199
+ attr_accessor :responses
200
+ # @param sc_transaction_example_handle [FFI::Pointer]
201
+ def initialize(sc_transaction_example_handle)
202
+ @name = RedSnow::Binding.sc_transaction_example_name(sc_transaction_example_handle)
203
+ @description = RedSnow::Binding.sc_transaction_example_description(sc_transaction_example_handle)
204
+ # BP Resource Actions Examples Requests
205
+ @requests = Array.new
206
+ sc_payload_collection_handle_requests = RedSnow::Binding.sc_payload_collection_handle_requests(sc_transaction_example_handle)
207
+ sc_payload_collection_size_requests = RedSnow::Binding.sc_payload_collection_size(sc_payload_collection_handle_requests)
208
+ if sc_payload_collection_size_requests > 0
209
+ requests_size = sc_payload_collection_size_requests - 1
210
+ for index in 0..requests_size do
211
+ request = Payload.new(RedSnow::Binding.sc_payload_handle(sc_payload_collection_handle_requests, index))
212
+ @requests << request
213
+ end
214
+ end
215
+ # BP Resource Actions Examples Responses
216
+ @responses = Array.new
217
+ sc_payload_collection_handle_responses = RedSnow::Binding.sc_payload_collection_handle_responses(sc_transaction_example_handle)
218
+ sc_payload_collection_size_responses = RedSnow::Binding.sc_payload_collection_size(sc_payload_collection_handle_responses)
219
+ if sc_payload_collection_size_responses > 0
220
+ responses_size = sc_payload_collection_size_responses - 1
221
+ for index in 0..responses_size do
222
+ response = Payload.new(RedSnow::Binding.sc_payload_handle(sc_payload_collection_handle_responses, index))
223
+ @responses << response
224
+ end
225
+ end
226
+
227
+ end
228
+
229
+ end
230
+
231
+ # Action Blueprint AST node
232
+ # represetns 'action sction'
233
+ #
234
+ # @attr method [String] HTTP request method or nil
235
+ # @attr parameters [Parameters] action-specific URI parameters or nil
236
+ # @attr examples [Array<TransactionExample>] action transaction examples
237
+ class Action < NamedBlueprintNode
238
+
239
+ attr_accessor :method
240
+ attr_accessor :parameters
241
+ attr_accessor :examples
242
+ # @param sc_action_handle [FFI::Pointer]
243
+ def initialize(sc_action_handle)
244
+ @name = RedSnow::Binding.sc_action_name(sc_action_handle)
245
+ @description = RedSnow::Binding.sc_action_description(sc_action_handle)
246
+
247
+ @method = RedSnow::Binding.sc_action_httpmethod(sc_action_handle)
248
+
249
+ @parameters = Parameters.new(RedSnow::Binding.sc_parameter_collection_handle_action(sc_action_handle))
250
+
251
+ @examples = Array.new
252
+ sc_transaction_example_collection_handle = RedSnow::Binding.sc_transaction_example_collection_handle(sc_action_handle)
253
+ sc_transaction_example_collection_size = RedSnow::Binding.sc_transaction_example_collection_size(sc_transaction_example_collection_handle)
254
+ if sc_transaction_example_collection_size > 0
255
+ examples_size = sc_transaction_example_collection_size - 1
256
+ for index in 0..examples_size do
257
+ example = TransactionExample.new(RedSnow::Binding.sc_transaction_example_handle(sc_transaction_example_collection_handle, index))
258
+ @examples << example
259
+ end
260
+ end
261
+ end
262
+
263
+ end
264
+
265
+ # Resource Blueprint AST node
266
+ # represents 'resource section'
267
+ #
268
+ # @attr uri_template [String] RFC 6570 URI template
269
+ # @attr model [Model] model payload for the resource or nil
270
+ # @attr parameters [Parameters] action-specific URI parameters or nil
271
+ # @attr actions [Array<Action>] array of resource actions or nil
272
+ class Resource < NamedBlueprintNode
273
+
274
+ attr_accessor :uri_template
275
+ attr_accessor :model
276
+ attr_accessor :parameters
277
+ attr_accessor :actions
278
+ # @param sc_resource_handle [FFI::Pointer]
279
+ def initialize(sc_resource_handle)
280
+ @name = RedSnow::Binding.sc_resource_name(sc_resource_handle)
281
+ @description = RedSnow::Binding.sc_resource_description(sc_resource_handle)
282
+ @uri_template = RedSnow::Binding.sc_resource_uritemplate(sc_resource_handle)
283
+
284
+ sc_payload_handle_resource = RedSnow::Binding.sc_payload_handle_resource(sc_resource_handle)
285
+ @model = Payload.new(sc_payload_handle_resource)
286
+
287
+ @actions = Array.new
288
+ sc_action_collection_handle = RedSnow::Binding.sc_action_collection_handle(sc_resource_handle)
289
+ sc_action_collection_size = RedSnow::Binding.sc_action_collection_size(sc_action_collection_handle)
290
+ if sc_action_collection_size > 0
291
+ action_size = sc_action_collection_size - 1
292
+ for index in 0..action_size do
293
+ @actions << Action.new(RedSnow::Binding.sc_action_handle(sc_action_collection_handle, index))
294
+ end
295
+ end
296
+ @parameters = Parameters.new(RedSnow::Binding.sc_parameter_collection_handle_resource(sc_resource_handle))
297
+ end
298
+
299
+ end
300
+
301
+ # Resource group Blueprint AST node
302
+ # represents 'resource group section'
303
+ #
304
+ # @attr resources [Array<Resource>] array of resources in the group
305
+ class ResourceGroup < NamedBlueprintNode
306
+
307
+ attr_accessor :resources
308
+ # @param sc_resource_groups_handle [FFI::Pointer]
309
+ def initialize(sc_resource_groups_handle)
310
+ @name = RedSnow::Binding.sc_resource_groups_name(sc_resource_groups_handle)
311
+ @description = RedSnow::Binding.sc_resource_groups_description(sc_resource_groups_handle)
312
+
313
+ @resources = Array.new
314
+ sc_resource_collection_handle = RedSnow::Binding.sc_resource_collection_handle(sc_resource_groups_handle)
315
+ sc_resource_collection_size = RedSnow::Binding.sc_resource_collection_size(sc_resource_collection_handle)
316
+ if sc_resource_collection_size > 0
317
+ resource_size = sc_resource_collection_size - 1
318
+ for index in 0..resource_size do
319
+ sc_resource_handle = RedSnow::Binding.sc_resource_handle(sc_resource_collection_handle, index)
320
+ res = Resource.new(sc_resource_handle)
321
+ end
322
+ end
323
+ @resources << res
324
+ end
325
+
326
+ end
327
+
328
+
329
+ # Top-level Blueprint AST node
330
+ # represents 'blueprint section'
331
+ #
332
+ # @attr metadata [Metadata] tool-specific metadata collection or nil
333
+ # @attr resource_groups [Array<ResourceGroup>] array of blueprint resource groups
334
+ class Blueprint < NamedBlueprintNode
335
+
336
+ attr_accessor :metadata
337
+ attr_accessor :resource_groups
338
+ # Version key
339
+ VERSION_KEY = :_version
340
+ # Supported version of Api Blueprint
341
+ SUPPORTED_VERSIONS = ["2.0"]
342
+ # @param handle [FFI:Pointer]
343
+ def initialize(handle)
344
+ # BP name, desc
345
+ @name = RedSnow::Binding.sc_blueprint_name(handle)
346
+ @description = RedSnow::Binding.sc_blueprint_description(handle)
347
+
348
+ # BP metadata
349
+ sc_metadata_collection_handle = RedSnow::Binding.sc_metadata_collection_handle(handle)
350
+ @metadata = Metadata.new(sc_metadata_collection_handle)
351
+
352
+ # BP Resource Groups
353
+ sc_resource_groups_collection_handle = RedSnow::Binding.sc_resource_groups_collection_handle(handle)
354
+ sc_resource_groups_collection_size = RedSnow::Binding.sc_resource_groups_collection_size(sc_resource_groups_collection_handle)
355
+ @resource_groups = Array.new
356
+ if sc_resource_groups_collection_size > 0
357
+ group_size = sc_resource_groups_collection_size - 1
358
+ for index in 0..group_size do
359
+ sc_resource_groups_handle = RedSnow::Binding.sc_resource_groups_handle(sc_resource_groups_collection_handle, index)
360
+ @resource_groups << ResourceGroup.new(sc_resource_groups_handle)
361
+ end
362
+ end
363
+ end
364
+ end
365
+ end