From dc76ca542abaf926b99fd2a2368a6497c4e44497 Mon Sep 17 00:00:00 2001 From: Gaetan Delannay Date: Wed, 12 Sep 2012 00:23:34 +0200 Subject: [PATCH] [doc] In the process of updating documentation and website. --- bin/publish.py | 14 ++++++--- doc/AppyManifesto.odt | Bin 0 -> 23810 bytes doc/appy.css | 1 + doc/gen.html | 26 ---------------- doc/img/gen.png | Bin 0 -> 4666 bytes doc/img/pod.png | Bin 0 -> 6050 bytes doc/img/star.png | Bin 0 -> 310 bytes doc/index.html | 69 ++++++++++++++++++++++++++++++------------ doc/principles.html | 53 ++++++++++++++++++++++++++++++++ doc/template.html | 37 +++++++++++++--------- gen/ui/appy.css | 12 +++++--- 11 files changed, 144 insertions(+), 68 deletions(-) create mode 100644 doc/AppyManifesto.odt create mode 120000 doc/appy.css create mode 100644 doc/img/gen.png create mode 100644 doc/img/pod.png create mode 100644 doc/img/star.png create mode 100644 doc/principles.html diff --git a/bin/publish.py b/bin/publish.py index 3cfa5a3..997f265 100644 --- a/bin/publish.py +++ b/bin/publish.py @@ -354,9 +354,15 @@ class Publisher: pageFile = file(pageFileName) pageContent = pageFile.read() pageFile.close() - # Extract the page title - i, j = pageContent.find(''), pageContent.find('') - pageTitle = pageContent[i+7:j] + # Extract the page title (excepted for the main page, we don't + # need this title, to save space. + pageTitle = '' + if pageName != 'index.html': + i, j = pageContent.find(''), \ + pageContent.find('') + pageTitle = '%s' % pageContent[i+7:j] # Extract the body tag content from the page pageContent = self.pageBody.search(pageContent).group(1) pageFile = open(pageFileName, 'w') @@ -489,7 +495,7 @@ class Publisher: self.uploadOnPypi(tarball) if self.askQuestion('Publish on appyframework.org?', default='no'): AppySite().publish() - if self.askQuestion('Delete locally generated site ?', default='yes'): + if self.askQuestion('Delete locally generated site ?', default='no'): FolderDeleter.delete(self.genFolder) # ------------------------------------------------------------------------------ diff --git a/doc/AppyManifesto.odt b/doc/AppyManifesto.odt new file mode 100644 index 0000000000000000000000000000000000000000..69307499a1d8b4a613937afc7885ee0eb139563d GIT binary patch literal 23810 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 literal 0 HcmV?d00001 diff --git a/doc/appy.css b/doc/appy.css new file mode 120000 index 0000000..1c2b021 --- /dev/null +++ b/doc/appy.css @@ -0,0 +1 @@ +../gen/ui/appy.css \ No newline at end of file diff --git a/doc/gen.html b/doc/gen.html index 85eceed..f96524b 100644 --- a/doc/gen.html +++ b/doc/gen.html @@ -12,32 +12,6 @@

gen generates code that will run on Plone 2.5. Soon, the code will also be compatible with the latest Plone version. In my point of view, Plone 2.5 has reached the maximum level of complexity a Python developer may tolerate. Plone 2.5 heavily relies on Zope 2. While Plone 3 still runs on Zope 2, it has become heavily based on Zope 3 through the use of the "Five" product (=Zope 2 + Zope 3), that allows to use Zope 3 functionalities within Zope 2. Some people began to be angry about how complex certain tasks (like creating a portlet) became with Plone 3 (consult this, for instance.) In order to fight against this trend, we decided to create a new code generator (a kind of concurrent to ArchGenXML so) that already makes sense for Plone 2.5 and will be more and more relevant for the current and future Plone versions, as the Plone community took the debatable decision to move to Zope 3.

-

Before starting, let's get bored by some (counter-)principles that underlie gen

- -

If you have strict deadlines, skip this.

