capn_proto 0.0.1.alpha.3 → 0.0.1.alpha.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -2
- data/README.md +6 -5
- data/Rakefile +15 -0
- data/ext/capn_proto/cxx_compiler.rb +126 -0
- data/ext/capn_proto/dynamic_list_reader.cc +2 -0
- data/ext/capn_proto/dynamic_object_reader.cc +56 -0
- data/ext/capn_proto/dynamic_object_reader.h +22 -0
- data/ext/capn_proto/dynamic_struct_reader.cc +3 -1
- data/ext/capn_proto/dynamic_struct_reader.h +1 -1
- data/ext/capn_proto/dynamic_value_reader.cc +6 -3
- data/ext/capn_proto/extconf.rb +14 -16
- data/ext/capn_proto/init.cc +2 -0
- data/ext/capn_proto/list_nested_node_reader.cc +4 -1
- data/ext/capn_proto/list_nested_node_reader.h +1 -1
- data/ext/capn_proto/parsed_schema.cc +4 -4
- data/ext/capn_proto/parsed_schema.h +1 -1
- data/ext/capn_proto/ruby_capn_proto.h +1 -0
- data/ext/capn_proto/schema_node_reader.cc +5 -2
- data/ext/capn_proto/schema_node_reader.h +1 -1
- data/ext/capn_proto/schema_parser.cc +1 -1
- data/ext/capn_proto/stream_fd_message_reader.cc +1 -1
- data/ext/capn_proto/struct_schema.cc +3 -1
- data/ext/capn_proto/struct_schema.h +1 -1
- data/lib/capn_proto/version.rb +1 -1
- data/lib/capn_proto.rb +21 -24
- metadata +6 -3
data/.travis.yml
CHANGED
@@ -16,5 +16,4 @@ before_install:
|
|
16
16
|
--slave /usr/bin/g++ g++ /usr/bin/g++-4.8
|
17
17
|
--slave /usr/bin/gcov gcov /usr/bin/gcov-4.8
|
18
18
|
- sudo update-alternatives --quiet --set gcc /usr/bin/gcc-4.8
|
19
|
-
-
|
20
|
-
- export CXXFLAGS="-std=c++11"
|
19
|
+
- git clone --depth=1 https://github.com/kentonv/capnproto.git && cd capnproto/c++ && ./setup-autotools.sh && autoreconf -i && ./configure && make -j6 check && sudo make install && sudo ldconfig && cd ../..
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
This here is a [Ruby][ruby] wrapper for the official C++ implementation of [Cap'n Proto][capnp].
|
8
8
|
|
9
|
-
[![Build Status]
|
9
|
+
[![Build Status][travis-badge]][travis-link]
|
10
10
|
|
11
11
|
# Installing
|
12
12
|
|
@@ -16,12 +16,10 @@ First [install libcapnp][libcapnp-install], then install the gem:
|
|
16
16
|
gem install capn_proto --pre
|
17
17
|
```
|
18
18
|
|
19
|
-
|
19
|
+
The native extension for this gem requires a C++ compiler with C++11 features, so use the same C++ compiler and flags that you used to compile libcapnp (e.g. `CXX` and `CXXFLAGS`). As an OSX user, having followed the [instructions for installing libcapnp on OSX][libcapnp-install], the correct incantation is as follows:
|
20
20
|
|
21
21
|
```bash
|
22
|
-
|
23
|
-
export CXXFLAGS="-std=c++11 -stdlib=libc++"
|
24
|
-
gem install capn_proto --pre
|
22
|
+
CXX=$HOME/clang-3.2/bin/clang++ gem install capn_proto --pre
|
25
23
|
```
|
26
24
|
|
27
25
|
# Example
|
@@ -78,3 +76,6 @@ Proper support for [JRuby][jruby] will come after I implement support for Java.
|
|
78
76
|
[jruby]: http://jruby.org/ "JRuby"
|
79
77
|
[libcapnp-install]: http://kentonv.github.io/capnproto/install.html "Installing Cap'n Proto"
|
80
78
|
[mit-license]: http://opensource.org/licenses/MIT "MIT License"
|
79
|
+
|
80
|
+
[travis-link]: https://travis-ci.org/cstrahan/capnp-ruby
|
81
|
+
[travis-badge]: https://travis-ci.org/cstrahan/capnp-ruby.png?branch=master
|
data/Rakefile
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'capn_proto/version'
|
1
2
|
GEMSPEC = eval(File.read('capn_proto.gemspec'))
|
2
3
|
|
3
4
|
require 'rubygems/package_task'
|
@@ -17,9 +18,23 @@ end
|
|
17
18
|
|
18
19
|
task :default => [:compile, :spec]
|
19
20
|
|
21
|
+
Rake::Task["clean"].clear
|
22
|
+
task :clean do
|
23
|
+
rm_r "tmp" rescue nil
|
24
|
+
rm "lib/capn_proto/capn_proto.bundle" rescue nil
|
25
|
+
end
|
26
|
+
|
27
|
+
task :release => [:clean, :compile, :spec, :gem] do
|
28
|
+
tag = "v#{CapnProto::VERSION}"
|
29
|
+
sh "git tag #{tag}"
|
30
|
+
sh "git push origin #{tag}"
|
31
|
+
sh "gem push pkg/capn_proto-#{CapnProto::VERSION}.gem"
|
32
|
+
end
|
33
|
+
|
20
34
|
task :console do
|
21
35
|
$: << File.expand_path("../lib", __FILE__)
|
22
36
|
require 'irb'
|
37
|
+
require 'capn_proto'
|
23
38
|
ARGV.clear
|
24
39
|
IRB.start
|
25
40
|
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
# Discovers support for C++11 features,
|
5
|
+
# and any required CXXFLAGS for such features.
|
6
|
+
class CXXCompiler
|
7
|
+
CXX_COMPILER_FEATURES = <<-CODE
|
8
|
+
template <typename T>
|
9
|
+
struct check
|
10
|
+
{
|
11
|
+
static_assert(sizeof(int) <= sizeof(T), "not big enough");
|
12
|
+
};
|
13
|
+
|
14
|
+
typedef check<check<bool>> right_angle_brackets;
|
15
|
+
|
16
|
+
int a;
|
17
|
+
decltype(a) b;
|
18
|
+
|
19
|
+
typedef check<int> check_type;
|
20
|
+
check_type c;
|
21
|
+
check_type&& cr = static_cast<check_type&&>(c);
|
22
|
+
|
23
|
+
#ifdef __has_include
|
24
|
+
#if __has_include(<type_traits>)
|
25
|
+
#include <type_traits>
|
26
|
+
#endif
|
27
|
+
#endif
|
28
|
+
CODE
|
29
|
+
|
30
|
+
CXX_LIBRARY_FEATURES = <<-CODE
|
31
|
+
#include <initializer_list>
|
32
|
+
#include <unordered_map>
|
33
|
+
#include <atomic>
|
34
|
+
#include <thread>
|
35
|
+
CODE
|
36
|
+
|
37
|
+
# env: The environment variables (e.g. CXX, CXXFLAGS).
|
38
|
+
def initialize(env)
|
39
|
+
@env = env.dup
|
40
|
+
@exist = system("command -v #{@env['CXX'].shellescape} >/dev/null 2>&1")
|
41
|
+
end
|
42
|
+
|
43
|
+
# True if the compiler is accessible on the $PATH.
|
44
|
+
def exist?
|
45
|
+
@exist
|
46
|
+
end
|
47
|
+
|
48
|
+
# True if support for C++11 was detected, false otherwise.
|
49
|
+
def has_cxx11_compiler_support?
|
50
|
+
!!std_flag
|
51
|
+
end
|
52
|
+
|
53
|
+
# True if support for C++11 libraries was detected, false otherwise.
|
54
|
+
def has_cxx11_library_support?
|
55
|
+
!!stdlib_flag
|
56
|
+
end
|
57
|
+
|
58
|
+
# The required std flag (e.g. '-std=c++11'),
|
59
|
+
# empty string if unecessary given the current environment and/or compiler,
|
60
|
+
# or nil in the case where the compiler has no support.
|
61
|
+
def std_flag
|
62
|
+
test_compiler_flags(@env)
|
63
|
+
@std_flag
|
64
|
+
end
|
65
|
+
|
66
|
+
# The required stdlib flag (e.g. '-stdlib=libc++'),
|
67
|
+
# empty string if unecessary given the current environment and/or compiler,
|
68
|
+
# or nil in the case where the compiler has no support.
|
69
|
+
def stdlib_flag
|
70
|
+
test_compiler_flags(@env)
|
71
|
+
@stdlib_flag
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
# Detect any required flags.
|
77
|
+
def test_compiler_flags(env)
|
78
|
+
return if @tested || !exist?
|
79
|
+
@tested = true
|
80
|
+
|
81
|
+
cxxflags = (env['CXXFLAGS'] || '')
|
82
|
+
env = env.dup
|
83
|
+
|
84
|
+
flags = ['', '-std=gnu++11', '-std=gnu++0x', '-std=c++11', '-std=c++0x']
|
85
|
+
@std_flag = flags.detect do |flag|
|
86
|
+
env['CXXFLAGS'] = [cxxflags, flag].join(' ')
|
87
|
+
compile(CXX_COMPILER_FEATURES, env)
|
88
|
+
end
|
89
|
+
|
90
|
+
return unless @std_flag
|
91
|
+
|
92
|
+
env = env.dup
|
93
|
+
flags = ['', '-stdlib=libc++']
|
94
|
+
@stdlib_flag = flags.detect do |flag|
|
95
|
+
env['CXXFLAGS'] = [cxxflags, std_flag, flag].join(' ')
|
96
|
+
compile(CXX_LIBRARY_FEATURES, env)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Compile a snippet of C++, returning true or false to indicate
|
101
|
+
# success.
|
102
|
+
def compile(code, env)
|
103
|
+
Dir.mktmpdir do |dir|
|
104
|
+
Dir.chdir(dir) do
|
105
|
+
File.open("test.cc", "w") {|f| f.write(code)}
|
106
|
+
system("#{env['CXX'].shellescape} #{env['CXXFLAGS']} -c test.cc >/dev/null 2>&1")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
if $0 == __FILE__
|
113
|
+
compiler = CXXCompiler.new(ENV.to_hash)
|
114
|
+
cxx = ENV['CXX']
|
115
|
+
cxxflags = ENV['CXXFLAGS']
|
116
|
+
extra_cxxflags = [compiler.std_flag, compiler.stdlib_flag].join(' ')
|
117
|
+
compiler_support = compiler.has_cxx11_compiler_support? ? 'YES' : 'NO'
|
118
|
+
lib_support = compiler.has_cxx11_library_support? ? 'YES' : 'NO'
|
119
|
+
|
120
|
+
puts " given CXX = #{cxx}"
|
121
|
+
puts " given CXXFLAGS = #{cxxflags}"
|
122
|
+
puts "additional CXXFLAGS = #{extra_cxxflags}"
|
123
|
+
puts ""
|
124
|
+
puts "Has C++11 compiler support? #{compiler_support}"
|
125
|
+
puts "Has C++11 library support? #{lib_support}"
|
126
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#include "ruby_capn_proto.h"
|
2
|
+
#include "dynamic_object_reader.h"
|
3
|
+
#include "dynamic_struct_reader.h"
|
4
|
+
#include "struct_schema.h"
|
5
|
+
#include "class_builder.h"
|
6
|
+
#include "util.h"
|
7
|
+
|
8
|
+
namespace ruby_capn_proto {
|
9
|
+
using WrappedType = capnp::ObjectPointer::Reader;
|
10
|
+
VALUE DynamicObjectReader::Class;
|
11
|
+
|
12
|
+
void DynamicObjectReader::Init() {
|
13
|
+
ClassBuilder("DynamicObjectReader", rb_cObject).
|
14
|
+
defineAlloc(&alloc).
|
15
|
+
defineMethod("as_struct", &as_struct).
|
16
|
+
store(&Class);
|
17
|
+
}
|
18
|
+
|
19
|
+
void DynamicObjectReader::free(WrappedType* p) {
|
20
|
+
p->~Reader();
|
21
|
+
ruby_xfree(p);
|
22
|
+
}
|
23
|
+
|
24
|
+
VALUE DynamicObjectReader::alloc(VALUE klass) {
|
25
|
+
return Data_Wrap_Struct(klass, NULL, free, ruby_xmalloc(sizeof(WrappedType)));
|
26
|
+
}
|
27
|
+
|
28
|
+
WrappedType* DynamicObjectReader::unwrap(VALUE self) {
|
29
|
+
WrappedType* p;
|
30
|
+
Data_Get_Struct(self, WrappedType, p);
|
31
|
+
return p;
|
32
|
+
}
|
33
|
+
|
34
|
+
VALUE DynamicObjectReader::create(WrappedType reader, VALUE parent) {
|
35
|
+
VALUE rb_obj = alloc(Class);
|
36
|
+
WrappedType* wrapped = unwrap(rb_obj);
|
37
|
+
*wrapped = kj::mv(reader);
|
38
|
+
|
39
|
+
rb_iv_set(rb_obj, "parent", parent);
|
40
|
+
|
41
|
+
return rb_obj;
|
42
|
+
}
|
43
|
+
|
44
|
+
VALUE DynamicObjectReader::as_struct(VALUE self, VALUE rb_schema) {
|
45
|
+
if (rb_respond_to(rb_schema, rb_intern("schema"))) {
|
46
|
+
rb_schema = rb_funcall(rb_schema, rb_intern("schema"), 0);
|
47
|
+
}
|
48
|
+
|
49
|
+
auto reader = *unwrap(self);
|
50
|
+
auto schema = *StructSchema::unwrap(rb_schema);
|
51
|
+
|
52
|
+
return DynamicStructReader::create(
|
53
|
+
reader.getAs<capnp::DynamicStruct>(schema),
|
54
|
+
self);
|
55
|
+
}
|
56
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#ifndef DYNAMIC_OBJECT_READER_H
|
2
|
+
#define DYNAMIC_OBJECT_READER_H
|
3
|
+
|
4
|
+
#include "ruby_capn_proto.h"
|
5
|
+
|
6
|
+
namespace ruby_capn_proto {
|
7
|
+
class DynamicObjectReader {
|
8
|
+
public:
|
9
|
+
using WrappedType = capnp::ObjectPointer::Reader;
|
10
|
+
static void Init();
|
11
|
+
static VALUE alloc(VALUE klass);
|
12
|
+
static VALUE create(WrappedType reader, VALUE parent);
|
13
|
+
static void free(WrappedType* p);
|
14
|
+
static WrappedType* unwrap(VALUE self);
|
15
|
+
static VALUE as_struct(VALUE self, VALUE name);
|
16
|
+
|
17
|
+
static VALUE Class;
|
18
|
+
};
|
19
|
+
}
|
20
|
+
|
21
|
+
|
22
|
+
#endif /* DYNAMIC_STRUCT_READER_H */
|
@@ -31,11 +31,13 @@ namespace ruby_capn_proto {
|
|
31
31
|
return p;
|
32
32
|
}
|
33
33
|
|
34
|
-
VALUE DynamicStructReader::create(WrappedType reader) {
|
34
|
+
VALUE DynamicStructReader::create(WrappedType reader, VALUE parent) {
|
35
35
|
VALUE rb_obj = alloc(Class);
|
36
36
|
WrappedType* wrapped = unwrap(rb_obj);
|
37
37
|
*wrapped = kj::mv(reader);
|
38
38
|
|
39
|
+
rb_iv_set(rb_obj, "parent", parent);
|
40
|
+
|
39
41
|
return rb_obj;
|
40
42
|
}
|
41
43
|
|
@@ -9,7 +9,7 @@ namespace ruby_capn_proto {
|
|
9
9
|
using WrappedType = capnp::DynamicStruct::Reader;
|
10
10
|
static void Init();
|
11
11
|
static VALUE alloc(VALUE klass);
|
12
|
-
static VALUE create(WrappedType reader);
|
12
|
+
static VALUE create(WrappedType reader, VALUE parent);
|
13
13
|
static void free(WrappedType* p);
|
14
14
|
static WrappedType* unwrap(VALUE self);
|
15
15
|
static VALUE which(VALUE self);
|
@@ -2,6 +2,7 @@
|
|
2
2
|
#include "dynamic_value_reader.h"
|
3
3
|
#include "dynamic_list_reader.h"
|
4
4
|
#include "dynamic_struct_reader.h"
|
5
|
+
#include "dynamic_object_reader.h"
|
5
6
|
|
6
7
|
namespace ruby_capn_proto {
|
7
8
|
VALUE DynamicValueReader::to_ruby(capnp::DynamicValue::Reader value, VALUE parent) {
|
@@ -10,9 +11,9 @@ namespace ruby_capn_proto {
|
|
10
11
|
case capnp::DynamicValue::BOOL:
|
11
12
|
return value.as<bool>() ? Qtrue : Qfalse;
|
12
13
|
case capnp::DynamicValue::INT:
|
13
|
-
return
|
14
|
+
return INT2NUM(value.as<int64_t>());
|
14
15
|
case capnp::DynamicValue::UINT:
|
15
|
-
return
|
16
|
+
return UINT2NUM(value.as<uint64_t>());
|
16
17
|
case capnp::DynamicValue::FLOAT:
|
17
18
|
return rb_float_new(value.as<double>());
|
18
19
|
case capnp::DynamicValue::TEXT:
|
@@ -28,7 +29,7 @@ namespace ruby_capn_proto {
|
|
28
29
|
case capnp::DynamicValue::LIST:
|
29
30
|
return DynamicListReader::create(value.as<capnp::DynamicList>(), parent);
|
30
31
|
case capnp::DynamicValue::STRUCT:
|
31
|
-
return DynamicStructReader::create(value.as<capnp::DynamicStruct>());
|
32
|
+
return DynamicStructReader::create(value.as<capnp::DynamicStruct>(), parent);
|
32
33
|
case capnp::DynamicValue::ENUM:
|
33
34
|
{
|
34
35
|
auto enumerant_maybe = value.as<capnp::DynamicEnum>().getEnumerant();
|
@@ -39,6 +40,8 @@ namespace ruby_capn_proto {
|
|
39
40
|
return Qnil;
|
40
41
|
}
|
41
42
|
}
|
43
|
+
case capnp::DynamicValue::OBJECT:
|
44
|
+
return DynamicObjectReader::create(value.as<capnp::ObjectPointer>(), parent);
|
42
45
|
case capnp::DynamicValue::VOID:
|
43
46
|
return Qnil;
|
44
47
|
case capnp::DynamicValue::UNKNOWN:
|
data/ext/capn_proto/extconf.rb
CHANGED
@@ -1,4 +1,18 @@
|
|
1
1
|
require 'mkmf'
|
2
|
+
require File.expand_path("../cxx_compiler", __FILE__)
|
3
|
+
|
4
|
+
compiler = CXXCompiler.new({'CXX' => CONFIG['CXX']}.merge(ENV.to_hash))
|
5
|
+
unless compiler.has_cxx11_compiler_support?
|
6
|
+
abort "*** A compiler with support for C++11 language features is required."
|
7
|
+
end
|
8
|
+
unless compiler.has_cxx11_library_support?
|
9
|
+
abort "*** A C++ library with support for C++11 features is required."
|
10
|
+
end
|
11
|
+
|
12
|
+
CONFIG['CXX'] = ENV['CXX'] || CONFIG['CXX']
|
13
|
+
CONFIG['CXXFLAGS'] = [(ENV['CXXFLAGS'] || CONFIG['CXXFLAGS']),
|
14
|
+
compiler.std_flag,
|
15
|
+
compiler.stdlib_flag].join(' ')
|
2
16
|
|
3
17
|
if enable_config('debug')
|
4
18
|
CONFIG['CFLAGS'] += " -O0 -ggdb3"
|
@@ -6,24 +20,8 @@ else
|
|
6
20
|
$CPPFLAGS += " -DNDEBUG"
|
7
21
|
end
|
8
22
|
|
9
|
-
CONFIG['CXX'] = ENV['CXX'] if ENV['CXX']
|
10
|
-
CONFIG['CXXFLAGS'] += " #{ENV['CXXFLAGS']}" if ENV['CXXFLAGS']
|
11
|
-
|
12
23
|
$LDFLAGS += " -lcapnpc"
|
13
24
|
$LDFLAGS += " -lcapnp"
|
14
25
|
$LDFLAGS += " -lkj"
|
15
26
|
|
16
27
|
create_makefile('capn_proto/capn_proto')
|
17
|
-
|
18
|
-
# HACK ATTACK
|
19
|
-
# def inreplace(path, search, replace)
|
20
|
-
# contents = File.read(path)
|
21
|
-
# contents.gsub!(search, replace)
|
22
|
-
# File.open(path, "w") do |f|
|
23
|
-
# f.write(contents)
|
24
|
-
# end
|
25
|
-
# end
|
26
|
-
|
27
|
-
# inreplace("Makefile", "V = 0", "V = 1")
|
28
|
-
# inreplace("Makefile", "-O3", "-O0")
|
29
|
-
# inreplace("Makefile", "ECHO = $(ECHO1:0=@echo)", "ECHO = @echo")
|
data/ext/capn_proto/init.cc
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
#include "dynamic_struct_reader.h"
|
9
9
|
#include "dynamic_list_reader.h"
|
10
10
|
#include "stream_fd_message_reader.h"
|
11
|
+
#include "dynamic_object_reader.h"
|
11
12
|
#include "message_reader.h"
|
12
13
|
#include "field_list.h"
|
13
14
|
|
@@ -30,5 +31,6 @@ extern "C" {
|
|
30
31
|
DynamicListReader::Init();
|
31
32
|
StreamFdMessageReader::Init();
|
32
33
|
FieldList::Init();
|
34
|
+
DynamicObjectReader::Init();
|
33
35
|
}
|
34
36
|
}
|
@@ -31,10 +31,13 @@ namespace ruby_capn_proto {
|
|
31
31
|
return p;
|
32
32
|
}
|
33
33
|
|
34
|
-
VALUE ListNestedNodeReader::create(NodeList schema) {
|
34
|
+
VALUE ListNestedNodeReader::create(NodeList schema, VALUE parent) {
|
35
35
|
VALUE rb_obj = alloc(Class);
|
36
36
|
NodeList* wrapped_schema = unwrap(rb_obj);
|
37
37
|
*wrapped_schema = kj::mv(schema);
|
38
|
+
|
39
|
+
rb_iv_set(rb_obj, "parent", parent);
|
40
|
+
|
38
41
|
return rb_obj;
|
39
42
|
}
|
40
43
|
|
@@ -13,7 +13,7 @@ namespace ruby_capn_proto {
|
|
13
13
|
static VALUE alloc(VALUE klass);
|
14
14
|
static void free(NodeList* p);
|
15
15
|
static NodeList* unwrap(VALUE self);
|
16
|
-
static VALUE create(NodeList reader);
|
16
|
+
static VALUE create(NodeList reader, VALUE parent);
|
17
17
|
static VALUE size(VALUE self);
|
18
18
|
static VALUE get(VALUE self, VALUE index);
|
19
19
|
|
@@ -33,7 +33,7 @@ namespace ruby_capn_proto {
|
|
33
33
|
return p;
|
34
34
|
}
|
35
35
|
|
36
|
-
VALUE ParsedSchema::create(
|
36
|
+
VALUE ParsedSchema::create(WrappedType schema, VALUE parent) {
|
37
37
|
VALUE rb_obj = alloc(Class);
|
38
38
|
WrappedType* wrapped_schema = unwrap(rb_obj);
|
39
39
|
*wrapped_schema = kj::mv(schema);
|
@@ -44,15 +44,15 @@ namespace ruby_capn_proto {
|
|
44
44
|
}
|
45
45
|
|
46
46
|
VALUE ParsedSchema::get_proto(VALUE self) {
|
47
|
-
return SchemaNodeReader::create(unwrap(self)->getProto());
|
47
|
+
return SchemaNodeReader::create(unwrap(self)->getProto(), self);
|
48
48
|
}
|
49
49
|
|
50
50
|
VALUE ParsedSchema::get_nested(VALUE self, VALUE rb_name) {
|
51
51
|
auto name = Util::toString(rb_name);
|
52
|
-
return create(
|
52
|
+
return create(unwrap(self)->getNested(name), self);
|
53
53
|
}
|
54
54
|
|
55
55
|
VALUE ParsedSchema::as_struct(VALUE self) {
|
56
|
-
return StructSchema::create(unwrap(self)->asStruct());
|
56
|
+
return StructSchema::create(unwrap(self)->asStruct(), self);
|
57
57
|
}
|
58
58
|
}
|
@@ -9,7 +9,7 @@ namespace ruby_capn_proto {
|
|
9
9
|
using WrappedType = capnp::ParsedSchema;
|
10
10
|
static void Init();
|
11
11
|
static VALUE alloc(VALUE klass);
|
12
|
-
static VALUE create(
|
12
|
+
static VALUE create(WrappedType schema, VALUE parent);
|
13
13
|
static void free(WrappedType* p);
|
14
14
|
static WrappedType* unwrap(VALUE self);
|
15
15
|
static VALUE get_proto(VALUE self);
|
@@ -19,10 +19,13 @@ namespace ruby_capn_proto {
|
|
19
19
|
return Data_Wrap_Struct(klass, NULL, free, ruby_xmalloc(sizeof(WrappedType)));
|
20
20
|
}
|
21
21
|
|
22
|
-
VALUE SchemaNodeReader::create(WrappedType reader) {
|
22
|
+
VALUE SchemaNodeReader::create(WrappedType reader, VALUE parent) {
|
23
23
|
VALUE rb_obj = alloc(Class);
|
24
24
|
WrappedType* wrapped = unwrap(rb_obj);
|
25
25
|
*wrapped = kj::mv(reader);
|
26
|
+
|
27
|
+
rb_iv_set(rb_obj, "parent", parent);
|
28
|
+
|
26
29
|
return rb_obj;
|
27
30
|
}
|
28
31
|
|
@@ -38,7 +41,7 @@ namespace ruby_capn_proto {
|
|
38
41
|
}
|
39
42
|
|
40
43
|
VALUE SchemaNodeReader::get_nested_nodes(VALUE self) {
|
41
|
-
return ListNestedNodeReader::create(unwrap(self)->getNestedNodes());
|
44
|
+
return ListNestedNodeReader::create(unwrap(self)->getNestedNodes(), self);
|
42
45
|
}
|
43
46
|
|
44
47
|
VALUE SchemaNodeReader::is_struct(VALUE self) {
|
@@ -8,7 +8,7 @@ namespace ruby_capn_proto {
|
|
8
8
|
public:
|
9
9
|
static void Init();
|
10
10
|
static VALUE alloc(VALUE klass);
|
11
|
-
static VALUE create(capnp::schema::Node::Reader reader);
|
11
|
+
static VALUE create(capnp::schema::Node::Reader reader, VALUE parent);
|
12
12
|
static void free(capnp::schema::Node::Reader* p);
|
13
13
|
static capnp::schema::Node::Reader* unwrap(VALUE self);
|
14
14
|
static VALUE get_nested_nodes(VALUE self);
|
@@ -31,11 +31,13 @@ namespace ruby_capn_proto {
|
|
31
31
|
return p;
|
32
32
|
}
|
33
33
|
|
34
|
-
VALUE StructSchema::create(WrappedType schema) {
|
34
|
+
VALUE StructSchema::create(WrappedType schema, VALUE parent) {
|
35
35
|
VALUE rb_obj = alloc(Class);
|
36
36
|
WrappedType* wrapped_schema = unwrap(rb_obj);
|
37
37
|
*wrapped_schema = kj::mv(schema);
|
38
38
|
|
39
|
+
rb_iv_set(rb_obj, "parent", parent);
|
40
|
+
|
39
41
|
return rb_obj;
|
40
42
|
}
|
41
43
|
|
@@ -9,7 +9,7 @@ namespace ruby_capn_proto {
|
|
9
9
|
using WrappedType = capnp::StructSchema;
|
10
10
|
static void Init();
|
11
11
|
static VALUE alloc(VALUE klass);
|
12
|
-
static VALUE create(WrappedType schema);
|
12
|
+
static VALUE create(WrappedType schema, VALUE parent);
|
13
13
|
static void free(WrappedType* p);
|
14
14
|
static WrappedType* unwrap(VALUE self);
|
15
15
|
static VALUE field_names(VALUE self);
|
data/lib/capn_proto/version.rb
CHANGED
data/lib/capn_proto.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'capn_proto/capn_proto'
|
2
|
+
require 'capn_proto/version'
|
2
3
|
|
3
4
|
module CapnProto
|
4
5
|
ListNestedNodeReader.class_eval do
|
5
6
|
include Enumerable
|
6
7
|
def each
|
8
|
+
return to_enum(:each) unless block_given?
|
7
9
|
(0...size).each do |n|
|
8
10
|
yield self[n]
|
9
11
|
end
|
@@ -13,6 +15,7 @@ module CapnProto
|
|
13
15
|
DynamicListReader.class_eval do
|
14
16
|
include Enumerable
|
15
17
|
def each
|
18
|
+
return to_enum(:each) unless block_given?
|
16
19
|
(0...size).each do |n|
|
17
20
|
yield self[n]
|
18
21
|
end
|
@@ -23,12 +26,6 @@ module CapnProto
|
|
23
26
|
def method_missing(name, *args, &block)
|
24
27
|
self[name.to_s, *args, &block]
|
25
28
|
end
|
26
|
-
|
27
|
-
def each
|
28
|
-
(0...size).each do |n|
|
29
|
-
yield self[n]
|
30
|
-
end
|
31
|
-
end
|
32
29
|
end
|
33
30
|
|
34
31
|
module SchemaLoader
|
@@ -41,29 +38,29 @@ module CapnProto
|
|
41
38
|
|
42
39
|
@schema_parser ||= CapnProto::SchemaParser.new
|
43
40
|
|
41
|
+
load_schema_rec = Proc.new do |schema, mod|
|
42
|
+
node = schema.get_proto
|
43
|
+
nested_nodes = node.nested_nodes
|
44
|
+
|
45
|
+
if node.struct?
|
46
|
+
struct_schema = schema.as_struct
|
47
|
+
mod.instance_variable_set(:@schema, struct_schema)
|
48
|
+
mod.extend(Struct)
|
49
|
+
end
|
50
|
+
|
51
|
+
nested_nodes.each do |nested_node|
|
52
|
+
nested_mod = mod.const_set(nested_node.name, Module.new)
|
53
|
+
nested_schema = schema.get_nested(nested_node.name)
|
54
|
+
load_schema_rec.call(nested_schema, nested_mod)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
44
58
|
schema = @schema_parser.parse_disk_file(
|
45
59
|
display_name,
|
46
60
|
file_name,
|
47
61
|
imports);
|
48
62
|
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
def _load_schema_rec(schema, mod)
|
53
|
-
node = schema.get_proto
|
54
|
-
nested_nodes = node.nested_nodes
|
55
|
-
|
56
|
-
if node.struct?
|
57
|
-
struct_schema = schema.as_struct
|
58
|
-
mod.instance_variable_set(:@schema, struct_schema)
|
59
|
-
mod.extend(Struct)
|
60
|
-
end
|
61
|
-
|
62
|
-
nested_nodes.each do |nested_node|
|
63
|
-
nested_mod = mod.const_set(nested_node.name, Module.new)
|
64
|
-
nested_schema = schema.get_nested(nested_node.name)
|
65
|
-
_load_schema_rec(nested_schema, nested_mod)
|
66
|
-
end
|
63
|
+
load_schema_rec.call(schema, self)
|
67
64
|
end
|
68
65
|
|
69
66
|
module Struct
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capn_proto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1.alpha.
|
4
|
+
version: 0.0.1.alpha.4
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-09-
|
12
|
+
date: 2013-09-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -117,8 +117,11 @@ files:
|
|
117
117
|
- ext/capn_proto/.ycm_extra_conf.pyc
|
118
118
|
- ext/capn_proto/class_builder.cc
|
119
119
|
- ext/capn_proto/class_builder.h
|
120
|
+
- ext/capn_proto/cxx_compiler.rb
|
120
121
|
- ext/capn_proto/dynamic_list_reader.cc
|
121
122
|
- ext/capn_proto/dynamic_list_reader.h
|
123
|
+
- ext/capn_proto/dynamic_object_reader.cc
|
124
|
+
- ext/capn_proto/dynamic_object_reader.h
|
122
125
|
- ext/capn_proto/dynamic_struct_reader.cc
|
123
126
|
- ext/capn_proto/dynamic_struct_reader.h
|
124
127
|
- ext/capn_proto/dynamic_value_reader.cc
|
@@ -174,7 +177,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
177
|
version: '0'
|
175
178
|
segments:
|
176
179
|
- 0
|
177
|
-
hash: -
|
180
|
+
hash: -525111796228691179
|
178
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
182
|
none: false
|
180
183
|
requirements:
|