예제 #1
0
파일: __init__.py 프로젝트: goto40/recipec
def recipe_lang():
    this_folder = dirname(abspath(__file__))
    mm = metamodel_from_file(join(this_folder, "grammar", "Recipe.tx"),
                             classes=[Ingredient])
    config_provider = scoping_providers.PlainNameGlobalRepo(
        "**/*.config", glob_args={"recursive": True})
    ingredient_type_provider = scoping_providers.PlainNameGlobalRepo(
        "**/*.ingredient", glob_args={"recursive": True})
    mm.register_scope_providers({
        "Recipe.persons": config_provider,
        "Ingredient.type": ingredient_type_provider,
        "Ingredient.unit": scoping_providers.ExtRelativeName("type", "units", "extends"),
    })
    return mm
예제 #2
0
def test_issue78_quickcheck_no_obj_processors_called_for_references():
    """
    This test represents just a plausibility check.
    """
    grammarA = """
    Model: a+=A | b+=B;
    A:'A' name=ID;
    B:'B' name=ID '->' a=[A];
    """

    mm = textx.metamodel_from_str(grammarA)

    import textx.scoping.providers as scoping_providers
    global_repo_provider = scoping_providers.PlainNameGlobalRepo()
    mm.register_scope_providers({"*.*": global_repo_provider})

    test_list=[]
    mm.register_obj_processors({
        'A': lambda o: test_list.append(o.name),
    })

    # no references to A: --> obj proc called
    m1 = mm.model_from_str('''
    A a1 A a2 A a3
    ''')
    assert ['a1','a2','a3'] == test_list

    # only references to A: --> obj proc not called
    global_repo_provider.add_model(m1)
    m2 = mm.model_from_str('''
    B b1 -> a1 B b2 -> a2 B b3 -> a3
    ''')
    assert ['a1','a2','a3'] == test_list # unchanged...
예제 #3
0
def register_languages():

    clear_language_registrations()

    global_repo = scoping.GlobalModelRepository()
    global_repo_provider = scoping_providers.PlainNameGlobalRepo()

    def get_A_mm():
        mm_A = metamodel_from_str(grammarA, global_repository=global_repo)
        mm_A.register_scope_providers({"*.*": global_repo_provider})
        return mm_A

    def get_B_mm():
        mm_B = metamodel_from_str(grammarB, global_repository=global_repo)
        mm_B.register_scope_providers({"*.*": global_repo_provider})
        return mm_B

    def get_BwithImport_mm():
        mm_B = metamodel_from_str(grammarBWithImport,
                                  global_repository=global_repo)

        # define a default scope provider supporting the importURI feature
        mm_B.register_scope_providers(
            {"*.*": scoping_providers.FQNImportURI()})
        return mm_B

    register_language('A', pattern="*.a", metamodel=get_A_mm)
    register_language('B', pattern="*.b", metamodel=get_B_mm)

    register_language('BwithImport',
                      pattern="*.b",
                      metamodel=get_BwithImport_mm)

    return global_repo_provider
예제 #4
0
def register_languages():

    clear_language_registrations()

    global_repo = scoping.GlobalModelRepository()
    global_repo_provider = scoping_providers.PlainNameGlobalRepo()

    class A(object):
        def __init__(self, **kwargs):
            super(A, self).__init__()
            for k, v in kwargs.items():
                self.__dict__[k] = v

        def __setattr__(self, name, value):
            raise Exception("test: this is not allowed.")

    def get_A_mm():
        mm_A = metamodel_from_str(grammarA,
                                  global_repository=global_repo,
                                  classes=[A])
        mm_A.register_scope_providers({"*.*": global_repo_provider})
        return mm_A

    def get_B_mm():
        mm_B = metamodel_from_str(grammarB, global_repository=global_repo)
        mm_B.register_scope_providers({"*.*": global_repo_provider})
        return mm_B

    def get_BwithImport_mm():
        mm_B = metamodel_from_str(grammarBWithImport,
                                  global_repository=global_repo)

        # define a default scope provider supporting the importURI feature
        mm_B.register_scope_providers(
            {"*.*": scoping_providers.FQNImportURI()})
        return mm_B

    register_language('A', pattern="*.a", metamodel=get_A_mm)
    register_language('B', pattern="*.b", metamodel=get_B_mm)

    register_language('BwithImport',
                      pattern="*.b",
                      metamodel=get_BwithImport_mm)

    return global_repo_provider
