www_app 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +36 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE +21 -0
  5. data/README.md +84 -0
  6. data/TODO.md +13 -0
  7. data/VERSION +1 -0
  8. data/bin/www_app +46 -0
  9. data/doc/Design.md +123 -0
  10. data/doc/Why_this_arch.rb +104 -0
  11. data/lib/public/jquery-2.1.1.js +4 -0
  12. data/lib/public/jquery.serialize-object.min.js +8 -0
  13. data/lib/public/underscore-1.7.0.js +6 -0
  14. data/lib/public/underscore-min.map +1 -0
  15. data/lib/public/underscore.string-2.3.0.js +1 -0
  16. data/lib/public/www_app.js +824 -0
  17. data/lib/www_app/Clean.rb +169 -0
  18. data/lib/www_app/dsl.rb +86 -0
  19. data/lib/www_app/source.rb +53 -0
  20. data/lib/www_app.rb +1024 -0
  21. data/specs/as_ruby/0000-new.rb +23 -0
  22. data/specs/as_ruby/0010-attrs.rb +29 -0
  23. data/specs/as_ruby/0011-class.rb +39 -0
  24. data/specs/as_ruby/0011-href.rb +37 -0
  25. data/specs/as_ruby/0011-id.rb +39 -0
  26. data/specs/as_ruby/0020-tag.rb +21 -0
  27. data/specs/as_ruby/0020-tag_content.rb +43 -0
  28. data/specs/as_ruby/0021-body.rb +16 -0
  29. data/specs/as_ruby/0021-form.rb +22 -0
  30. data/specs/as_ruby/0021-link.rb +26 -0
  31. data/specs/as_ruby/0021-script.rb +44 -0
  32. data/specs/as_ruby/0030-mustache.rb +113 -0
  33. data/specs/as_ruby/0040-css.rb +174 -0
  34. data/specs/as_ruby/0050-on.rb +64 -0
  35. data/specs/client-side/index.html +90 -0
  36. data/specs/client-side/index.js +777 -0
  37. data/specs/lib/config.ru +96 -0
  38. data/specs/lib/helpers.rb +230 -0
  39. data/specs/lib/qunit/qunit-1.15.0.css +237 -0
  40. data/specs/lib/qunit/qunit-1.15.0.js +2495 -0
  41. data/specs/lib/sample.rb +23 -0
  42. data/specs/sampe.2.rb +14 -0
  43. data/specs/sample.3.rb +17 -0
  44. data/specs/sample.rb +44 -0
  45. data/www_app.gemspec +38 -0
  46. metadata +271 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a2d329bf631e2d3ca2386b433a8b552d25896eda
