You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2016/07/22 12:28:50 UTC

[6/9] lucy-clownfish git commit: Add major version to .cfp

Add major version to .cfp


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/ac45960e
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/ac45960e
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/ac45960e

Branch: refs/heads/master
Commit: ac45960e2d3827cef51476bf7c1ee78f9a61dbe1
Parents: 5db69da
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Fri Jul 15 20:16:23 2016 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sat Jul 16 16:10:30 2016 +0200

----------------------------------------------------------------------
 compiler/perl/lib/Clownfish/CFC.pm | 13 ++++++----
 compiler/perl/lib/Clownfish/CFC.xs |  6 +++--
 compiler/src/CFCParcel.c           | 45 +++++++++++++++++++++++++--------
 compiler/src/CFCParcel.h           |  9 +++++--
 compiler/src/CFCParseHeader.y      |  2 +-
 compiler/src/CFCTestDocuComment.c  |  2 +-
 compiler/src/CFCTestParcel.c       | 33 +++++++++++++++++-------
 compiler/src/CFCTestParser.c       |  2 +-
 compiler/src/CFCTestSymbol.c       |  4 +--
 compiler/src/CFCTestType.c         | 13 +++++-----
 10 files changed, 90 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/perl/lib/Clownfish/CFC.pm
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.pm b/compiler/perl/lib/Clownfish/CFC.pm
index 88b687d..c38c3c3 100644
--- a/compiler/perl/lib/Clownfish/CFC.pm
+++ b/compiler/perl/lib/Clownfish/CFC.pm
@@ -329,17 +329,20 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.5.0' ) }
     use Carp;
 
     our %new_PARAMS = (
-        name      => undef,
-        nickname  => undef,
-        version   => undef,
-        file_spec => undef,
+        name          => undef,
+        nickname      => undef,
+        version       => undef,
+        major_version => undef,
+        file_spec     => undef,
     );
 
     sub new {
         my ( $either, %args ) = @_;
         verify_args( \%new_PARAMS, %args ) or confess $@;
         confess "no subclassing allowed" unless $either eq __PACKAGE__;
-        return _new( @args{qw( name nickname version file_spec )} );
+        return _new( @args{qw(
+            name nickname version major_version file_spec
+        )} );
     }
 
     our %new_from_json_PARAMS = (

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.xs b/compiler/perl/lib/Clownfish/CFC.xs
index 26b997a..4827fab 100644
--- a/compiler/perl/lib/Clownfish/CFC.xs
+++ b/compiler/perl/lib/Clownfish/CFC.xs
@@ -1065,15 +1065,17 @@ PPCODE:
 MODULE = Clownfish::CFC   PACKAGE = Clownfish::CFC::Model::Parcel
 
 SV*
-_new(name_sv, nickname_sv, version, file_spec)
+_new(name_sv, nickname_sv, version, major_version, file_spec)
     SV *name_sv;
     SV *nickname_sv;
     CFCVersion *version;
+    CFCVersion *major_version;
     CFCFileSpec *file_spec;
 CODE:
     const char *name     = SvOK(name_sv)  ? SvPV_nolen(name_sv)  : NULL;
     const char *nickname = SvOK(nickname_sv) ? SvPV_nolen(nickname_sv) : NULL;
-    CFCParcel *self = CFCParcel_new(name, nickname, version, file_spec);
+    CFCParcel *self = CFCParcel_new(name, nickname, version, major_version,
+                                    file_spec);
     RETVAL = S_cfcbase_to_perlref(self);
     CFCBase_decref((CFCBase*)self);
 OUTPUT: RETVAL

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/src/CFCParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.c b/compiler/src/CFCParcel.c
index 525a510..b7f93d5 100644
--- a/compiler/src/CFCParcel.c
+++ b/compiler/src/CFCParcel.c
@@ -35,6 +35,7 @@ struct CFCParcel {
     char *name;
     char *nickname;
     CFCVersion *version;
+    CFCVersion *major_version;
     CFCFileSpec *file_spec;
     char *prefix;
     char *Prefix;
@@ -128,14 +129,16 @@ static const CFCMeta CFCPARCEL_META = {
 
 CFCParcel*
 CFCParcel_new(const char *name, const char *nickname, CFCVersion *version,
-              CFCFileSpec *file_spec) {
+              CFCVersion *major_version, CFCFileSpec *file_spec) {
     CFCParcel *self = (CFCParcel*)CFCBase_allocate(&CFCPARCEL_META);
-    return CFCParcel_init(self, name, nickname, version, file_spec);
+    return CFCParcel_init(self, name, nickname, version, major_version,
+                          file_spec);
 }
 
 CFCParcel*
 CFCParcel_init(CFCParcel *self, const char *name, const char *nickname,
-               CFCVersion *version, CFCFileSpec *file_spec) {
+               CFCVersion *version, CFCVersion *major_version,
+               CFCFileSpec *file_spec) {
     // Validate name.
     if (!name || !S_validate_name_or_nickname(name)) {
         CFCUtil_die("Invalid name: '%s'", name ? name : "[NULL]");
@@ -161,6 +164,13 @@ CFCParcel_init(CFCParcel *self, const char *name, const char *nickname,
     else {
         self->version = CFCVersion_new("v0");
     }
+    if (major_version) {
+        self->major_version
+            = (CFCVersion*)CFCBase_incref((CFCBase*)major_version);
+    }
+    else {
+        self->major_version = CFCVersion_new("v0");
+    }
 
     // Set file_spec.
     self->file_spec = (CFCFileSpec*)CFCBase_incref((CFCBase*)file_spec);
@@ -222,12 +232,13 @@ S_new_from_json(const char *json, CFCFileSpec *file_spec) {
     if (CFCJson_get_type(parsed) != CFCJSON_HASH) {
         CFCUtil_die("Parcel definition must be a hash in '%s'", path);
     }
-    const char  *name      = NULL;
-    const char  *nickname  = NULL;
-    int          installed = true;
-    CFCVersion  *version   = NULL;
-    CFCJson     *prereqs   = NULL;
-    CFCJson    **children  = CFCJson_get_children(parsed);
+    const char  *name          = NULL;
+    const char  *nickname      = NULL;
+    int          installed     = true;
+    CFCVersion  *version       = NULL;
+    CFCVersion  *major_version = NULL;
+    CFCJson     *prereqs       = NULL;
+    CFCJson    **children      = CFCJson_get_children(parsed);
     for (size_t i = 0; children[i]; i += 2) {
         const char *key = CFCJson_get_string(children[i]);
         CFCJson *value = children[i + 1];
@@ -259,6 +270,13 @@ S_new_from_json(const char *json, CFCFileSpec *file_spec) {
             }
             version = CFCVersion_new(CFCJson_get_string(value));
         }
+        else if (strcmp(key, "major_version") == 0) {
+            if (value_type != CFCJSON_STRING) {
+                CFCUtil_die("'major_version' must be a string (filepath %s)",
+                            path);
+            }
+            major_version = CFCVersion_new(CFCJson_get_string(value));
+        }
         else if (strcmp(key, "prerequisites") == 0) {
             if (value_type != CFCJSON_HASH) {
                 CFCUtil_die("'prerequisites' must be a hash (filepath %s)",
@@ -277,7 +295,8 @@ S_new_from_json(const char *json, CFCFileSpec *file_spec) {
     if (!version) {
         CFCUtil_die("Missing required key 'version' (filepath '%s')", path);
     }
-    CFCParcel *self = CFCParcel_new(name, nickname, version, file_spec);
+    CFCParcel *self = CFCParcel_new(name, nickname, version, major_version,
+                                    file_spec);
     self->is_installed = installed;
     if (prereqs) {
         S_set_prereqs(self, prereqs, path);
@@ -340,6 +359,7 @@ CFCParcel_destroy(CFCParcel *self) {
     FREEMEM(self->name);
     FREEMEM(self->nickname);
     CFCBase_decref((CFCBase*)self->version);
+    CFCBase_decref((CFCBase*)self->major_version);
     CFCBase_decref((CFCBase*)self->file_spec);
     FREEMEM(self->prefix);
     FREEMEM(self->Prefix);
@@ -387,6 +407,11 @@ CFCParcel_get_version(CFCParcel *self) {
     return self->version;
 }
 
+CFCVersion*
+CFCParcel_get_major_version(CFCParcel *self) {
+    return self->major_version;
+}
+
 const char*
 CFCParcel_get_prefix(CFCParcel *self) {
     return self->prefix;

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/src/CFCParcel.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.h b/compiler/src/CFCParcel.h
index 2a15666..47dc445 100644
--- a/compiler/src/CFCParcel.h
+++ b/compiler/src/CFCParcel.h
@@ -64,7 +64,8 @@ CFCParcel_reap_singletons(void);
 
 CFCParcel*
 CFCParcel_new(const char *name, const char *nickname,
-              struct CFCVersion *version, struct CFCFileSpec *file_spec);
+              struct CFCVersion *version, struct CFCVersion *major_version,
+              struct CFCFileSpec *file_spec);
 
 CFCParcel*
 CFCParcel_new_from_file(struct CFCFileSpec *file_spec);
@@ -74,7 +75,8 @@ CFCParcel_new_from_json(const char *json, struct CFCFileSpec *file_spec);
 
 CFCParcel*
 CFCParcel_init(CFCParcel *self, const char *name, const char *nickname,
-               struct CFCVersion *version, struct CFCFileSpec *file_spec);
+               struct CFCVersion *version, struct CFCVersion *major_version,
+               struct CFCFileSpec *file_spec);
 
 void
 CFCParcel_destroy(CFCParcel *self);
@@ -94,6 +96,9 @@ CFCParcel_is_installed(CFCParcel *self);
 struct CFCVersion*
 CFCParcel_get_version(CFCParcel *self);
 
+struct CFCVersion*
+CFCParcel_get_major_version(CFCParcel *self);
+
 /** Return the all-lowercase version of the Parcel's prefix.
  */
 const char*

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/src/CFCParseHeader.y
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParseHeader.y b/compiler/src/CFCParseHeader.y
index 2b760f0..edbd9d4 100644
--- a/compiler/src/CFCParseHeader.y
+++ b/compiler/src/CFCParseHeader.y
@@ -325,7 +325,7 @@ parcel_definition(A) ::= PARCEL qualified_id(B) SEMICOLON.
     A = CFCParcel_fetch(B);
     if (!A) {
         /* Allow unregistered parcels to simplify tests. */
-        A = CFCParcel_new(B, NULL, NULL, NULL);
+        A = CFCParcel_new(B, NULL, NULL, NULL, NULL);
         CFCParcel_register(A);
     }
     else {

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/src/CFCTestDocuComment.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestDocuComment.c b/compiler/src/CFCTestDocuComment.c
index cbad3f4..d08568a 100644
--- a/compiler/src/CFCTestDocuComment.c
+++ b/compiler/src/CFCTestDocuComment.c
@@ -134,7 +134,7 @@ S_test_md_to_pod(CFCTest *test) {
 static void
 S_test_generator(CFCTest *test) {
     CFCHierarchy *hierarchy = CFCHierarchy_new("autogen");
-    CFCParcel *parcel = CFCParcel_new("Neato", NULL, NULL, NULL);
+    CFCParcel *parcel = CFCParcel_new("Neato", NULL, NULL, NULL, NULL);
     CFCParcel_register(parcel);
 
     CFCDocuComment *docu = CFCDocuComment_parse(

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/src/CFCTestParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestParcel.c b/compiler/src/CFCTestParcel.c
index c71f14b..8103351 100644
--- a/compiler/src/CFCTestParcel.c
+++ b/compiler/src/CFCTestParcel.c
@@ -46,7 +46,7 @@ S_run_extended_tests(CFCTest *test);
 
 const CFCTestBatch CFCTEST_BATCH_PARCEL = {
     "Clownfish::CFC::Model::Parcel",
-    37,
+    44,
     S_run_tests
 };
 
@@ -84,13 +84,22 @@ S_run_prereq_tests(CFCTest *test) {
 
 static void
 S_run_basic_tests(CFCTest *test) {
-    CFCParcel *foo = CFCParcel_new("Foo", NULL, NULL, NULL);
+    CFCVersion *version = CFCVersion_new("v32.10.102");
+    CFCVersion *major   = CFCVersion_new("v32.0.0");
+    CFCParcel *foo = CFCParcel_new("Foo", "FooNick", version, major, NULL);
     OK(test, foo != NULL, "new");
+    STR_EQ(test, CFCParcel_get_name(foo), "Foo", "get_name");
+    STR_EQ(test, CFCParcel_get_nickname(foo), "FooNick", "get_nickname");
+    STR_EQ(test, CFCVersion_get_vstring(CFCParcel_get_version(foo)),
+           "v32.10.102", "get_version");
+    STR_EQ(test, CFCVersion_get_vstring(CFCParcel_get_major_version(foo)),
+           "v32.0.0", "get_major_version");
     OK(test, !CFCParcel_included(foo), "not included");
+    OK(test, !CFCParcel_is_installed(foo), "not installed");
     CFCParcel_register(foo);
 
     {
-        CFCParcel *same_name = CFCParcel_new("Foo", NULL, NULL, NULL);
+        CFCParcel *same_name = CFCParcel_new("Foo", NULL, NULL, NULL, NULL);
         char      *error;
 
         CFCUTIL_TRY {
@@ -106,7 +115,7 @@ S_run_basic_tests(CFCTest *test) {
 
     {
         CFCParcel *same_nick
-            = CFCParcel_new("OtherFoo", "Foo", NULL, NULL);
+            = CFCParcel_new("OtherFoo", "FooNick", NULL, NULL, NULL);
         char *error;
 
         CFCUTIL_TRY {
@@ -122,10 +131,15 @@ S_run_basic_tests(CFCTest *test) {
 
     CFCFileSpec *file_spec = CFCFileSpec_new(".", "Parcel", ".cfp", true);
     CFCParcel *included_foo
-        = CFCParcel_new("IncludedFoo", NULL, NULL, file_spec);
+        = CFCParcel_new("IncludedFoo", NULL, NULL, NULL, file_spec);
     OK(test, CFCParcel_included(included_foo), "included");
     STR_EQ(test, CFCParcel_get_cfp_path(included_foo),
            "." CHY_DIR_SEP "Parcel.cfp", "get_cfp_path");
+    STR_EQ(test, CFCVersion_get_vstring(CFCParcel_get_version(included_foo)),
+           "v0", "version defaults to v0");
+    STR_EQ(test,
+           CFCVersion_get_vstring(CFCParcel_get_major_version(included_foo)),
+           "v0", "major_version defaults to v0");
     CFCParcel_register(included_foo);
 
     {
@@ -179,7 +193,8 @@ S_run_extended_tests(CFCTest *test) {
     }
 
     {
-        CFCParcel *parcel = CFCParcel_new("Crustacean", "Crust", NULL, NULL);
+        CFCParcel *parcel = CFCParcel_new("Crustacean", "Crust", NULL, NULL,
+                                          NULL);
         CFCParcel_register(parcel);
         STR_EQ(test, CFCVersion_get_vstring(CFCParcel_get_version(parcel)),
                "v0", "get_version");
@@ -230,14 +245,14 @@ S_run_extended_tests(CFCTest *test) {
 
     {
         CFCFileSpec *foo_file_spec = CFCFileSpec_new(".", "Foo", ".cfp", true);
-        CFCParcel *foo = CFCParcel_new("Foo", NULL, NULL, foo_file_spec);
+        CFCParcel *foo = CFCParcel_new("Foo", NULL, NULL, NULL, foo_file_spec);
         CFCParcel_register(foo);
 
         CFCVersion *cfish_version = CFCVersion_new("v0.8.7");
         CFCFileSpec *cfish_file_spec
             = CFCFileSpec_new(".", "Clownfish", ".cfp", true);
-        CFCParcel *cfish
-            = CFCParcel_new("Clownfish", NULL, cfish_version, cfish_file_spec);
+        CFCParcel *cfish = CFCParcel_new("Clownfish", NULL, cfish_version,
+                                         NULL, cfish_file_spec);
         CFCParcel_register(cfish);
 
         const char *crust_json =

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/src/CFCTestParser.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestParser.c b/compiler/src/CFCTestParser.c
index 057d5d9..304c8d7 100644
--- a/compiler/src/CFCTestParser.c
+++ b/compiler/src/CFCTestParser.c
@@ -55,7 +55,7 @@ S_run_tests(CFCTest *test) {
         CFCParcel *fish = CFCTest_parse_parcel(test, parser, "parcel Fish;");
 
         CFCParcel *registered
-            = CFCParcel_new("Crustacean", "Crust", NULL, NULL);
+            = CFCParcel_new("Crustacean", "Crust", NULL, NULL, NULL);
         CFCParcel_register(registered);
         CFCParcel *parcel
             = CFCTest_parse_parcel(test, parser, "parcel Crustacean;");

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/src/CFCTestSymbol.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestSymbol.c b/compiler/src/CFCTestSymbol.c
index e177d50..e21f847 100644
--- a/compiler/src/CFCTestSymbol.c
+++ b/compiler/src/CFCTestSymbol.c
@@ -54,7 +54,7 @@ S_try_new_symbol(const char *name) {
 
 static void
 S_run_tests(CFCTest *test) {
-    CFCParcel *parcel = CFCParcel_new("Parcel", NULL, NULL, NULL);
+    CFCParcel *parcel = CFCParcel_new("Parcel", NULL, NULL, NULL, NULL);
 
     {
         static const char *exposures[4] = {
@@ -112,7 +112,7 @@ S_run_tests(CFCTest *test) {
     }
 
     {
-        CFCParcel *eep_parcel = CFCParcel_new("Eep", NULL, NULL, NULL);
+        CFCParcel *eep_parcel = CFCParcel_new("Eep", NULL, NULL, NULL, NULL);
         CFCParcel_register(eep_parcel);
         CFCClass *ork
             = CFCClass_create(eep_parcel, NULL, "Op::Ork", NULL, NULL, NULL,

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ac45960e/compiler/src/CFCTestType.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestType.c b/compiler/src/CFCTestType.c
index ea61fa0..ba1799b 100644
--- a/compiler/src/CFCTestType.c
+++ b/compiler/src/CFCTestType.c
@@ -81,7 +81,7 @@ S_run_tests(CFCTest *test) {
 
 static void
 S_run_basic_tests(CFCTest *test) {
-    CFCParcel *neato_parcel = CFCParcel_new("Neato", NULL, NULL, NULL);
+    CFCParcel *neato_parcel = CFCParcel_new("Neato", NULL, NULL, NULL, NULL);
     CFCParcel_register(neato_parcel);
     CFCType *type = CFCType_new(0, neato_parcel, "mytype_t", 0);
 
@@ -114,7 +114,7 @@ S_run_basic_tests(CFCTest *test) {
 
 static void
 S_run_primitive_tests(CFCTest *test) {
-    CFCParcel *parcel = CFCParcel_new("Parcel", NULL, NULL, NULL);
+    CFCParcel *parcel = CFCParcel_new("Parcel", NULL, NULL, NULL, NULL);
     CFCType *type = CFCType_new(CFCTYPE_PRIMITIVE, parcel, "hump_t", 0);
     OK(test, CFCType_is_primitive(type), "is_primitive");
 
@@ -344,7 +344,7 @@ S_run_object_tests(CFCTest *test) {
         CFCBase_decref((CFCBase*)parser);
     }
 
-    CFCParcel *neato_parcel = CFCParcel_new("Neato", NULL, NULL, NULL);
+    CFCParcel *neato_parcel = CFCParcel_new("Neato", NULL, NULL, NULL, NULL);
     CFCClass *foo_class
         = CFCClass_create(neato_parcel, NULL, "Foo", NULL, NULL, NULL, NULL,
                           false, false, false);
@@ -399,7 +399,7 @@ S_run_object_tests(CFCTest *test) {
 
     {
         CFCParcel *foreign_parcel
-            = CFCParcel_new("Foreign", NULL, NULL, NULL);
+            = CFCParcel_new("Foreign", NULL, NULL, NULL, NULL);
         CFCClass *foreign_foo_class
             = CFCClass_create(foreign_parcel, NULL, "Foreign::Foo", NULL, NULL,
                               NULL, NULL, false, false, false);
@@ -467,7 +467,8 @@ S_run_va_list_tests(CFCTest *test) {
 static void
 S_run_arbitrary_tests(CFCTest *test) {
     {
-        CFCParcel *neato_parcel = CFCParcel_new("Neato", NULL, NULL, NULL);
+        CFCParcel *neato_parcel = CFCParcel_new("Neato", NULL, NULL, NULL,
+                                                NULL);
         CFCParcel_register(neato_parcel);
 
         CFCType *foo = CFCType_new_arbitrary(neato_parcel, "foo_t");
@@ -507,7 +508,7 @@ S_run_arbitrary_tests(CFCTest *test) {
 static void
 S_run_composite_tests(CFCTest *test) {
     CFCParser *parser = CFCParser_new();
-    CFCParcel *neato_parcel = CFCParcel_new("Neato", NULL, NULL, NULL);
+    CFCParcel *neato_parcel = CFCParcel_new("Neato", NULL, NULL, NULL, NULL);
     CFCParser_set_parcel(parser, neato_parcel);
 
     {