예제 #5
0
def test_multi_metamodel_references2():
    mm_A = metamodel_from_str(grammarA)
    mm_B = metamodel_from_str(grammarB)

    global_repo_provider = scoping_providers.PlainNameGlobalRepo()
    mm_B.register_scope_providers({"*.*": global_repo_provider})

    mA = mm_A.model_from_str('''
    A a1 A a2 A a3
    ''')
    global_repo_provider.add_model(mA)

    mm_B.model_from_str('''
    B b1 -> a1 B b2 -> a2 B b3 -> a3
    ''')

    with raises(textx.exceptions.TextXSemanticError, match=r'.*UNKNOWN.*'):
        mm_B.model_from_str('''
        B b1 -> a1 B b2 -> a2 B b3 -> UNKNOWN
        ''')
예제 #6
0
def test_metamodel_provider_advanced_test():
    """
    Advanced test for ExtRelativeName and PlainNameGlobalRepo.

    Here we have a global model repository shared between
    different meta models.

    The meta models interact (refer to each other; one direction).
    """
    #################################
    # META MODEL DEF
    #################################
    this_folder = dirname(abspath(__file__))

    def get_meta_model(global_repo, grammar_file_name):
        mm = metamodel_from_file(join(this_folder, grammar_file_name),
                                 debug=False)
        mm.register_scope_providers({
            "*.*":
            global_repo,
            "Ingredient.unit":
            scoping_providers.ExtRelativeName("type", "units", "extends")
        })
        return mm

    global_repo = scoping_providers.PlainNameGlobalRepo()
    global_repo.register_models(
        join(this_folder, "metamodel_provider2", "*.recipe"))
    global_repo.register_models(
        join(this_folder, "metamodel_provider2", "*.ingredient"))

    i_mm = get_meta_model(
        global_repo, join(this_folder, "metamodel_provider2", "Ingredient.tx"))
    r_mm = get_meta_model(
        global_repo, join(this_folder, "metamodel_provider2", "Recipe.tx"))

    clear_language_registrations()
    register_language(
        'recipe-dsl',
        pattern='*.recipe',
        description='demo',
        metamodel=r_mm  # or a factory
    )
    register_language(
        'ingredient-dsl',
        pattern='*.ingredient',
        description='demo',
        metamodel=i_mm  # or a factory
    )

    #################################
    # MODEL PARSING
    #################################

    model_repo = global_repo.load_models_in_model_repo().all_models

    #################################
    # TEST MODEL
    #################################

    def get_all(model_repo, what):
        lst = []
        for m in model_repo:
            lst = lst + get_children_of_type(what, m)
        return lst

    lst_i = get_all(model_repo, "IngredientType")
    lst_r = get_all(model_repo, "Recipe")

    assert len(lst_i) == 2
    assert len(lst_r) == 2

    # check some references to be resolved (!=None)
    assert lst_r[0].ingredients[0].type
    assert lst_r[0].ingredients[0].unit
