Write an Imagine config file
A general overview of the syntax and some general rules for writing an Imagine config file
As we mention in the domains overview page, you can use Imagine's SmartCompiler to generate production ready Django code by expressing your app and domain specifications in an Imagine (.im) config file.
In this document we wanted to provide a a high-level overview the two types of syntax that you will use when you write an Imagine config file (including the key parts and some general rules for each):
Settings
Imagine's settings provides an easy way for you to choose various settings for:
- your app, such as
- the name of the app,
- the framework you want your app's code to be generated in,
- framework related sub-settings such as:
- the package manager to use to the framework
- the layout of the generated files
- each domain, such as
- the API format you want to use in your app
This gives you the flexibility to choose how you want your app and its various code modules to be generated, organized, stored, formatted etc.
The comprehensive set and description of all the settings is covered in the Settings guide page.
Key parts
At a high level, our settings has two simple parts:
- the settings demarcator
- this allows us to separate settings syntax from the rest of the code module syntax
- the actual settings, which follow the yaml syntax [ADD LINK]
For example, take a look at the settings below:
In this example:
- this syntax represents the settings demarcator
- the rest of the syntax pertains to various app, framework and domain-specific settings.
General rules
Our settings syntax is the same as yaml syntax - you can read more about this [here] (ADD LINK).
As long as you use the settings demarcator before and after any settings syntax to demarcate it from the domain-specific syntax, you can place all your settings:
- together or in separate parts
- in the same file or different files
Domain-specific syntax
We've created a simple syntax to represent various concepts tied to various domains (For more information about what we mean by domains, read this).
Key parts
For each domain, code modules are the highest level representation of concepts pertinent to building that domain. For example:
- the data model domain contains the code modules Model and Relation.
- the API domain contains the code module API.
Each code module further contains Imagine parameter(s), where some Imagine parameters have user-selected names.
Let's take the example of Imagine's data model and API syntax to explain this.
(Please note, the specifics of the data model syntax are described in the data model page; we are simply using this as an example to highlight some general aspects of our syntax that broadly apply to all code modules).
In this example:
Model
is an Imagine classMusician
is a User-selected model-namefirst-name
last-name
age
are User-selected field-namesstring
andinteger
are Imagine fields-typesprimary-key
,max-length 100
andrange 10 100
are Imagine field-properties with their respective field-property-values.
General rules
These are just some general rules which we have listed to avoid repeating in each page. The comprehensive set and description of all the code modules syntax is covered in each individual domain-specific page.
Imagine parameters
- These are completely case insensitive in our syntax
- so, whether you write
Model
,model
,MODEL
,mOdEl
, our compiler recognizes all these asModel
.
- so, whether you write
- Our syntax allows a lot of flexibility
max-length
,max_length
andmaxlength
are all recognized by our compiler.
- These are completely case insensitive in our syntax
User-selected names
- In the above example:
Musician
first-name
last-name
andage
are all user-selected names. - All user-selected names need to be unique for each parameter respectively, but can be repeated across different parameters.
- so, you can have a Model called
Musician
and an API calledMusician
, but you cannot have two Models classes calledMusician
.
- so, you can have a Model called
- Can include letters in any case, numbers, hyphens and underscores, but MUST start with a letter
- so, first-name, firstName123, First_NAME are all valid user-selected names, but 1firstname and firstname!! are not.
- NOTE: In Django hyphens are not supported, so any hyphens in your user-selected name in the
.im
config file will be converted to underscores- so, while firstName and first_name are two distinct field names in Django output code, first-name and first_name would both be treated at first_name in Django.
- Once a user-selected parameter is created, their subsequent use becomes fully case-sensitive and needs to be an exact case match to the original user-selected parameter
- so, for a user-selected parameter called
first-name
, our compiler would not recognize First-name or first-NAME. - Differently said, a Model could have two user-selected parameters called
First-name
andfirst-NAME
and our compiler would treat each of these as unique.
- so, for a user-selected parameter called
- In Django,
- In the above example:
Order of declarations with {} is irrelevant
- Both of the following API endpoint definitions would result in the same generated code.
API /musician-profile {actions [Read, ReadMany]model Musiciandata [first_name, last_name]}API /musician-profile {data [first_name, last_name]actions [Read, ReadMany]model Musician}Any number of spaces, tabs and new lines are treated as a single space
- Both of the following API endpoint definitions would result in the same generated code.
API /musician-profile {actions [Read, ReadMany]model Musiciandata [first_name, last_name]}API /musician-profile {data [first_name, last_name]actions [Read, ReadMany]model Musician}