Author: kkaempf Date: Fri Dec 21 11:06:50 2007 New Revision: 8132 URL: http://svn.opensuse.org/viewcvs/zypp?rev=8132&view=rev Log: extend bindings further by adding - Solvable with name, evr, arch, vendor and dependencies (-> Dependency) - Dependency a collection of Relation(s) - Relation with name, op, evr Added: trunk/sat-solver/bindings/ruby/tests/solvable.rb Modified: trunk/sat-solver/bindings/satsolver.i Added: trunk/sat-solver/bindings/ruby/tests/solvable.rb URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/ruby/tests/solvable.rb?rev=8132&view=auto ============================================================================== --- trunk/sat-solver/bindings/ruby/tests/solvable.rb (added) +++ trunk/sat-solver/bindings/ruby/tests/solvable.rb Fri Dec 21 11:06:50 2007 @@ -0,0 +1,46 @@ +$: << "../../../build/bindings/ruby" +# test Solvable +require 'test/unit' +require 'SatSolver' + +def show_dep name, deps + return unless deps + puts "#{deps.size} #{name}: " + i = 0 + while (i < deps.size) + d = deps[i] + puts "#{d.name} : #{d}" + i += 1 + end +# does not work yet +# deps.each { |d| puts d } +end + +class SolvableTest < Test::Unit::TestCase + def setup + @pool = SatSolver::Pool.new + assert @pool + @repo = SatSolver::Repo.new( @pool, "test" ) + assert @repo + @pool.arch = "i686" + @repo.add_solv( "../../../testsuite/data.libzypp/basic-exercises/exercise-1-packages.solv" ) + assert @repo.size > 0 + end + def test_solvable + solv = @repo[0] + assert solv + puts solv + puts "#{solv.id}: #{solv.name}-#{solv.evr}.#{solv.arch}[#{solv.vendor}]" + solv = @pool.id2solvable solv.id + puts "#{solv.id}: #{solv.name}-#{solv.evr}.#{solv.arch}[#{solv.vendor}]" + end + def test_deps + @repo.each_solvable{ |s| + puts s + show_dep "Provides", s.provides + show_dep "Requires", s.requires + show_dep "Obsoletes", s.obsoletes + show_dep "Conflicts", s.conflicts + } + end +end Modified: trunk/sat-solver/bindings/satsolver.i URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/satsolver.i?rev=8132&r1=8131&r2=8132&view=diff ============================================================================== --- trunk/sat-solver/bindings/satsolver.i (original) +++ trunk/sat-solver/bindings/satsolver.i Fri Dec 21 11:06:50 2007 @@ -21,6 +21,35 @@ /*#include <sstream> */ + +typedef struct _Relation { + Offset id; + Pool *pool; +} Relation; +static Relation *relation_new( Id id, Pool *pool ) +{ + if (!id) return NULL; + Relation *relation = (Relation *)malloc( sizeof( Relation )); + relation->id = id; + relation->pool = pool; + return relation; +} + +/* Collection of Relations -> Dependency */ +typedef struct _Dependency { + Offset relation; /* offset into repo->idarraydata */ + Solvable *solvable; /* solvable this dep belongs to */ +} Dependency; + +static Dependency *dependency_new( Offset relation, Solvable *solvable ) +{ + if (!relation) return NULL; + Dependency *dependency = (Dependency *)malloc( sizeof( Dependency )); + dependency->relation = relation; + dependency->solvable = solvable; + return dependency; +} + %} /*-------------------------------------------------------------*/ @@ -36,22 +65,26 @@ $1 = GetReadFile(fptr); } -%typemap(in) Id { - $1 = (int) NUM2INT($input); -} - -%typemap(in) Offset { - $1 = (unsigned int) NUM2INT($input); -} #endif +typedef int Id; +typedef unsigned int Offset; + %nodefault _Repo; %rename(Repo) _Repo; typedef struct _Repo {} Repo; %nodefault _Solvable; %rename(Solvable) _Solvable; -struct _Solvable {}; +typedef struct _Solvable {} Solvable; + +%nodefault _Relation; +%rename(Relation) _Relation; +typedef struct _Relation {} Relation; + +%nodefault _Dependency; +%rename(Dependency) _Dependency; +typedef struct _Dependency {} Dependency; /*-------------------------------------------------------------*/ /* Pool */ @@ -113,10 +146,10 @@ int installable( Solvable *s ) { return pool_installable( $self,s ); } + /* without the %rename, swig converts it to id_2solvable. Ouch! */ + %rename( "id2solvable" ) id2solvable( Id p ); Solvable *id2solvable(Id p) - { - return pool_id2solvable($self, p); - } + { return pool_id2solvable( $self, p ); } void each_solvable() { @@ -131,7 +164,7 @@ } Solvable * - select_solvable(Repo *repo, char *name) + select_solvable( char *name, Repo *repo = NULL ) { Id id; Queue plist; @@ -195,15 +228,91 @@ { return $self->priority; } Pool *pool() { return $self->pool; } + + void each_solvable() + { + Solvable *s; + Id p; + for (p = 0, s = $self->pool->solvables + $self->start; p < $self->nsolvables; p++, s++) + { + if (!s->name) + continue; + rb_yield( SWIG_NewPointerObj((void*) s, SWIGTYPE_p__Solvable, 0) ); + } + } +#if defined(SWIGRUBY) + /* %rename is rejected by swig for [] */ + %alias get_solvable "[]"; +#endif + Solvable *get_solvable( int i ) + { + if (i < 0) return NULL; + if (i >= $self->nsolvables) return NULL; + return pool_id2solvable( $self->pool, $self->start + i ); + } } -#if 0 +/*-------------------------------------------------------------*/ +/* Relation */ +%extend Relation { + Relation( Id id, Pool *pool) + { return relation_new( id, pool ); } + ~Relation() + { free( $self ); } + %rename("to_s") asString(); + const char *asString() + { + return dep2str( $self->pool, $self->id ); + } + const char *name() + { return id2str( $self->pool, $self->id ); } +} /*-------------------------------------------------------------*/ -/* Solvable */ +/* Dependency */ -%include "solvable.h" +%extend Dependency { + Dependency( Offset offset, Solvable *solvable ) + { return dependency_new( offset, solvable ); } + ~Dependency() + { free( $self ); } + int size() + { + int i = 0; + if ($self->relation) { + Id *ids = $self->solvable->repo->idarraydata + $self->relation; + while (*ids++) + ++i; + } + return i; + } + void each() + { + if ($self->relation) { + Id *ids = $self->solvable->repo->idarraydata + $self->relation; + while (*ids) { + rb_yield( SWIG_NewPointerObj((void*) *ids, SWIGTYPE_p__Relation, 0) ); + ++ids; + } + } + } +#if defined(SWIGRUBY) + /* %rename is rejected by swig for [] */ + %alias get_relation "[]"; +#endif + Relation *get_relation( unsigned int i ) + { + if (!$self->relation) + return NULL; + /* FIXME: check overflow */ + Id *ids = $self->solvable->repo->idarraydata + $self->relation + i; + return relation_new( *ids, $self->solvable->repo->pool ); + } +} + +/*-------------------------------------------------------------*/ +/* Solvable */ %extend Solvable { @@ -213,40 +322,56 @@ return $self - $self->repo->pool->solvables; } - //%typemap(ruby,in) Id { - // $1 = id2str($self->pool, $input); - //} - - //%typemap(ruby,out) Id { - // $result = rb_str_new2(str2id($self->pool,$1)); - //} - - //%rename(name_id) name(); - %ignore name; const char * name() - { return id2str($self->repo->pool, $self->name);} - %ignore arch; + { return id2str( $self->repo->pool, $self->name ); } + Id name_id() + { return $self->name; } const char * arch() - { return id2str($self->repo->pool, $self->arch);} - %ignore evr; + { return id2str( $self->repo->pool, $self->arch ); } + Id arch_id() + { return $self->arch; } const char * evr() - { return id2str($self->repo->pool, $self->evr);} - %ignore vendor; + { return id2str( $self->repo->pool, $self->evr ); } + Id evr_id() + { return $self->evr; } const char * vendor() - { return id2str($self->repo->pool, $self->vendor);} + { return id2str( $self->repo->pool, $self->vendor ); } + Id vendor_id() + { return $self->vendor; } %rename("to_s") asString(); const char * asString() { if ( !$self->repo ) return "<UNKNOWN>"; - return solvable2str($self->repo->pool, $self); + return solvable2str( $self->repo->pool, $self ); } + /* + * Dependencies + */ + Dependency *provides() + { return dependency_new( $self->provides, $self ); } + Dependency *requires() + { return dependency_new( $self->requires, $self ); } + Dependency *conflicts() + { return dependency_new( $self->conflicts, $self ); } + Dependency *obsoletes() + { return dependency_new( $self->obsoletes, $self ); } + Dependency *recommends() + { return dependency_new( $self->recommends, $self ); } + Dependency *suggests() + { return dependency_new( $self->suggests, $self ); } + Dependency *supplements() + { return dependency_new( $self->supplements, $self ); } + Dependency *enhances() + { return dependency_new( $self->enhances, $self ); } } /*-------------------------------------------------------------*/ +#if 0 + %include "poolid.h" %include "pooltypes.h" -- To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org For additional commands, e-mail: zypp-commit+help@opensuse.org