def test_metamodel_provider_advanced_test3_global():
    """
    Advanced test for ExtRelativeName and PlainNameGlobalRepo.

    Here we have a global model repository shared between
    different meta models.

    The meta models interact (refer to each other, different directions).
    """
    #################################
    # META MODEL DEF
    #################################
    this_folder = dirname(abspath(__file__))

    def get_meta_model(global_repo, grammar_file_name):
        mm = metamodel_from_file(join(this_folder, grammar_file_name),
                                 debug=False, classes=[Cls, Obj])
        mm.register_scope_providers({
            "*.*": global_repo,
        })
        return mm

    global_repo_provider = scoping_providers.PlainNameGlobalRepo()
    global_repo_provider.register_models(
        join(this_folder, "metamodel_provider3", "circular", "*.a"))
    global_repo_provider.register_models(
        join(this_folder, "metamodel_provider3", "circular", "*.b"))
    global_repo_provider.register_models(
        join(this_folder, "metamodel_provider3", "circular", "*.c"))

    a_mm = get_meta_model(
        global_repo_provider, join(this_folder,
                                   "metamodel_provider3", "A.tx"))
    b_mm = get_meta_model(
        global_repo_provider, join(this_folder,
                                   "metamodel_provider3", "B.tx"))
    c_mm = get_meta_model(
        global_repo_provider, join(this_folder,
                                   "metamodel_provider3", "C.tx"))

    clear_language_registrations()
    register_language(
        'a-dsl',
        pattern='*.a',
        description='Test Lang A',
        metamodel=a_mm)
    register_language(
        'b-dsl',
        pattern='*.b',
        description='Test Lang B',
        metamodel=b_mm)
    register_language(
        'c-dsl',
        pattern='*.c',
        description='Test Lang C',
        metamodel=c_mm)

    #################################
    # MODEL PARSING
    #################################

    model_repo = global_repo_provider.load_models_in_model_repo().all_models

    #################################
    # TEST MODEL
    #################################

    def get_all(model_repo, what):
        lst = []
        for m in model_repo.filename_to_model.values():
            lst = lst + get_children_of_type(what, m)
        return lst

    lst = get_all(model_repo, "Obj")
    # print(lst)
    assert len(lst) == 3

    # check some references to be resolved (!=None)
    for a in lst:
        assert a.ref

    # check meta classes
    assert a_mm["Cls"]._tx_fqn == b_mm["Cls"]._tx_fqn

    # more checks
    from textx import textx_isinstance
    for a in lst:
        assert textx_isinstance(a, a_mm["Obj"])
        assert textx_isinstance(a, b_mm["Obj"])
        assert textx_isinstance(a, c_mm["Obj"])

    #################################
    # END
    #################################
    clear_language_registrations()
def test_metamodel_provider_advanced_test3_global_single_metamodel():
    """
    simplified test with only one meta model
    """
    #################################
    # META MODEL DEF
    #################################
    this_folder = dirname(abspath(__file__))

    def get_meta_model(global_repo, grammar_file_name):
        mm = metamodel_from_file(join(this_folder, grammar_file_name),
                                 debug=False, classes=[Cls, Obj])
        mm.register_scope_providers({
            "*.*": global_repo,
        })
        return mm

    global_repo_provider = scoping_providers.PlainNameGlobalRepo()
    global_repo_provider.register_models(
        join(this_folder, "metamodel_provider3", "single", "*.a"))

    a_mm = get_meta_model(
        global_repo_provider, join(this_folder,
                                   "metamodel_provider3", "A.tx"))

    clear_language_registrations()
    register_language(
        'a-dsl',
        pattern='*.a',
        description='Test Lang A',
        metamodel=a_mm)

    #################################
    # MODEL PARSING
    #################################

    model_repo = global_repo_provider.load_models_in_model_repo().all_models

    #################################
    # TEST MODEL
    #################################

    def get_all(model_repo, what):
        lst = []
        for m in model_repo.filename_to_model.values():
            lst = lst + get_children_of_type(what, m)
        return lst

    lst = get_all(model_repo, "Obj")
    # print(lst)
    assert len(lst) == 3

    # check some references to be resolved (!=None)
    for a in lst:
        assert a.ref

    # check meta classes
    assert a_mm["Cls"]._tx_fqn == a_mm["Cls"]._tx_fqn

    # more checks
    from textx import textx_isinstance
    for a in lst:
        assert textx_isinstance(a, a_mm["Obj"])
        assert textx_isinstance(a, a_mm["Obj"])
        assert textx_isinstance(a, a_mm["Obj"])

    #################################
    # END
    #################################
    clear_language_registrations()
