THRIFT-708. rb: Is set checking methods
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@911557 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc
index 47fd8ec..62234f6 100644
--- a/compiler/cpp/src/generate/t_rb_generator.cc
+++ b/compiler/cpp/src/generate/t_rb_generator.cc
@@ -87,8 +87,6 @@
void generate_rb_simple_exception_constructor(std::ofstream& out, t_struct* tstruct);
void generate_field_constants (std::ofstream& out, t_struct* tstruct);
void generate_field_constructors (std::ofstream& out, t_struct* tstruct);
- void generate_struct_accessors (std::ofstream& out, t_struct* tstruct);
- void generate_union_accessors (std::ofstream& out, t_struct* tstruct);
void generate_field_defns (std::ofstream& out, t_struct* tstruct);
void generate_field_data (std::ofstream& out, t_type* field_type, const std::string& field_name, t_const_value* field_value, bool optional);
@@ -502,10 +500,11 @@
}
generate_field_constants(out, tstruct);
- generate_struct_accessors(out, tstruct);
generate_field_defns(out, tstruct);
generate_rb_struct_required_validator(out, tstruct);
-
+
+ indent(out) << "::Thrift::Struct.generate_accessors self" << endl;
+
indent_down();
indent(out) << "end" << endl << endl;
}
@@ -520,14 +519,15 @@
indent_up();
indent(out) << "include ::Thrift::Struct_Union" << endl;
-
+
generate_field_constructors(out, tstruct);
-
+
generate_field_constants(out, tstruct);
- generate_union_accessors(out, tstruct);
generate_field_defns(out, tstruct);
generate_rb_union_validator(out, tstruct);
+ indent(out) << "::Thrift::Union.generate_accessors self" << endl;
+
indent_down();
indent(out) << "end" << endl << endl;
}
@@ -593,32 +593,6 @@
out << endl;
}
-void t_rb_generator::generate_struct_accessors(std::ofstream& out, t_struct* tstruct) {
- const vector<t_field*>& members = tstruct->get_members();
- vector<t_field*>::const_iterator m_iter;
-
- if (members.size() > 0) {
- indent(out) << "::Thrift::Struct.field_accessor self";
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- out << ", :" << (*m_iter)->get_name();
- }
- out << endl;
- }
-}
-
-void t_rb_generator::generate_union_accessors(std::ofstream& out, t_struct* tstruct) {
- const vector<t_field*>& members = tstruct->get_members();
- vector<t_field*>::const_iterator m_iter;
-
- if (members.size() > 0) {
- indent(out) << "field_accessor self";
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- out << ", :" << (*m_iter)->get_name();
- }
- out << endl;
- }
-}
-
void t_rb_generator::generate_field_defns(std::ofstream& out, t_struct* tstruct) {
const vector<t_field*>& fields = tstruct->get_members();
vector<t_field*>::const_iterator f_iter;
diff --git a/lib/rb/Rakefile b/lib/rb/Rakefile
index 5453d58..39334f0 100644
--- a/lib/rb/Rakefile
+++ b/lib/rb/Rakefile
@@ -82,7 +82,7 @@
p.summary = "Ruby libraries for Thrift (a language-agnostic RPC system)"
p.url = "http://incubator.apache.org/thrift/"
p.include_rakefile = true
- p.version = "0.2.2"
+ p.version = "0.2.3"
p.rubygems_version = ">= 1.2.0"
end
diff --git a/lib/rb/lib/thrift/struct.rb b/lib/rb/lib/thrift/struct.rb
index caa9064..48353d3 100644
--- a/lib/rb/lib/thrift/struct.rb
+++ b/lib/rb/lib/thrift/struct.rb
@@ -145,13 +145,25 @@
diffs
end
- def self.field_accessor(klass, *fields)
- fields.each do |field|
- klass.send :attr_reader, field
- klass.send :define_method, "#{field}=" do |value|
- Thrift.check_type(value, klass::FIELDS.values.find { |f| f[:name].to_s == field.to_s }, field) if Thrift.type_checking
- instance_variable_set("@#{field}", value)
- end
+ def self.field_accessor(klass, field_info)
+ field_name_sym = field_info[:name].to_sym
+ klass.send :attr_reader, field_name_sym
+ klass.send :define_method, "#{field_info[:name]}=" do |value|
+ Thrift.check_type(value, field_info, field_info[:name]) if Thrift.type_checking
+ instance_variable_set("@#{field_name_sym}", value)
+ end
+ end
+
+ def self.generate_accessors(klass)
+ klass::FIELDS.values.each do |field_info|
+ field_accessor(klass, field_info)
+ qmark_isset_method(klass, field_info)
+ end
+ end
+
+ def self.qmark_isset_method(klass, field_info)
+ klass.send :define_method, "#{field_info[:name]}?" do
+ !self.send(field_info[:name].to_sym).nil?
end
end
diff --git a/lib/rb/lib/thrift/union.rb b/lib/rb/lib/thrift/union.rb
index 4db820e..640e78b 100644
--- a/lib/rb/lib/thrift/union.rb
+++ b/lib/rb/lib/thrift/union.rb
@@ -90,21 +90,32 @@
[self.class.name, @setfield, @value].hash
end
- def self.field_accessor(klass, *fields)
- fields.each do |field|
- klass.send :define_method, "#{field}" do
- if field == @setfield
- @value
- else
- raise RuntimeError, "#{field} is not union's set field."
- end
+ def self.field_accessor(klass, field_info)
+ klass.send :define_method, field_info[:name] do
+ if field_info[:name].to_sym == @setfield
+ @value
+ else
+ raise RuntimeError, "#{field_info[:name]} is not union's set field."
end
+ end
- klass.send :define_method, "#{field}=" do |value|
- Thrift.check_type(value, klass::FIELDS.values.find {|f| f[:name].to_s == field.to_s }, field) if Thrift.type_checking
- @setfield = field
- @value = value
- end
+ klass.send :define_method, "#{field_info[:name]}=" do |value|
+ Thrift.check_type(value, field_info, field_info[:name]) if Thrift.type_checking
+ @setfield = field_info[:name].to_sym
+ @value = value
+ end
+ end
+
+ def self.qmark_isset_method(klass, field_info)
+ klass.send :define_method, "#{field_info[:name]}?" do
+ get_set_field == field_info[:name].to_sym && !get_value.nil?
+ end
+ end
+
+ def self.generate_accessors(klass)
+ klass::FIELDS.values.each do |field_info|
+ field_accessor(klass, field_info)
+ qmark_isset_method(klass, field_info)
end
end
diff --git a/lib/rb/spec/ThriftSpec.thrift b/lib/rb/spec/ThriftSpec.thrift
index 84111c1..b497a60 100644
--- a/lib/rb/spec/ThriftSpec.thrift
+++ b/lib/rb/spec/ThriftSpec.thrift
@@ -69,6 +69,7 @@
5: map<i32, map<string, double>> complex,
6: set<i16> shorts = [5, 17, 239],
7: optional string opt_string
+ 8: bool my_bool
}
struct BoolStruct {
diff --git a/lib/rb/spec/struct_spec.rb b/lib/rb/spec/struct_spec.rb
index 045b963..4b46284 100644
--- a/lib/rb/spec/struct_spec.rb
+++ b/lib/rb/spec/struct_spec.rb
@@ -68,6 +68,13 @@
StructWithEnumMap.new(:my_map => {SomeEnum::ONE => [SomeEnum::TWO]}).inspect.should == "<SpecNamespace::StructWithEnumMap my_map:{ONE (0): [TWO (1)]}>"
end
+ it "should offer field? methods" do
+ Foo.new.opt_string?.should be_false
+ Foo.new(:simple => 52).simple?.should be_true
+ Foo.new(:my_bool => false).my_bool?.should be_true
+ Foo.new(:my_bool => true).my_bool?.should be_true
+ end
+
it "should read itself off the wire" do
struct = Foo.new
prot = BaseProtocol.new(mock("transport"))
diff --git a/lib/rb/spec/union_spec.rb b/lib/rb/spec/union_spec.rb
index f39d033..f563b0b 100644
--- a/lib/rb/spec/union_spec.rb
+++ b/lib/rb/spec/union_spec.rb
@@ -153,5 +153,12 @@
My_union.new(:my_map => {SomeEnum::ONE => [SomeEnum::TWO]}).inspect.should == "<SpecNamespace::My_union my_map: {ONE (0): [TWO (1)]}>"
end
+
+ it "should offer field? methods" do
+ My_union.new.some_enum?.should be_false
+ My_union.new(:some_enum => SomeEnum::ONE).some_enum?.should be_true
+ My_union.new(:im_true => false).im_true?.should be_true
+ My_union.new(:im_true => true).im_true?.should be_true
+ end
end
end