-
    -
  • The code-centric approach. Other approaches for generating code like the idea of starting from some abstract vision like a (graphical) model (boxes, arrows, things like that); from it, tools generate code skeletons that need to be completed in a subsequent "development" phase. Such "transformational" approaches (I vaguely know some buzzwords for it: MDA, MDD I think) may even count more than two phases and manipulate different models at different abstraction levels before producing code (I am not joking: I've learned that at the university). Such approaches spread the information in several places, because every model or representation has limited expressivity. It produces redundancy and eventually leads to maintenance problems. It violates the DRY principle, which is closely related to our null-IT principle. On the contrary, gen knows only about code. The "model" you write is a simple Python file or package. Being written in a high-level programming language, it does not constrain your expressivity in any way. More important: this code *is* the running code, and thus the only place where you describe your software. Simply, "wrappers" are added to it in order to plug him into the low-level Plone and Zope machinery. A gen-powered Python program acts like a comedian manipulating a tuned marionette: simple moves from the comedian produce complex, cascading and funny behaviours at the puppet level. Moreover, a code-based approach has the following benefits:
  • -
      -
    • when using a graphical model, you are emprisoned into a poorly expressive notation. Let's take an example. If you express a state machine with a UML state diagram, how will you be able to define another state machine based on the previous one? If you express it with code, it is as simple as using class inheritance. Typically, with appy.gen, you may achieve nice results like workflow inheritance; it is completely impossible with ArchGenXML. Of course, using graphical models for communicating or focusing on some parts of your program may be very valuable; this is why we foresee to implement model generation (class diagrams, statecharts, etc) from a appy.gen application. This is our way to see how to use graphical models: as views generated from the code. We don't believe at all in approaches like generating code from models or round-trip engineering.
    • -
    • when using some centralized code repository like subversion, a UML model, for example, is typically stored as a binary file. So it is impossible to work concurrently on various parts of it; nor is it possible to view who has changed what in it, etc;
    • -
    • factoring similar groups of attributes or doing other intelligent treatment on a graphical model is not possible;
    • -
    • there is no need to write and maintain a model parser (like XMI);
    • -
    • yes, you can use cut-and-paste with any text editor! If you want to do similar things with a model, you will probably need to buy some expensive UML editor;
    • -
    -
  • Violating the model-view-controller pattern (and a lot of other patterns, too). Design patterns are elegant low-level constructs used to overcome the limitations of programming languages (ie statically-typed languages like Java) or frameworks. Using them implies adding classes just for making the plumbery work; it augments code complexity and, again, spreads information at several places. Separating code describing data from code presenting it produces the same problem. appy.gen takes the approach of grouping everything at the same place. For example, information that dictates how a given field will be displayed is part of the field definition. -
  • -
  • All-in-one objects. As a consequence of the two previous bullets, gen objects (which are Plain Old Python Objects: you do not even have to inherit from a base gen class!) are self-sufficient. If you want to understand some (group of) functionality within a well-designed gen Python program, you will not loose yourself walking through an intricate web of Python classes and XML definition files. -
  • -
  • Building complex and shared web applications. While Plone and related tools are mainly targeted at building CMS websites (Content Management Systems = websites whose content may be edited by normal human beings), they provide poor support for those who want to build complex and shared web applications. -
  • -
      -
    • By "complex", I mean real "business applications" (or "information systems", like accounting systems, HR systems or online booking systems) whose interfaces are web interfaces; a "CMS" website being a particular case whose main purpose is to provide information (the website of a city or a company, etc) with some limited degree of interaction with the user. Web business applications are characterized by (1) a rich conceptual model featuring a complex web of inter-related classes. Moreover, such applications also need (2) complex querying and reporting facilities, be it through-the-web or within generated documents. Standard Plone provides little support for both (1) and (2). For instance, the basic reference fields and widgets are embryonic (ie no built-in notion of order among references): creating complex inter-related objects is tedious. Standard Plone does not provide any standard document-generation solution and provides limited through-the-web querying facilities. appy.gen comes with a brand new ordered Reference field/widget that automates a lot of repetitive programming tasks and yields unexpected recurrent visualization possibilities. Through its integration with appy.pod, any gen-powered app is by default ready for document generation. gen also generates paramerized through-the-web views and queries. -
    • -
    • Currently, free software is widespread within the "IT infrastructure" (operating systems, networking components, web servers, application servers...) and contaminates more and more general-purpose software applications, like word processors, spreadsheets or multimedia players. For the most of it, the free movement currently reaches domains where requirements are either perfectly known by the developers themselves, deduced from observing proprietary software or part of some general cultural background. In order to raise freedom at the higher levels of business and innovation, we need new mechanisms allowing to tackle (business-)specific requirements, while maintaining the possibility to spread and share software from one organization to the other. appy.gen was built to cope with this new scale of challenges and proposes a set of built-in constructs for creating generic business kernels implementing common requirements and allowing to tailor it to the specific needs of a given organization. This work results from experience gained from a deep involvement in the PloneGov community, an international group of public administrations developing and sharing free software for their own needs. It also benefits from a close collaboration with several research initiatives (the PRECISE research center and the MoVES project) exploring Software Product Lines Engineering and inventing new ways to manage variability among software systems. -
    • -
    -
-

Getting started with gen

Read only this if you want to run a "Hello world" gen application on your machine. This section is dedicated to Joel, a tremedous application and framework tester that ignores the essence of his gift.

diff --git a/doc/img/gen.png b/doc/img/gen.png new file mode 100644 index 0000000000000000000000000000000000000000..e6616ce3c8e2f99bf5a0c58cc69dcd7c09188971 GIT binary patch literal 4666 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 literal 0 HcmV?d00001 diff --git a/doc/img/pod.png b/doc/img/pod.png new file mode 100644 index 0000000000000000000000000000000000000000..52e6480f55989c53f6dcfe5ca9c8aa25ec0a3f1c GIT binary patch literal 6050 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 literal 0 HcmV?d00001 diff --git a/doc/img/star.png b/doc/img/star.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1b02fcb11bc390aceec8451d5d1326e88fbc60 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJgY@V&P8-PM5JY5_^IIbrr0D;B4vj;vTZPt1`cjlvK z=dYbMddHXIz{)Npv1Gs8ra${{&1mFTJ65r_+uhf}(O~lI>H5=}XL|qmy?*`qeKmh~ zytv%#e>uV;Vumk^q(#yH`adWCw0}HaZ^q`Pspz(DlKh$ZdB#Qt1_m}SAFUD)dXo45 z`}_a(X>M-ErsvzGYli%taqiFoAo%!w`my=n>m~jf8pQoPe_+AslONn$8-V~sJp6mz v{`t(AlFRCT9W3Z=pL_7t|9ZAmHXvZQ>Fe|*NA6_|&`%7Wu6{1-oD!M<3Q2-$ literal 0 HcmV?d00001 diff --git a/doc/index.html b/doc/index.html index 8d37cec..2cb9f0d 100644 --- a/doc/index.html +++ b/doc/index.html @@ -4,24 +4,55 @@ -

Appy (Applications in python) is a bunch of tools distributed under the GPL license for developing applications in the Python programming language. The framework features two main modules: gen and pod.

- -

Developers, too, have the right to (h)appyness !

- -

Developers are often guys that live on another planet. Some think this is because software development is so exciting that everything else is poorly considered. At Null-IT software, we are deeply convinced that most developers do not enjoy themselves. They spend their lives together with complex problems that never go away from their minds. Nobody understands them. Their family? Their managers? Their clients? Their friends? No. Nobody. Nobody is able to imagine how huge and complex their tasks are. Consequently, what they do is underestimated. Worst: they can't communicate. Don't believe this is due to some intrinseque geek attitude. Their geekness results from the global incapacity to apprehend the very nature of their abilities. So they are forced to work harder while experiencing the true impossibility to share their permanent software experience. Of course, it may lead to social disasters.

- -

By publishing this high-level, easy-to-use software construction kit, itself based on the tremendously productivity-boosting Python programming language, our crazy hope is to empower developers in such a way that they can leave more often their software prison and spend more time to discover real life.

- -

But (h)appyness has a price. Appy developers themselves accepted to pay. They have dealed their social life for one of the highest forms of social denial (sorry we can't reveal their working conditions), hoping their sacrifice will free the users of their work. So if one day you meet one of them, please be gentle and patient. But they will probably not discuss with you.

- -

The null-IT principle

- -

Our action is guided by the following principle:

- -

Information Technology (IT) should be as transparent and invisible as possible.

- -

While this may seem obvious, this principle is largely ridiculed by a great number of widespread technologies. I will mention here JEE and XSL-FO which were taken as counter-examples while developing pod. In the Python world, Zope 3, by trying to mimick the ridiculous JEE component-model where code is viciously chopped into undersized chunks interconnected by obscure XML declarations, falls unfortunately into this category as well. This is a pity seeing Zope guys trying to abandon the elegant, simple, powerful (in a word: Pythonic) design of Zope 2. But don't be scared! Many people think that Zope 2 will last for many years... Null-IT, with others, is working hard to fight against the generalized Balkanization attitude that undermine IT innovation. If you believe there is still place for hope, you came at the right site. It is time to discover gen!

- -

The Appy framework needs Python 2.4 or higher.

+ + + + + + +
+
+ Get started
+
+ User guide
+
+ Reference guide +
+ gen - Create web apps without knowing anything about web technologies. Just pure Python.

+ You are a small team? A one-man-show? You are bored with technicals details preventing you + from being creative and productive? You think conceptual but prefer coding over drawing? You want to do more + with less effort? You consider code as an art? You know that beauty comes with simplicity? + gen is made for you.

+ + Some people say I will kill my business by publishing my secret weapon. + What more soothing suicide could I dream than Appy's wide adoption? +
Gaëtan Delannay, risk manager.
+
+
+ + + + + + +
+ + Get started
+
+ User guide
+
+ Reference guide +
+ pod - Create dynamic documents in .pdf, .doc, .odt or .rtf in a few minutes.

+ Producing dynamic reports can be SO simple. Use Libre/OpenOffice to create a document template, write some Python + expressions in it, launch pod and you're done. pod (Python Open Document) + wants to be as smaller as possible. Use your word processor as much as you can. Then switch to + pod only for the tricky things.

+ + During the dark ages of software development, creating a single page of report with JEE and XSL-FO + could took up to 2 weeks. Since Gaëtan made pod, the same task can be done in ten minutes. +
Damien Hubaux, paradigm-shift detector.
+
+
diff --git a/doc/principles.html b/doc/principles.html new file mode 100644 index 0000000..e57d5a2 --- /dev/null +++ b/doc/principles.html @@ -0,0 +1,53 @@ + + + Principles behind Appy + + + +

Developers, too, have the right to (h)appyness !

+ +

Developers are often guys that live on another planet. Some think this is because software development is so exciting that everything else is poorly considered. We are deeply convinced that most developers do not enjoy themselves. They spend their lives together with complex problems that never go away from their minds. Nobody understands them. Their family? Their managers? Their clients? Their friends? No. Nobody. Nobody is able to imagine how huge and complex their tasks are. Consequently, what they do is underestimated. Worst: they can't communicate. Don't believe this is due to some intrinseque geek attitude. Their geekness results from the global incapacity to apprehend the very nature of their abilities. So they are forced to work harder while experiencing the true impossibility to share their permanent software experience. Of course, it may lead to social disasters.


+ +

By publishing this high-level, easy-to-use Python-based software construction kit, our crazy hope is to empower developers in such a way that they can leave more often their software prison and spend more time to discover real life.


+ +

But (h)appyness has a price. Appy developers themselves accepted to pay. They have dealed their social life for one of the highest forms of social denial (we can't reveal their working conditions), hoping their sacrifice will free the users of their work. If, one day, you meet one of them, please be gentle and patient. But they will probably not discuss with you.


+ +

The null-IT principle

+ +

Our action is guided by the following principle.

+ +

Information Technology (IT) should be as transparent and invisible as possible.

+ +

While this may seem obvious, this principle is largely ridiculed by a great number of widespread technologies. I will mention here JEE and XSL-FO which were taken as counter-examples while developing pod. In the Python world, Zope 3, now renamed BlueBream, by trying to mimick the JEE component-model where code is viciously chopped into undersized chunks interconnected by obscure XML declarations, falls into this category as well. It is time to fight against the generalized Balkanization attitude that undermine IT innovation!


+ +

Some (counter-)principles that underlie gen

+ +

gen is the largest part of Appy and allows to build web apps. The idea is to generate, from a set of simple Python classes, a complete web app, from the web user interface to the database. Integration with appy.pod allows to generate documents from the web app. gen currently generates web apps for the Zope web application server. We had the following ideas in mind while developing it.


+ +
    +
  • The code-centric but conceptual approach. appy.gen works at a higher level of abstraction than most other frameworks or approaches. With gen, you are not going to write a function that returns dynamic HTML when some URL is hit. You are going to define classes and relationships, and methods will be like hooks that will react when some events occur (an object is created, edited, deleted, etc). You don't have to write a single line of HTML, CSS or Javascript to write basic Appy applications. Only pure Python. This is what I call conceptual. But unlike most conceptual approaches, you will not draw any diagram or anything that is not Python code. Pure Python, pure simplicity, no repetition, no transformation: optimal efficiency, optimal maintainability. Other conceptual approaches like the idea of starting from some abstract vision like a (graphical) model (boxes, arrows...); from it, tools generate code skeletons that need to be completed in a subsequent "development" phase. Such "transformational" approaches (I vaguely know some buzzwords for it: MDA, MDD I think) may even count more than two phases and manipulate different models at different abstraction levels before producing code (this is what I have learned at the university). Such approaches spread the information in several places, because every model or representation has limited expressivity. In my opinion, it produces redundancy and eventually leads to maintenance problems. It violates the DRY principle, which is closely related to our Null-IT principle (see above) On the contrary, gen knows only about code. The "model" you write is a Python package. Being written in a high-level programming language, it does not constrain your expressivity in any way. More important: this code is the running code, and thus the only place where you describe your software. Simply, "wrappers" are added to it in order to plug him into the low-level Zope machinery. A gen-powered Python program acts like a comedian manipulating a tuned marionette: simple moves from the comedian produce complex, cascading and funny behaviours at the puppet level. Moreover, a code-based approach has the following benefits:

  • +
      +
    • when using a graphical model, you are emprisoned into a poorly expressive notation. Let's take an example. If you express a state machine with a UML state diagram, how will you be able to define another state machine based on the previous one? If you express it with code, it is as simple as using class inheritance. Typically, with appy.gen, you may achieve nice results like workflow inheritance. Of course, using graphical models for communicating or focusing on some parts of your program may be very valuable; this is why we foresee to implement model generation (class diagrams, statecharts, etc) from a appy.gen application. This is our way to see how to use graphical models: as views generated from the code. We don't believe at all in approaches like generating code from models or round-trip engineering.
    • +
    • when using some centralized code repository like subversion, a UML model, for example, is typically stored as a binary file. So it is impossible to work concurrently on various parts of it; nor is it possible to view who has changed what in it, etc;
    • +
    • factoring similar groups of attributes or doing other intelligent treatment on a graphical model is not possible;
    • +
    • there is no need to write and maintain a model parser (like XMI);
    • +
    • yes, you can use cut-and-paste with any text editor! If you want to do similar things with a model, you will probably need to buy some expensive UML editor;
    • +

    + +
  • Violating the model-view-controller pattern (and a lot of other patterns, too). Design patterns are elegant low-level constructs used to overcome the limitations of programming languages (ie statically-typed languages like Java) or frameworks. Using them implies adding classes just for making the plumbery work; it augments code complexity and, again, spreads information at several places. Separating code describing data from code presenting it produces the same problem. appy.gen takes the approach of grouping everything at the same place. For example, information that dictates how a given field will be displayed is part of the field definition. +

  • + +
  • All-in-one objects. As a consequence of the two previous bullets, gen objects (which are Plain Old Python Objects: you do not even have to inherit from a base gen class!) are self-sufficient. If you want to understand some (group of) functionality within a well-designed gen Python program, you will not loose yourself walking through an intricate web of Python classes and XML definition files. +

  • + +
  • Building complex and shared web applications. While some out-of-the-box tools like Plone, Joomla or Wordpress are mainly targeted at building websites of specific categories (CMS, blogs, etc), they provide poor support for those who want to build complex and shared web applications. +
  • +
      +
    • By "complex", I mean real "business applications" (or "information systems", like accounting systems, HR systems or online booking systems) whose interfaces are web interfaces; a classical CMS-based website being a particular case whose main purpose is to provide information, with some limited degree of interaction with the user. Web business applications are characterized by (1) a rich conceptual model featuring a complex web of inter-related classes and (2) the need for complex querying and reporting facilities, be it through-the-web or within generated documents. +
    • +
    • Currently, free software is widespread within the "IT infrastructure" (operating systems, networking components, web servers, application servers...) and contaminates more and more general-purpose software applications, like word processors, spreadsheets or multimedia players. For the most of it, the free movement currently reaches domains where requirements are either perfectly known by the developers themselves, deduced from observing proprietary software or part of some general cultural background. In order to raise freedom at the higher levels of business and innovation, we need new mechanisms allowing to tackle (business-)specific requirements, while maintaining the possibility to spread and share software from one organization to the other. appy.gen was built to cope with this new scale of challenges and proposes a set of built-in constructs for creating generic business kernels implementing common requirements and allowing to tailor it to the specific needs of a given organization. This work results from experience gained from a deep involvement in the PloneGov community, an international group of public administrations developing and sharing free software for their own needs. It also benefits from a close collaboration with several research initiatives (the PRECISE research center and the MoVES project) exploring Software Product Lines Engineering and inventing new ways to manage variability among software systems. +
    • +
    +
+ + diff --git a/doc/template.html b/doc/template.html index 836d928..28c77c6 100644 --- a/doc/template.html +++ b/doc/template.html @@ -12,23 +12,33 @@ - + - - + {{ title }} - diff --git a/gen/ui/appy.css b/gen/ui/appy.css index 0c6a315..f12bf9b 100644 --- a/gen/ui/appy.css +++ b/gen/ui/appy.css @@ -1,11 +1,11 @@ body { font: 75% Helvetica,Arial,sans-serif; background-color: #EAEAEA; margin-top: 18px} pre { font: 100% Helvetica,Arial,sans-serif; margin: 0} -h1 { font-size: 14pt; margin-bottom:4px;} -h2 { font-size: 13pt; margin-bottom:4px; font-style: italic; - font-weight: normal; background-color: #d7dee4} -h3 { font-size: 12pt; margin-bottom:4px; font-weight: bold;} -h4 { font-size: 11pt; margin-bottom:4px;} +h1 { font-size: 14pt; margin:6px 0 6px 0} +h2 { font-size: 13pt; margin:6px 0 6px 0; font-style: italic; + font-weight: normal} +h3 { font-size: 12pt; margin:4px 0 4px 0; font-weight: bold;} +h4 { font-size: 11pt; margin:4px 0 4px 0} h5 { font-size: 10pt; margin:0; font-style: italic; font-weight: normal; background-color: #d7dee4} h6 { font-size: 9pt; margin:0; font-weight: bold;} @@ -135,3 +135,5 @@ img { border: 0; vertical-align: middle} border-style: solid none; border-width: 1px medium; color: #333333; line-height: 120%; padding: 10px; margin: 10px 0 10px 0} +.homeTable { background-color: #f2f5f8; border-top: 2px solid grey} +.homeTable td { padding: 10px 5px 10px 10px}
- - + - + -
+
+ +
+ Appy (Applications in python) is a + GPL framework for creating + Python web apps.
+ But faster. A LOT faster!
+ Grasp its technical principles & + psychological effects or download the Appy manifesto. + +
+
- Home – - Doc – - Download – - Forum – - To do – - Contact + Download    + Forum
+ To do    + Contact
+ News
+
@@ -54,11 +64,10 @@
{{ title }}
{{ content }} + {{ content }}