def test_metamodel_provider_advanced_test():
    """
    Advanced test for ExtRelativeName and PlainNameGlobalRepo.

    Here we have a global model repository shared between
    different meta models.

    The meta models interact (refer to each other; one direction).
    """
    #################################
    # META MODEL DEF
    #################################
    this_folder = dirname(abspath(__file__))

    def get_meta_model(global_repo, grammar_file_name):
        mm = metamodel_from_file(join(this_folder, grammar_file_name),
                                 debug=False)
        mm.register_scope_providers({
            "*.*": global_repo,
            "Ingredient.unit": scoping_providers.ExtRelativeName("type",
                                                                 "units",
                                                                 "extends")
        })
        return mm

    global_repo = scoping_providers.PlainNameGlobalRepo()
    global_repo.register_models(
        this_folder + "/metamodel_provider2/*.recipe")
    global_repo.register_models(
        this_folder + "/metamodel_provider2/*.ingredient")

    i_mm = get_meta_model(
        global_repo, this_folder + "/metamodel_provider2/Ingredient.tx")
    r_mm = get_meta_model(
        global_repo, this_folder + "/metamodel_provider2/Recipe.tx")

    scoping.MetaModelProvider.add_metamodel("*.recipe", r_mm)
    scoping.MetaModelProvider.add_metamodel("*.ingredient", i_mm)

    #################################
    # MODEL PARSING
    #################################

    model_repo = global_repo.load_models_in_model_repo().all_models

    #################################
    # TEST MODEL
    #################################

    def get_all(model_repo, what):
        lst = []
        for m in model_repo.filename_to_model.values():
            lst = lst + get_children_of_type(what, m)
        return lst

    lst_i = get_all(model_repo, "IngredientType")
    lst_r = get_all(model_repo, "Recipe")

    assert len(lst_i) == 2
    assert len(lst_r) == 2

    # check some references to be resolved (!=None)
    assert lst_r[0].ingredients[0].type
    assert lst_r[0].ingredients[0].unit
예제 #10
0
def test_metamodel_provider_advanced_test3_global():
    """
    Advanced test for ExtRelativeName and PlainNameGlobalRepo.

    Here we have a global model repository shared between
    different meta models.

    The meta models interact (refer to each other, different directions).
    """
    #################################
    # META MODEL DEF
    #################################
    this_folder = dirname(abspath(__file__))

    def get_meta_model(global_repo, grammar_file_name):
        mm = metamodel_from_file(join(this_folder, grammar_file_name),
                                 debug=False)
        mm.register_scope_providers({
            "*.*": global_repo,
        })
        return mm

    global_repo_provider = scoping_providers.PlainNameGlobalRepo()
    global_repo_provider.register_models(
        this_folder + "/metamodel_provider3/circular/*.a")
    global_repo_provider.register_models(
        this_folder + "/metamodel_provider3/circular/*.b")
    global_repo_provider.register_models(
        this_folder + "/metamodel_provider3/circular/*.c")

    a_mm = get_meta_model(
        global_repo_provider, this_folder + "/metamodel_provider3/A.tx")
    b_mm = get_meta_model(
        global_repo_provider, this_folder + "/metamodel_provider3/B.tx")
    c_mm = get_meta_model(
        global_repo_provider, this_folder + "/metamodel_provider3/C.tx")

    scoping.MetaModelProvider.clear()
    scoping.MetaModelProvider.add_metamodel("*.a", a_mm)
    scoping.MetaModelProvider.add_metamodel("*.b", b_mm)
    scoping.MetaModelProvider.add_metamodel("*.c", c_mm)

    #################################
    # MODEL PARSING
    #################################

    model_repo = global_repo_provider.load_models_in_model_repo().all_models

    #################################
    # TEST MODEL
    #################################

    def get_all(model_repo, what):
        lst = []
        for m in model_repo.filename_to_model.values():
            lst = lst + get_children_of_type(what, m)
        return lst

    lst = get_all(model_repo, "Obj")
    # print(lst)
    assert len(lst) == 3

    # check some references to be resolved (!=None)
    for a in lst:
        assert a.ref

    #################################
    # END
    #################################
    scoping.MetaModelProvider.clear()