configurationengine/doc/plugins/ruleml-plugin/ruleplugin.rst
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
User guide for Rule Plugin usage in ConE
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
     2
========================================
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
     3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
     4
.. note::
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
     5
    RuleML v3 is now the officially supported RuleML version.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
     6
    Support for versions 1 and 2 is still present in ConE, but they will not
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
     7
    be maintained anymore. If you have e.g. a RuleML v2 file and require some
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
     8
    new functionality, the new functionality will be added to RuleML v3 and
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
     9
    you will need to update your RuleML file to use version 3.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    10
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    11
    Updating should be easy, since the biggest change is setting reference
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    12
    syntax. Simply add ``${}`` around all setting references in the rules.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
Introduction
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    15
------------
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    16
This page describes how to use the ConE Rule plugin. The plug-in provides
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    17
support for RuleML files, which can be used to execute rules during output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    18
generation. The main use for RuleML is modifying the values of ConfML settings
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    19
on run-time based on the values of other settings.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    21
The rule plug-in registers the ImplML namespace for defining rules, and the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    22
RuleML-specific file extension:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    24
  * Namespace: ``http://www.s60.com/xml/ruleml/3``
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    25
  * File extension: ``ruleml``
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    26
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    27
.. note::
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    28
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    29
   More information about :ref:`file extensions <implml-file-extensions>`. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    30
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    31
Usage
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    32
-----
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    33
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    34
A RuleML file is simply an XML file that defines a set of rules. For example:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
.. code-block:: xml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    38
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    39
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    40
        <rule>${SomeFeature.SomeSetting} == 'testing' configures ${SomeFeature.SomeOtherSetting} = 5</rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    41
        <rule>${SomeFeature.SomeSetting} == 'xyz' configures ${SomeFeature.SomeOtherSetting} = 6</rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    42
    </ruleml>
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    44
The above example sets the value of the setting ``SomeFeature.SomeOtherSetting``
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    45
to the integer value ``5`` or ``6`` if the value of ``SomeFeature.SomeSetting`` is
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    46
one of the strings ``testing`` or ``xyz``.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    47
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    48
Rules can also contain multiple operations in a single rule, and can span
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    49
multiple lines to make the rule more readable. For example:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
.. code-block:: xml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    53
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    54
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    55
        <rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    56
            ${SomeFeature.SomeSetting} == 'testing' configures
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    57
                ${SomeFeature.SomeOtherSetting} = 5 and
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    58
                ${SomeFeature.SomeOtherSetting2} = 6 and
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    59
                ${SomeFeature.SomeOtherSetting3} = 7
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    60
        </rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    61
    </ruleml>
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    63
Sometimes the case is that the rule should be executed always, regardless of
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    64
the values of any other settings. To do this you can simply specify ``True``
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    65
as the left-hand side expression:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
.. code-block:: xml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    69
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    70
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    71
        <rule>True configures ${SomeFeature.SomeOtherSetting} = 'Hello!'</rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    72
    </ruleml>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    73
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    74
Python expressions in rules
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    75
^^^^^^^^^^^^^^^^^^^^^^^^^^^
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    76
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    77
RuleML has an extension to the basic rule syntax, which allows any `Python <http://www.python.org/doc/2.5/>`_
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    78
expressions to be used. These can be used to create more complex logic into
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    79
rules than is possible with standard rule expressions. The Python expressions
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    80
are defined between ``{%`` and ``%}``, and can be used in place of normal
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    81
value expressions.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    82
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    83
You can access global ruleml namespace, from which you can find Configuration and Generation Context of the active execution.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    84
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    85
 * ruleml.configuration - links to `Configuration <../../../docbuild/epydoc/cone.public.api.Configuration-class.html>`_ object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    86
 * ruleml.context - links to `Generation Context <../../../docbuild/epydoc/cone.public.plugin.GenerationContext-class.html>`_ object.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    89