4
+ data.tar.gz: 36ec7a7fb8580ce6bd15071da27ca9197f63217f
5
+ SHA512:
6
+ metadata.gz: 50e3e9dbf94a9c28487c468719e936047f9719ce9f7a620bb719d6d35b188c9c87b79d6cdebf5ad01b2ff2520ee4b96600d5ecb574aa960df8940f46b32c80de
7
+ data.tar.gz: 110c46539691d9259483f85c4273af8b67c98dfd4b6c7f7550f8bb58cc5fd141237125d59519fd58e8228bd828bd5968d1e40ac6c7a33bbcbf2b5defedec6022
data/.gitignore ADDED
@@ -0,0 +1,36 @@
1
+ /node_modules/
2
+ /npm-debug.log
3
+ /lib/vendor/*
4
+ /.bundle
5
+ /.yardoc
6
+ /*.gem
7
+ /*.rbc
8
+ /*.gem
9
+ /*.rbc
10
+ /.config
11
+ /coverage/
12
+ /InstalledFiles
13
+ /pkg/
14
+ /spec/reports/
15
+ /test/tmp/
16
+ /test/version_tmp/
17
+ /tmp/
18
+
19
+ ## Specific to RubyMotion:
20
+
21
+
22
+ ## Environment normalisation:
23
+ /.bundle/
24
+ /lib/bundler/man/
25
+
26
+ # for a library or gem, you might want to ignore these files since the code is
27
+ # intended to run in multiple environments; otherwise, check them in:
28
+ /Gemfile.lock
29
+ /.ruby-version
30
+ /.ruby-gemset
31
+
32
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
33
+ .rvmrc
34
+ /node_modules/
35
+ /npm-debug.log
36
+ /lib/vendor/*
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013-2014 da99
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,84 @@
1
+
2
+
3
+ WWW\_App:
4
+ ---------
5
+
6
+ Create HTML pages using just Ruby: HTML/CSS/JS.
7
+ It's not done yet.
8
+
9
+
10
+ Ruby:
11
+ --------------
12
+
13
+ To install:
14
+
15
+ ```ruby
16
+ gem install www_app
17
+ ```
18
+
19
+ To Use:
20
+
21
+ ```ruby
22
+ div {
23
+
24
+ border '1px solid #000'
25
+ background_color 'grey'
26
+
27
+ on('scary') {
28
+ border '2px dotted red'
29
+ background_color 'white'
30
+ }
31
+
32
+ p { 'Click the button to make me scared.' }
33
+
34
+ button {
35
+ parent 'div'
36
+ add_class 'scary'
37
+
38
+ 'Scary-ify'
39
+ }
40
+
41
+ }
42
+ ```
43
+
44
+ It generates the CSS, JS, and HTML.
45
+
46
+ Security:
47
+ -----------
48
+
49
+ 1) Server-side: All data from user should be run through `:render` to
50
+ ensure sanitization/escaping.
51
+
52
+ 2) Server-side: All JS meant for :script tags should be escaped before encoded into JSON.
53
+
54
+ 3) Client-side: No untrusted data presented to user: `:inner_html/:inner_text`:
55
+ only uses content from the server after it has been sanitized/escaped.
56
+
57
+ 4) Client-side: No client-side sanitization/escaping. Too many bugs and security issues
58
+ because of browser incompability/implementations. Content
59
+ to be used in client-size JS can only come from the server using "lockboxed vars".
60
+
61
+ 5) Client-side: When using `:inner_html`, check for: `/<script/i` in String.
62
+
63
+ 6) All forms require a CSRF token.
64
+
65
+
66
+ Notes:
67
+ -------
68
+
69
+ 1) Blockquotes no longer allow the :cite attribute. Instead use the `cite` tag.
70
+ More info at: [http://html5doctor.com/cite-and-blockquote-reloaded/](http://html5doctor.com/cite-and-blockquote-reloaded/)
71
+
72
+ 2) Originally, this was going to be programs written in 100% JSON. This has changed
73
+ because it turns out people do not want to create programs, they just want to customize them:
74
+ [https://www.youtube.com/watch?v=9nd9DwCdQR0#t=857](https://www.youtube.com/watch?v=9nd9DwCdQR0#t=857)
75
+
76
+
77
+ Fun fact:
78
+ -----
79
+
80
+ [JSON Applet](http://github.com/da99/json_applet) was changed to WWW\_Applet. WWW\_Applet was then changed to WWW\_App.
81
+
82
+
83
+
84
+
data/TODO.md ADDED
@@ -0,0 +1,13 @@
1
+
2
+
3
+ TODO:
4
+ -----
5
+
6
+ 1) Timestamps on filenames for css, js, etc.
7
+
8
+ 2) Cache control of HTML output.
9
+
10
+ 3) Combine all JS files into one:
11
+ * if one fails, the rest fails.
12
+ * prevent caching of old content.
13
+ * self-contained one file client apps.
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
data/bin/www_app ADDED
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- bash -*-
3
+ #
4
+ #
5
+
6
+ case ARGV[0]
7
+
8
+ when "help"
9
+
10
+ puts %^
11
+ # ===================="
12
+ www_app help"
13
+ www_app install_js"
14
+ # ===================="
15
+ ^
16
+
17
+ when "install_js"
18
+
19
+ fail "
20
+ Must automate downloading of LATEST (security reason)
21
+ underscore, jquery, etc.
22
+ "
23
+ require "fileutils"
24
+ args = ARGV.dup
25
+
26
+ applet_file = File.join File.dirname(File.dirname(__FILE__)), "lib/www_app.js"
27
+
28
+ target_dir = if ARGV[1]
29
+ ARGV[1]
30
+ else
31
+ Dir.pwd
32
+ end
33
+
34
+ new_file = File.join target_dir, "www_app.js"
35
+ FileUtils.cp applet_file, new_file
36
+ puts "#=== From: #{applet_file}"
37
+ puts "#=== Wrote: #{new_file}"
38
+
39
+ else
40
+
41
+ abort "Unknown operation: #{ARGV.first.inspect}"
42
+
43
+ end # === case
44
+
45
+
46
+
data/doc/Design.md ADDED
@@ -0,0 +1,123 @@
1
+
2
+ A
3
+ =========================
4
+
5
+ If :href is a Symbol
6
+ onclick, cancel default event
7
+ and run event named in
8
+ :href Symbol.
9
+
10
+ Buttons
11
+ =========================
12
+
13
+ ```
14
+ button.^(:submit) { 'Save" }
15
+ button.^(:cancel, :red) { 'Cancel" }
16
+ button.^(:blue, :yell) { 'Save" }
17
+ ```
18
+
19
+ This behavior is special to buttons:
20
+ All buttons
21
+ when clicked
22
+ run each event from class names
23
+ ignore if event does not exist.
24
+
25
+ Input
26
+ =========================
27
+
28
+ ```
29
+ input(:text, :my_name, 'Robert')
30
+ input(:text, 'Robert')
31
+ input(:pass_phrase)
32
+ ```
33
+
34
+ This behaviour is special to inputs:
35
+ when :input is in
36
+ fieldset with one or more class names:
37
+ the first class name is the default name.
38
+ if class name is :password,
39
+ type is set to :password
40
+ if first arg is Symbol,
41
+ name is set to first arg.
42
+ else
43
+ type is set to :text
44
+ if last arg is String,
45
+ value is set to last arg.
46
+ else
47
+ return super
48
+
49
+ Attaching Events to Tags and Parents
50
+ ====================================
51
+
52
+ ```
53
+ div {
54
+ observe :submit
55
+ form.action('...') {
56
+ button.^(:submit)
57
+ }
58
+ ```
59
+
60
+ If no parent observes action name:
61
+ then attach to nearest :form tag.
62
+ else attach to tag (in this case, :button)
63
+
64
+ CSS + JS
65
+ ========
66
+
67
+ ```
68
+ div {
69
+
70
+ on(:click) {
71
+
72
+ border '1px solid #fff'
73
+
74
+ when_eq :my_var, 'some js' do
75
+ emit :my_box_was_clicked
76
+ end
77
+
78
+ if_not_then do
79
+ emit :dont_know_what
80
+ end
81
+
82
+ }
83
+
84
+ }
85
+ ```
86
+
87
+ JS Templates
88
+ ============
89
+
90
+ ```ruby
91
+ div.*(:mine) {
92
+
93
+ observe :record
94
+
95
+ span.^(:empty) { 'No records.' }
96
+
97
+ div.^(:list).template(:record, records) { |o|
98
+
99
+ div.^(:record) do
100
+
101
+ border_width '1px'
102
+
103
+ on(:delete) {
104
+ background 'some image'
105
+ server :delete
106
+ }
107
+
108
+ span.^(:title) { o[:title] }
109
+ a.href(:delete) { 'Delete' }
110
+ end
111
+ }
112
+
113
+ }
114
+ ```
115
+ 1) Parent and selectors.
116
+ 2) Passing the message to target + observers.
117
+ 3) Default message receivers:
118
+ Current tag, -> Parents -> Form
119
+
120
+
121
+
122
+
123
+
@@ -0,0 +1,104 @@
1
+
2
+ Why Services and not a programming language?
3
+ ---------------------------
4
+
5
+
6
+ Ideas to remember, in this order:
7
+
8
+ 1. the majority of software for the Majority of Humans requires
9
+ customization and settings/options: in other words, configuration
10
+ rather than creating an app. Science and Nintendo-style
11
+ video games require more "power", (ie a programming language).
12
+
13
+ 2. most of the action in WWW\_Apps is:
14
+ describing things you are doing to the
15
+ stacks... and things you are doing to the
16
+ values on the stack.
17
+
18
+ 3. universal problem solving: break up the problems
19
+ into re-usable components by complexing the problem
20
+ and comparing it to similar and different problems.
21
+
22
+ 4. DSLs/POLs, even if they are a subset of a prog. lang.,
23
+ are stil their own culture/env./prog. lang. Just like
24
+ with anything else, people do not want to learn something
25
+ new unless they see LOTS of other people/companies using it,
26
+ or if it is being talked about a lot (eg XML, Java, etc.).
27
+
28
+ 5. It doesn't matter if you can play well with others,
29
+ because no one wants to play with you. Hence, the lack of
30
+ good "virtual machine"-based architecture and sandboxing in
31
+ browsers. Hence, the lack of demand for programming languages
32
+ written using nothing but JSON.
33
+
34
+ 6. The most important and the most easily mis-understood
35
+ and overlooked:
36
+
37
+ > It's not about solving problems.
38
+ > It's about finding "better" requirements.
39
+
40
+ Once the requirements change, you have to re-evaluate
41
+ the design/architecture immediately.
42
+
43
+ 7. It's hard finding better requirements because of
44
+ familiarity and complexity (quantity and quantity).
45
+ Lazyiness and limited resources help you guide you to
46
+ fulfilling the requirements w/efficiency.
47
+
48
+ 8. Programmers already have a common runtime:
49
+ HTML, CSS, Javascript, and their preferred server-side
50
+ language. They do not want something easier. They
51
+ want something familiar. Also, "write once, run anywhere"
52
+ is not something programmers want because they want to use
53
+ their own preferred language ...above all else... to generate
54
+ HTMl/CSS/JS. That leaves app-to-app messaging (ie JSON over AJAX).
55
+
56
+ 9. Most apps/apps are:
57
+
58
+ > input -> JSON/AJAX -> Server -> markup
59
+
60
+ App/app makers do not neet programming capilities
61
+ outside of Nintendo-like gaming... because they will do
62
+ that in their favorite language on the server, then
63
+ send the final output to the user in the browser.
64
+ The "programming" happens on the server, and the client is
65
+ just a "dumb" GUI to collect and display input/output.
66
+
67
+ This is the closest people want to "write once/run everywhere"
68
+ because of their need to stick to their preferred language
69
+ and the limited needs of the consumer and producer (business).
70
+
71
+ Most industrial designers also do not want to run their own
72
+ business, but merely constant "experiment" with creating.
73
+ In other words, occasional invention, no innovation, and
74
+ constant experimenting. There is not much of a need, beyond
75
+ my own, of a better Smalltalk/Factor/Xananud system...
76
+ outside of Nintendo-like gaming.
77
+
78
+ 10. If WWW\_App is going to be a programming language,
79
+ might as well go all the way: make it an abstraction over
80
+ everything (ie HTML/CSS/JS and all server-side langs,
81
+ including Ruby and Lua). A runtime will be created for
82
+ each language.
83
+
84
+ I originally wanted this to be an abstraction layer over
85
+ HTML, JS, CSS. However, during the development of "www\_app",
86
+ I realized I could do that w/ just Ruby. In other words,
87
+ I would not need a sophisticated runtime in the browser.
88
+ Most of the work would be on the server (to generate the HTML, CSS)
89
+ and the JS would mainly consist of calling functions in the browser
90
+ from my own api/libs.
91
+
92
+ The need for www\_app was pushed forward, also, because
93
+ most people do not need a common way to exchange code in programming
94
+ languages. Instead, their needs are configuration,
95
+ rather than a programming language or DSL/POL.
96
+ This is more higher level than HyperCard:
97
+
98
+ > Configure rather than create.
99
+
100
+ Also, I realized www\_app can become it's own programming
101
+ language with the power to replace PHP. It sounds crazy, but
102
+ no more crazy than the popularity of garbage like PHP and Wordpress.
103
+ It would only require an extra 2 weeks, but this is still too much
104
+ time that I can not afford because I am going broke.