*Examples of using Python scripts inside ruleml files:*
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
.. code-block:: xml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    93
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    94
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    95
        <rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    96
            True configures ${SomeFeature.SomeOtherSetting} = {% 2 ** 16 %}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    97
        </rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    98
    </ruleml>
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   100
This sets the value of ``SomeFeature.SomeOtherSetting`` to the evaluated value
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   101
of the Python expression ``2 ** 16``, which is 65536.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   103
Obviously, simple expressions like this cannot do much, but an expression can
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   104
also be a function call, and functions can do almost anything. Functions (and 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   105
also any other globals) can be specified using ``<eval_globals>`` elements.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   106
For example:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
.. code-block:: xml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   110
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   111
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   112
        <rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   113
            True configures ${SomeFeature.SomeOtherSetting} = {% power(2, 16) %}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   114
        </rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   115
        <eval_globals>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   116
    def power(x, y):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   117
        result = 1
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   118
        for i in xrange(y):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   119
            result *= x
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   120
        return result
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   121
        </eval_globals>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   122
    </ruleml>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   123
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   124
This does the same thing as the previous example, except that it uses a custom
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   125
function to do it.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   126
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   127
It is also possible to use standard Python libraries or the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   128
`ConE API <../../epydoc/index.html>`_ from ``<eval_globals>``, and also
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   129
some RuleML-specific things. Ruleml has all data from 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   130
Configuration and Generation Context classes of the active execution. For example:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   131
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   132
.. code-block:: xml
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   134
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   135
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   136
        <rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   137
            True configures ${SomeFeature.SomeOtherSetting} = {% power(2, 16) %}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   138
        </rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   139
        <eval_globals>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   140
    # Import the standard library urllib2 to do operations on URLs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   141
    import urllib2
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   142
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   143
    # Import the ConE API
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   144
    from cone.public import api
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   145
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   146
    def get_project_path():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   147
        # The current configuration is available in ruleml.configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   148
        config = ruleml.configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   149
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   150
        # Return the path of the storage the current project is in
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   151
        project = config.get_project()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   152
        return project.storage.get_path()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   153
        </eval_globals>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   154
    </ruleml>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   155
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   157
In this example configuration is got from ruleml. Generation Context can be 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   158
accessed in the same way, ruleml.context will have all data stored in the 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   159
Generation Context object.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   161
Generation Context values can be accessed inside the Python expressions using the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   162
ruleml.context like ruleml.context.output.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   164
This example uses the Generation Context to get defined output folder. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   165
See how to access the data from the code example below.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
.. code-block:: xml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   169
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   170
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   171
        <rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   172
            True configures ${SomeFeature.output} = {% get_output_folder() %}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   173
        </rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   174
        <eval_globals>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   175
          
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   176
    def get_output_folder():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   177
        output = ruleml.context.output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   178
        return output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   179
        </eval_globals>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   180
    </ruleml>
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   183
Accessing ConfML values inside Python expressions
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   184
'''''''''''''''''''''''''''''''''''''''''''''''''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   185
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   186
ConfML setting values can be accessed inside the Python expressions using the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   187
same notation as elsewhere in the rules, i.e. using ``${`` and ``}``.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   188
For example:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   189
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   190
.. code-block:: xml
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   191
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   192
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   193
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   194
        <rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   195
            ${SomeFeature.SomeSetting} == 'testing' configures ${SomeFeature.SomeOtherSetting} = {% ${SomeFeature.SomeSetting}.upper() %}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   196
        </rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   197
    </ruleml>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   198
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   199
This sets the value of ``SomeFeature.SomeOtherSetting`` to 'TESTING'.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   200
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   201
Accessing feature objects inside Python expressions
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   202
'''''''''''''''''''''''''''''''''''''''''''''''''''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   203
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   204
Sometimes it is necessary to access the actual feature (or setting) object that
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   205
ConE uses internally to perform more complex operations. This can be done
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   206
similarly to accessing the setting values, the only difference is that the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   207
setting reference needs to be surrounded by ``@{}``. For example:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
.. code-block:: xml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   211
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   212
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   213
        <rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   214
            True configures ${SomeFeature.SomeOtherSetting} = {% get_location(@{SomeFeature.SomeSetting}) %}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   215
        </rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   216
        <eval_globals>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   217
    from cone.public import api
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   218
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   219
    def get_location(setting):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   220
        parent_config = setting._find_parent(type=api.Configuration)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   221
        return parent_config.get_path()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   222
        </eval_globals>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   223
    </ruleml>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   224
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   225
This example uses the ConE API to find the location (ConfML file) where the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   226
given setting is defined.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   227
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   228
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   229
Defining functions in a separate .py file
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   230
'''''''''''''''''''''''''''''''''''''''''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   231
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   232
Defining the Python functions used in the rules in an ``<eval_globals>`` element
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   233
can quickly become unwieldy for larger functions:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   235
- Things like ``<`` need to escaped using the corresponding XML entity references
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   236
- Syntax highlighting is not available
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   237
- Writing and running unit tests for the functions is not possible
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   238
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   239
For these reasons, the code of an ``<eval_globals>`` element can also be
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   240
specified in a separate Python file using the ``file`` attribute. For example:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   241
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   242
.. code-block:: xml
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   244
    <?xml version="1.0" encoding="UTF-8"?>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   245
    <ruleml xmlns="http://www.s60.com/xml/ruleml/3">
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   246
        <rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   247
            True configures ${SomeFeature.SomeOtherSetting} = {% some_very_complex_operation(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   248
                @{SomeFeature.SomeSetting1},
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   249
                ${SomeFeature.SomeSetting2},
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   250
                ${SomeFeature.SomeSetting3}) %}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   251
        </rule>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   252
        <eval_globals file="scripts/complex_function.py"/>
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   253
    </ruleml>
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   255
The path specified in the ``file`` attribute is relative to the implementation
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   256
file where the rule is specified, so if the RuleML file in this example was
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   257
located in ``assets/example/implml/some_rule.ruleml``, the referenced Python
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   258
file would be ``assets/example/implml/scripts/complex_function.py``.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
FAQ
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   261
---
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   262
This will be updated based on any questions.