deklarativna 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rvmrc ADDED
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
7
+ environment_id="ruby-1.9.2@deklarativna"
8
+
9
+ #
10
+ # First we attempt to load the desired environment directly from the environment
11
+ # file. This is very fast and efficicent compared to running through the entire
12
+ # CLI and selector. If you want feedback on which environment was used then
13
+ # insert the word 'use' after --create as this triggers verbose mode.
14
+ #
15
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
16
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]] ; then
17
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
18
+ else
19
+ # If the environment file has not yet been created, use the RVM CLI to select.
20
+ rvm --create use "$environment_id"
21
+ fi
22
+
23
+ #
24
+ # If you use an RVM gemset file to install a list of gems (*.gems), you can have
25
+ # it be automatically loaded. Uncomment the following and adjust the filename if
26
+ # necessary.
27
+ #
28
+ # filename=".gems"
29
+ # if [[ -s "$filename" ]] ; then
30
+ # rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
31
+ # fi
32
+
33
+ #
34
+ # If you use bundler and would like to run bundle each time you enter the
35
+ # directory, you can uncomment the following code.
36
+ #
37
+ # # Ensure that Bundler is installed. Install it if it is not.
38
+ # if ! command -v bundle >/dev/null; then
39
+ # printf "The rubygem 'bundler' is not installed. Installing it now.\n"
40
+ # gem install bundler
41
+ # fi
42
+ #
43
+ # # Bundle while reducing excess noise.
44
+ # printf "Bundling your gems. This may take a few minutes on a fresh clone.\n"
45
+ # bundle | grep -v '^Using ' | grep -v ' is complete' | sed '/^$/d'
46
+ #
data/GPL_v2 ADDED
@@ -0,0 +1,252 @@
1
+ GNU GENERAL PUBLIC LICENSE
2
+
3
+ Version 2, June 1991
4
+
5
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
6
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
7
+
8
+ Everyone is permitted to copy and distribute verbatim copies
9
+ of this license document, but changing it is not allowed.
10
+
11
+ Preamble
12
+
13
+ The licenses for most software are designed to take away your freedom to share
14
+ and change it. By contrast, the GNU General Public License is intended to
15
+ guarantee your freedom to share and change free software--to make sure the
16
+ software is free for all its users. This General Public License applies to most
17
+ of the Free Software Foundation's software and to any other program whose
18
+ authors commit to using it. (Some other Free Software Foundation software is
19
+ covered by the GNU Lesser General Public License instead.) You can apply it to
20
+ your programs, too.
21
+
22
+ When we speak of free software, we are referring to freedom, not price.
23
+ Our General Public Licenses are designed to make sure that you have the freedom
24
+ to distribute copies of free software (and charge for this service if you
25
+ wish), that you receive source code or can get it if you want it, that you can
26
+ change the software or use pieces of it in new free programs; and that you know
27
+ you can do these things.
28
+
29
+ To protect your rights, we need to make restrictions that forbid anyone to deny
30
+ you these rights or to ask you to surrender the rights. These restrictions
31
+ translate to certain responsibilities for you if you distribute copies of the
32
+ software, or if you modify it.
33
+
34
+ For example, if you distribute copies of such a program, whether gratis or for
35
+ a fee, you must give the recipients all the rights that you have. You must make
36
+ sure that they, too, receive or can get the source code. And you must show them
37
+ these terms so they know their rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and (2)
40
+ offer you this license which gives you legal permission to copy, distribute
41
+ and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain that
44
+ everyone understands that there is no warranty for this free software. If the
45
+ software is modified by someone else and passed on, we want its recipients to
46
+ know that what they have is not the original, so that any problems introduced
47
+ by others will not reflect on the original authors' reputations.
48
+
49
+ Finally, any free program is threatened constantly by software patents.
50
+ We wish to avoid the danger that redistributors of a free program will
51
+ individually obtain patent licenses, in effect making the program proprietary.
52
+ To prevent this, we have made it clear that any patent must be licensed for
53
+ everyone's free use or not licensed at all.
54
+
55
+ The precise terms and conditions for copying, distribution and modification
56
+ follow.
57
+
58
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
59
+
60
+ 0. This License applies to any program or other work which contains a notice
61
+ placed by the copyright holder saying it may be distributed under the terms of
62
+ this General Public License. The "Program", below, refers to any such program
63
+ or work, and a "work based on the Program" means either the Program or any
64
+ derivative work under copyright law: that is to say, a work containing the
65
+ Program or a portion of it, either verbatim or with modifications and/or
66
+ translated into another language. (Hereinafter, translation is included without
67
+ limitation in the term "modification".) Each licensee is addressed as "you".
68
+
69
+ Activities other than copying, distribution and modification are not covered by
70
+ this License; they are outside its scope. The act of running the Program is not
71
+ restricted, and the output from the Program is covered only if its contents
72
+ constitute a work based on the Program (independent of having been made by
73
+ running the Program). Whether that is true depends on what the Program does.
74
+
75
+ 1. You may copy and distribute verbatim copies of the Program's source code as
76
+ you receive it, in any medium, provided that you conspicuously and
77
+ appropriately publish on each copy an appropriate copyright notice and
78
+ disclaimer of warranty; keep intact all the notices that refer to this License
79
+ and to the absence of any warranty; and give any other recipients of the
80
+ Program a copy of this License along with the Program.
81
+
82
+ You may charge a fee for the physical act of transferring a copy, and you may
83
+ at your option offer warranty protection in exchange for a fee.
84
+
85
+ 2. You may modify your copy or copies of the Program or any portion of it, thus
86
+ forming a work based on the Program, and copy and distribute such modifications
87
+ or work under the terms of Section 1 above, provided that you also meet all of
88
+ these conditions:
89
+
90
+ a) You must cause the modified files to carry prominent notices stating that
91
+ you changed the files and the date of any change.
92
+ b) You must cause any work that you distribute or publish, that in whole or in
93
+ part contains or is derived from the Program or any part thereof, to be
94
+ licensed as a whole at no charge to all third parties under the terms of this
95
+ License.
96
+ c) If the modified program normally reads commands interactively when run, you
97
+ must cause it, when started running for such interactive use in the most
98
+ ordinary way, to print or display an announcement including an appropriate
99
+ copyright notice and a notice that there is no warranty (or else, saying that
100
+ you provide a warranty) and that users may redistribute the program under these
101
+ conditions, and telling the user how to view a copy of this License.
102
+ (Exception: if the Program itself is interactive but does not normally print
103
+ such an announcement, your work based on the Program is not required to print
104
+ an announcement.)
105
+ These requirements apply to the modified work as a whole. If identifiable
106
+ sections of that work are not derived from the Program, and can be reasonably
107
+ considered independent and separate works in themselves, then this License,
108
+ and its terms, do not apply to those sections when you distribute them as
109
+ separate works. But when you distribute the same sections as part of a whole
110
+ which is a work based on the Program, the distribution of the whole must be on
111
+ the terms of this License, whose permissions for other licensees extend to the
112
+ entire whole, and thus to each and every part regardless of who wrote it.
113
+
114
+ Thus, it is not the intent of this section to claim rights or contest your
115
+ rights to work written entirely by you; rather, the intent is to exercise the
116
+ right to control the distribution of derivative or collective works based on
117
+ the Program.
118
+
119
+ In addition, mere aggregation of another work not based on the Program with the
120
+ Program (or with a work based on the Program) on a volume of a storage or
121
+ distribution medium does not bring the other work under the scope
122
+ of this License.
123
+
124
+ 3. You may copy and distribute the Program (or a work based on it,
125
+ under Section 2) in object code or executable form under the terms of
126
+ Sections 1 and 2 above provided that you also do one of the following:
127
+
128
+ a) Accompany it with the complete corresponding machine-readable source code,
129
+ which must be distributed under the terms of Sections 1 and 2 above on a medium
130
+ customarily used for software interchange; or,
131
+ b) Accompany it with a written offer, valid for at least three years, to give
132
+ any third party, for a charge no more than your cost of physically performing
133
+ source distribution, a complete machine-readable copy of the corresponding
134
+ source code, to be distributed under the terms of Sections 1 and 2 above on a
135
+ medium customarily used for software interchange; or,
136
+ c) Accompany it with the information you received as to the offer to distribute
137
+ corresponding source code. (This alternative is allowed only for noncommercial
138
+ distribution and only if you received the program in object code or executable
139
+ form with such an offer, in accord with Subsection b above.)
140
+ The source code for a work means the preferred form of the work for making
141
+ modifications to it. For an executable work, complete source code means all the
142
+ source code for all modules it contains, plus any associated interface
143
+ definition files, plus the scripts used to control compilation and installation
144
+ of the executable. However, as a special exception, the source code distributed
145
+ need not include anything that is normally distributed (in either source or
146
+ binary form) with the major components (compiler, kernel, and so on) of the
147
+ operating system on which the executable runs, unless that component itself
148
+ accompanies the executable.
149
+
150
+ If distribution of executable or object code is made by offering access to copy
151
+ from a designated place, then offering equivalent access to copy the source
152
+ code from the same place counts as distribution of the source code, even though
153
+ third parties are not compelled to copy the source along with the object code.
154
+
155
+ 4. You may not copy, modify, sublicense, or distribute the Program except as
156
+ expressly provided under this License. Any attempt otherwise to copy, modify,
157
+ sublicense or distribute the Program is void, and will automatically terminate
158
+ your rights under this License. However, parties who have received copies, or
159
+ rights, from you under this License will not have their licenses terminated so
160
+ long as such parties remain in full compliance.
161
+
162
+ 5. You are not required to accept this License, since you have not signed it.
163
+ However, nothing else grants you permission to modify or distribute the Program
164
+ or its derivative works. These actions are prohibited by law if you do not
165
+ accept this License. Therefore, by modifying or distributing the Program (or
166
+ any work based on the Program), you indicate your acceptance of this License
167
+ to do so, and all its terms and conditions for copying, distributing
168
+ or modifying the Program or works based on it.
169
+
170
+ 6. Each time you redistribute the Program (or any work based on the Program),
171
+ the recipient automatically receives a license from the original licensor to
172
+ copy, distribute or modify the Program subject to these terms and conditions.
173
+ You may not impose any further restrictions on the recipients' exercise of the
174
+ rights granted herein. You are not responsible for enforcing compliance by
175
+ third parties to this License.
176
+
177
+ 7. If, as a consequence of a court judgment or allegation of patent
178
+ infringement or for any other reason (not limited to patent issues),
179
+ conditions are imposed on you (whether by court order, agreement or otherwise)
180
+ that contradict the conditions of this License, they do not excuse you from
181
+ the conditions of this License. If you cannot distribute so as to satisfy
182
+ simultaneously your obligations under this License and any other pertinent
183
+ obligations, then as a consequence you may not distribute the Program at all.
184
+ For example, if a patent license would not permit royalty-free redistribution
185
+ of the Program by all those who receive copies directly or indirectly through
186
+ you, then the only way you could satisfy both it and this License would be to
187
+ refrain entirely from distribution of the Program.
188
+
189
+ If any portion of this section is held invalid or unenforceable under any
190
+ particular circumstance, the balance of the section is intended to apply and
191
+ the section as a whole is intended to apply in other circumstances.
192
+
193
+ It is not the purpose of this section to induce you to infringe any patents or
194
+ other property right claims or to contest validity of any such claims; this
195
+ section has the sole purpose of protecting the integrity of the free software
196
+ distribution system, which is implemented by public license practices. Many
197
+ people have made generous contributions to the wide range of software
198
+ distributed through that system in reliance on consistent application of that
199
+ system; it is up to the author/donor to decide if he or she is willing to
200
+ distribute software through any other system and a licensee cannot
201
+ impose that choice.
202
+
203
+ This section is intended to make thoroughly clear what is believed to be a
204
+ consequence of the rest of this License.
205
+
206
+ 8. If the distribution and/or use of the Program is restricted in certain
207
+ countries either by patents or by copyrighted interfaces, the original
208
+ copyright holder who places the Program under this License may add an explicit
209
+ geographical distribution limitation excluding those countries, so that
210
+ distribution is permitted only in or among countries not thus excluded.
211
+ In such case, this License incorporates the limitation as if written
212
+ in the body of this License.
213
+
214
+ 9. The Free Software Foundation may publish revised and/or new versions of the
215
+ General Public License from time to time. Such new versions will be similar in
216
+ spirit to the present version, but may differ in detail to address new
217
+ problems or concerns.
218
+
219
+ Each version is given a distinguishing version number. If the Program specifies
220
+ a version number of this License which applies to it and "any later version",
221
+ you have the option of following the terms and conditions either of that
222
+ version or of any later version published by the Free Software Foundation.
223
+ If the Program does not specify a version number of this License,
224
+ you may choose any version ever published by the Free Software Foundation.
225
+
226
+ 10. If you wish to incorporate parts of the Program into other free programs
227
+ whose distribution conditions are different, write to the author to ask for
228
+ permission. For software which is copyrighted by the Free Software Foundation,
229
+ write to the Free Software Foundation; we sometimes make exceptions for this.
230
+ Our decision will be guided by the two goals of preserving the free status of
231
+ all derivatives of our free software and of promoting the sharing and reuse of
232
+ software generally.
233
+
234
+ NO WARRANTY
235
+
236
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
237
+ THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
238
+ STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
239
+ PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
240
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
241
+ FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
242
+ PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
243
+ YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
244
+
245
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
246
+ ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
247
+ PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
248
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
249
+ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
250
+ BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
251
+ FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
252
+ OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+ gem "launchy"
6
+
7
+ # Add dependencies to develop your gem here.
8
+ # Include everything needed to run rake, tests, features, etc.
9
+ group :development do
10
+ gem "shoulda", ">= 0"
11
+ gem "bundler", "~> 1.0.0"
12
+ gem "jeweler", "~> 1.6.4"
13
+ gem "rcov", ">= 0"
14
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,24 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ addressable (2.2.6)
5
+ git (1.2.5)
6
+ jeweler (1.6.4)
7
+ bundler (~> 1.0)
8
+ git (>= 1.2.5)
9
+ rake
10
+ launchy (2.0.5)
11
+ addressable (~> 2.2.6)
12
+ rake (0.9.2.2)
13
+ rcov (0.9.11)
14
+ shoulda (2.11.3)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ bundler (~> 1.0.0)
21
+ jeweler (~> 1.6.4)
22
+ launchy
23
+ rcov
24
+ shoulda
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Deklarativna - An HTML DSL for declarative template creation
2
+ Copyright (C) 2011 David Litvak Bruno
3
+
4
+ This program is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation; either version 2
7
+ of the License, or (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+
18
+ Contact me at
19
+ david (dot) litvakb (at) gmail (dot) com
data/README.md ADDED
@@ -0,0 +1,111 @@
1
+ #Deklarativna
2
+ ###A declarative HTML embedded DSL
3
+
4
+ ##Purpose
5
+ The purpose of **Deklarativna** is to make HTML template creation
6
+ an integrated part of frontend development, allowing the programmer
7
+ to write *human readable code* with not much effort.
8
+
9
+ ##Conception
10
+ This work has been started as a tool for teaching *declarative programming*
11
+ and *DSL creation* to univeritary students.
12
+ This is a work in progress and *I hope* someday will have integration
13
+ with the most popular web frameworks
14
+
15
+ ##Current Status
16
+ All *HTML* common tags are implemented - frame, iframe and some html5 tags
17
+ had not been added.
18
+ Support for *XML* tags with *xml_single_tag* and *xml_double_tag*
19
+ is added.
20
+ Core module classes and helpers have *full support* for attributes.
21
+
22
+ ##Usage
23
+ ###Function Based Approach
24
+
25
+ ```ruby
26
+ require 'deklarativna'
27
+ require 'deklarativna_utils'
28
+
29
+ include Deklarativna
30
+ include DeklarativnaUtils
31
+
32
+ renderable = html {[
33
+ head {
34
+ css {
35
+ ".hello { float: right; color: #456546 }"
36
+ }
37
+ },
38
+ body {
39
+ p("class"=>"hello") {
40
+ "Hello World!"
41
+ }
42
+ }
43
+ ]}
44
+
45
+ HTMLExporter.new.launch_rendered_html_on_browser renderable
46
+ ```
47
+
48
+ ###Class Based Approach
49
+
50
+ ```ruby
51
+ require 'deklarativna'
52
+ require 'deklarativna_utils'
53
+
54
+ class ChildTemplate < BaseTemplate
55
+ def _head
56
+ css { "h1 { color: red; }" }
57
+ end
58
+
59
+ def _body
60
+ [
61
+ h1 { "Deklarativna" },
62
+ p { "how cool is this??" },
63
+ p { "really cool" }
64
+ ]
65
+ end
66
+ end
67
+
68
+ include DeklarativnaUtils
69
+
70
+ HTMLExporter.new.launch_rendered_html_on_browser ChildTemplate.new.render
71
+ ```
72
+
73
+ ###Sinatra Integration
74
+
75
+ ```ruby
76
+ require 'rubygems'
77
+ require 'sinatra/base'
78
+ require 'deklarativna'
79
+
80
+ class IndexTemplate < BaseTemplate
81
+ def _body
82
+ [
83
+ p { "Testing Dinamic File Generation using sinatra" },
84
+ table("border"=>"1") {[
85
+ tr {[
86
+ td { "row 1, value 1" },
87
+ td { "row 1, value 2" }
88
+ ]},
89
+ tr {[
90
+ td("colspan"=>"2") { "Only value in this row" }
91
+ ]}
92
+ ]}
93
+ ]
94
+ end
95
+ end
96
+
97
+ class DeklarativnaSinatra < Sinatra::Base
98
+ get '/' do
99
+ IndexTemplate.new.render
100
+ end
101
+ end
102
+
103
+ DeklarativnaSinatra.run!
104
+ ```
105
+
106
+ Test this by running
107
+
108
+ ```bash
109
+ $ruby dinamic_sinatra_example.rb
110
+ ```
111
+ And open your browser on **localhost:4567**
data/Rakefile ADDED
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "deklarativna"
18
+ gem.homepage = "http://github.com/dlitvakb/deklarativna"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{A Declarative HMTL embedded DSL for HTML/XML Templating in Ruby}
21
+ gem.description = %Q{A Declarative HTML embedded DSL for HTML/XML Templating in Ruby,
22
+ This gem was intended to be use as teaching material for universitary students.}
23
+ gem.email = "david.litvakb@gmail.com"
24
+ gem.authors = ["David Litvak"]
25
+ # dependencies defined in Gemfile
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rake/testtask'
30
+ Rake::TestTask.new(:test) do |test|
31
+ test.libs << 'lib' << 'test'
32
+ test.pattern = 'test/**/test_*.rb'
33
+ test.verbose = true
34
+ end
35
+
36
+ require 'rcov/rcovtask'
37
+ Rcov::RcovTask.new do |test|
38
+ test.libs << 'test'
39
+ test.pattern = 'test/**/test_*.rb'
40
+ test.verbose = true
41
+ test.rcov_opts << '--exclude "gems/*"'
42
+ end
43
+
44
+ task :default => :test
45
+
46
+ require 'rake/rdoctask'
47
+ Rake::RDocTask.new do |rdoc|
48
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
+
50
+ rdoc.rdoc_dir = 'rdoc'
51
+ rdoc.title = "deklarativna #{version}"
52
+ rdoc.rdoc_files.include('README*')
53
+ rdoc.rdoc_files.include('lib/**/*.rb')
54
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,72 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "deklarativna"
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["David Litvak"]
12
+ s.date = "2012-01-03"
13
+ s.description = "A Declarative HTML embedded DSL for HTML/XML Templating in Ruby,\n This gem was intended to be use as teaching material for universitary students."
14
+ s.email = "david.litvakb@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rvmrc",
22
+ "GPL_v2",
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE",
26
+ "README.md",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "deklarativna.gemspec",
30
+ "examples/class_based_example.rb",
31
+ "examples/dinamic_sinatra_example.rb",
32
+ "examples/simple_example.rb",
33
+ "examples/static_sinatra_example.rb",
34
+ "lib/deklarativna.rb",
35
+ "lib/deklarativna_core.rb",
36
+ "lib/deklarativna_utils.rb",
37
+ "run_test.sh",
38
+ "test/helper.rb",
39
+ "test/test_deklarativna.rb",
40
+ "test/test_deklarativna_core.rb"
41
+ ]
42
+ s.homepage = "http://github.com/dlitvakb/deklarativna"
43
+ s.licenses = ["MIT"]
44
+ s.require_paths = ["lib"]
45
+ s.rubygems_version = "1.8.11"
46
+ s.summary = "A Declarative HMTL embedded DSL for HTML/XML Templating in Ruby"
47
+
48
+ if s.respond_to? :specification_version then
49
+ s.specification_version = 3
50
+
51
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
+ s.add_runtime_dependency(%q<launchy>, [">= 0"])
53
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
54
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
55
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
56
+ s.add_development_dependency(%q<rcov>, [">= 0"])
57
+ else
58
+ s.add_dependency(%q<launchy>, [">= 0"])
59
+ s.add_dependency(%q<shoulda>, [">= 0"])
60
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
61
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
62
+ s.add_dependency(%q<rcov>, [">= 0"])
63
+ end
64
+ else
65
+ s.add_dependency(%q<launchy>, [">= 0"])
66
+ s.add_dependency(%q<shoulda>, [">= 0"])
67
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
68
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
69
+ s.add_dependency(%q<rcov>, [">= 0"])
70
+ end
71
+ end
72
+
@@ -0,0 +1,20 @@
1
+ require 'deklarativna'
2
+ require 'deklarativna_utils'
3
+
4
+ class ChildTemplate < BaseTemplate
5
+ def _head
6
+ css { "h1 { color: red; }" }
7
+ end
8
+
9
+ def _body
10
+ [
11
+ h1 { "Deklarativna" },
12
+ p { "how cool is this??" },
13
+ p { "really cool" }
14
+ ]
15
+ end
16
+ end
17
+
18
+ include DeklarativnaUtils
19
+
20
+ HTMLExporter.new.launch_rendered_html_on_browser ChildTemplate.new.render
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'sinatra/base'
3
+ require 'deklarativna'
4
+
5
+ class IndexTemplate < BaseTemplate
6
+ def _body
7
+ [
8
+ p { "Testing Dinamic File Generation using sinatra" },
9
+ table("border"=>"1") {[
10
+ tr {[
11
+ td { "row 1, value 1" },
12
+ td { "row 1, value 2" }
13
+ ]},
14
+ tr {[
15
+ td("colspan"=>"2") { "Only value in this row" }
16
+ ]}
17
+ ]}
18
+ ]
19
+ end
20
+ end
21
+
22
+ class DeklarativnaSinatra < Sinatra::Base
23
+ get '/' do
24
+ IndexTemplate.new.render
25
+ end
26
+ end
27
+
28
+ DeklarativnaSinatra.run!
@@ -0,0 +1,20 @@
1
+ require 'deklarativna'
2
+ require 'deklarativna_utils'
3
+
4
+ include Deklarativna
5
+ include DeklarativnaUtils
6
+
7
+ renderable = html {[
8
+ head {
9
+ css {
10
+ "p { font-size: 38px; color: red; }"
11
+ }
12
+ },
13
+ body {
14
+ paragraphs = []
15
+ ["john", "dani", "david"].each { |e| paragraphs.push(p { "hola #{e}" }) }
16
+ paragraphs
17
+ }
18
+ ]}
19
+
20
+ HTMLExporter.new.launch_rendered_html_on_browser renderable
@@ -0,0 +1,72 @@
1
+ require 'rubygems'
2
+ require 'sinatra/base'
3
+ require 'deklarativna'
4
+ require 'deklarativna_utils'
5
+
6
+ class BaseTemplate
7
+ include Deklarativna
8
+ include DeklarativnaUtils
9
+
10
+ def initialize url
11
+ @url = url
12
+ end
13
+
14
+ def render
15
+ html {[
16
+ head {[
17
+ title {
18
+ _title
19
+ },
20
+ _head
21
+ ]},
22
+ body {[
23
+ h1 {
24
+ "Deklarativna"
25
+ },
26
+ div {
27
+ _content
28
+ }
29
+ ]}
30
+ ]}
31
+ end
32
+
33
+ def _title
34
+ "Deklarativna"
35
+ end
36
+
37
+ def _head
38
+ end
39
+
40
+ def _content
41
+ end
42
+
43
+ def to_file
44
+ HTMLExporter.new.render_to_file @url, render
45
+ end
46
+ end
47
+
48
+ class IndexTemplate < BaseTemplate
49
+ def _content
50
+ [
51
+ p { "Testing Static File Generation using sinatra" },
52
+ table("border"=>"1") {[
53
+ tr {[
54
+ td { "row 1, value 1" },
55
+ td { "row 1, value 2" }
56
+ ]},
57
+ tr {[
58
+ td("colspan"=>"2") { "Only value in this row" }
59
+ ]}
60
+ ]}
61
+ ]
62
+ end
63
+ end
64
+
65
+ class DeklarativnaSinatra < Sinatra::Base
66
+ set :static, true
67
+ set :public_folder, File.dirname(__FILE__)
68
+ end
69
+
70
+ (BaseTemplate.new "base.html").to_file
71
+ (IndexTemplate.new "index.html").to_file
72
+ DeklarativnaSinatra.run!
@@ -0,0 +1,88 @@
1
+ require 'deklarativna_core'
2
+
3
+ module Deklarativna
4
+
5
+ def self.included(base)
6
+ nesting_renderables = ["html", "head", "body", "p", "div", "span",
7
+ "table", "tr", "td", "ul", "ol", "li",
8
+ "center", "dd", "dl", "dt", "i", "b",
9
+ "em", "strong", "title", "pre", "script",
10
+ "style", "a", "form"]
11
+ (1..6).each { |e| nesting_renderables.push "h#{e}" }
12
+
13
+ nesting_renderables.each do
14
+ |tag_name|
15
+ send :define_method, tag_name do
16
+ |*args, &block|
17
+ attributes = args[0] if !args.nil?
18
+ nesting_renderable_string tag_name, block, attributes
19
+ end
20
+ end
21
+
22
+ single_tag_renderables = ["meta", "br", "link", "input", "img"]
23
+ single_tag_renderables.each do
24
+ |tag_name|
25
+ send :define_method, tag_name do
26
+ |*args|
27
+ attributes = args[0] if !args.nil?
28
+ single_tag_renderable_string tag_name, attributes
29
+ end
30
+ end
31
+
32
+ form_input_renderables = ["text", "password", "textarea", "checkbox",
33
+ "radio", "submit"]
34
+ form_input_renderables.each do
35
+ |type|
36
+ send :define_method, type do
37
+ |*args|
38
+ attributes = args[9] if !args.nil?
39
+ attributes ||= {}
40
+ attributes["type"] = type
41
+ input attributes
42
+ end
43
+ end
44
+ end
45
+
46
+ def javascript attributes={}, &script_text_block
47
+ attributes["type"] = "text/javascript"
48
+ script attributes, &script_text_block
49
+ end
50
+
51
+ def css attributes={}, &style_text_block
52
+ attributes["type"] = "text/css"
53
+ style attributes, &style_text_block
54
+ end
55
+
56
+ def comment &comment_block
57
+ comment_renderable_string comment_block
58
+ end
59
+
60
+ def xml_single_tag tag_name, attributes={}
61
+ single_tag_renderable_string tag_name.downcase, attributes
62
+ end
63
+
64
+ def xml_double_tag tag_name, attributes={}, &html_block
65
+ nesting_renderable_string tag_name.downcase, html_block, attributes
66
+ end
67
+ end
68
+
69
+ class BaseTemplate
70
+ include Deklarativna
71
+
72
+ def render
73
+ html {[
74
+ head {
75
+ _head
76
+ },
77
+ body {
78
+ _body
79
+ }
80
+ ]}
81
+ end
82
+
83
+ def _head
84
+ end
85
+
86
+ def _body
87
+ end
88
+ end
@@ -0,0 +1,77 @@
1
+ module Deklarativna
2
+
3
+ class Renderable
4
+ attr_accessor :tag_name,:attributes
5
+
6
+ def initialize &initialization_block
7
+ initialization_block.call self
8
+ end
9
+
10
+ def render_attributes
11
+ rendering_tags = []
12
+ attribute_list = @attributes.sort if @attributes.respond_to? :sort
13
+ if attribute_list.respond_to? :each
14
+ attribute_list.each do |e|
15
+ rendering_tags.push "#{e[0]}=\"#{e[1]}\""
16
+ end
17
+ end
18
+ return " " + (rendering_tags.join " ") if !rendering_tags.empty?
19
+ end
20
+ end
21
+
22
+ class NestingRenderable < Renderable
23
+ attr_accessor :content
24
+
25
+ def to_s
26
+ "<#{@tag_name}#{render_attributes}>#{proc_call}</#{@tag_name}>"
27
+ end
28
+
29
+ def proc_call
30
+ if @content.nil?
31
+ return ""
32
+ end
33
+ _proc_call
34
+ end
35
+
36
+ def _proc_call
37
+ if @content.call.respond_to? :join
38
+ return @content.call.join("")
39
+ end
40
+ @content.call
41
+ end
42
+ end
43
+
44
+ class CommentRenderable < NestingRenderable
45
+ def to_s
46
+ "<!--#{proc_call}-->"
47
+ end
48
+ end
49
+
50
+ class SingleTagRenderable < Renderable
51
+ def to_s
52
+ "<#{@tag_name}#{render_attributes} />"
53
+ end
54
+ end
55
+
56
+ def renderable_string renderable_class, block, attributes={}, tag_name=""
57
+ (renderable_class.new { |instance|
58
+ instance.tag_name = tag_name
59
+ instance.attributes = attributes
60
+ if instance.respond_to? :content
61
+ instance.content = block
62
+ end
63
+ }).to_s
64
+ end
65
+
66
+ def single_tag_renderable_string tag_name, attributes={}
67
+ renderable_string SingleTagRenderable, nil, attributes, tag_name
68
+ end
69
+
70
+ def nesting_renderable_string tag_name, block, attributes={}
71
+ renderable_string NestingRenderable, block, attributes, tag_name
72
+ end
73
+
74
+ def comment_renderable_string comment_block
75
+ renderable_string CommentRenderable, comment_block
76
+ end
77
+ end
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'launchy'
3
+
4
+ module DeklarativnaUtils
5
+ class HTMLExporter
6
+ @@default_filename = 'rendered_html.html'
7
+
8
+ def render_to_file filename, rendered_html
9
+ File.open(filename, 'w') { |f| f.write(rendered_html) }
10
+ filename
11
+ end
12
+
13
+ #Requires Firefox or Chrome
14
+ def launch_file_on_browser filename_or_url
15
+ Launchy.open filename_or_url
16
+ end
17
+
18
+ #Requires Firefox or Chrome
19
+ def launch_rendered_html_on_browser rendered_html, filename=nil
20
+ filename ||= @@default_filename
21
+ launch_file_on_browser(
22
+ render_to_file filename,
23
+ rendered_html
24
+ )
25
+ end
26
+ end
27
+ end
28
+
data/run_test.sh ADDED
@@ -0,0 +1,7 @@
1
+ #rvm use ruby-1.9.2
2
+ #rvm -S _deklarativna_test.rb
3
+ #rvm -S _deklarativna_core_test.rb
4
+
5
+ #back to default ruby until i get to move to ruby-1.9.2 as my default ruby
6
+ ruby _deklarativna_test.rb
7
+ ruby _deklarativna_core_test.rb
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'deklarativna'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,130 @@
1
+ require 'test/unit'
2
+ require 'deklarativna'
3
+
4
+ class DeklarativnaTest < Test::Unit::TestCase
5
+ include Deklarativna
6
+
7
+ def test_html_renders_single_element
8
+ assert_equal "<html></html>", html
9
+ assert_equal "<head></head>", head
10
+ assert_equal "<title></title>", title
11
+ assert_equal "<link />", link
12
+ assert_equal "<meta />", meta
13
+ assert_equal "<script></script>", script
14
+ assert_equal "<script type=\"text/javascript\"></script>", javascript
15
+ assert_equal "<style></style>", style
16
+ assert_equal "<style type=\"text/css\"></style>", css
17
+ assert_equal "<body></body>", body
18
+ assert_equal "<h1></h1>", h1
19
+ assert_equal "<h2></h2>", h2
20
+ assert_equal "<h3></h3>", h3
21
+ assert_equal "<h4></h4>", h4
22
+ assert_equal "<h5></h5>", h5
23
+ assert_equal "<h6></h6>", h6
24
+ assert_equal "<p></p>", p
25
+ assert_equal "<div></div>", div
26
+ assert_equal "<span></span>", span
27
+ assert_equal "<table></table>", table
28
+ assert_equal "<tr></tr>", tr
29
+ assert_equal "<td></td>", td
30
+ assert_equal "<ul></ul>", ul
31
+ assert_equal "<ol></ol>", ol
32
+ assert_equal "<li></li>", li
33
+ assert_equal "<a></a>", a
34
+ assert_equal "<form></form>", form
35
+ assert_equal "<input />", input
36
+ assert_equal "<input type=\"text\" />", text
37
+ assert_equal "<input type=\"password\" />", password
38
+ assert_equal "<input type=\"radio\" />", radio
39
+ assert_equal "<input type=\"checkbox\" />", checkbox
40
+ assert_equal "<input type=\"textarea\" />", textarea
41
+ assert_equal "<input type=\"submit\" />", submit
42
+ assert_equal "<center></center>", center
43
+ assert_equal "<dd></dd>", dd
44
+ assert_equal "<dl></dl>", dl
45
+ assert_equal "<dt></dt>", dt
46
+ assert_equal "<i></i>", i
47
+ assert_equal "<b></b>", b
48
+ assert_equal "<em></em>", em
49
+ assert_equal "<strong></strong>", strong
50
+ assert_equal "<pre></pre>", pre
51
+
52
+ assert_equal "<br />", br
53
+ assert_equal "<img />", img
54
+ assert_equal "<!---->", comment
55
+
56
+ assert_equal "<mysingletag />", (xml_single_tag "mysingletag")
57
+ assert_equal "<mydoubletag></mydoubletag>", (xml_double_tag "mydoubletag")
58
+ end
59
+
60
+ def test_render_any_number_of_nestings
61
+ renderable = html {
62
+ body {
63
+ p {
64
+ "hola"
65
+ }
66
+ }
67
+ }
68
+ assert_equal "<html><body><p>hola</p></body></html>", renderable
69
+ end
70
+
71
+ def test_render_many_tags_on_the_same_level
72
+ renderable = html {[
73
+ head,
74
+ body
75
+ ]}
76
+ assert_equal "<html><head></head><body></body></html>", renderable
77
+
78
+ renderable = html {[
79
+ head {
80
+ javascript
81
+ },
82
+ body {[
83
+ p { "hola" },
84
+ p { "chau" }
85
+ ]}
86
+ ]}
87
+ assert_equal "<html><head><script type=\"text/javascript\"></script></head><body><p>hola</p><p>chau</p></body></html>", renderable
88
+ end
89
+
90
+ def test_style_can_render_css
91
+ renderable = css {
92
+ "h1, p {text-align: left;}"
93
+ }
94
+ assert_equal "<style type=\"text/css\">h1, p {text-align: left;}</style>", renderable
95
+ end
96
+
97
+ def test_script_can_render_javascript
98
+ renderable = javascript {
99
+ "var y = 2; alert(y);"
100
+ }
101
+ assert_equal "<script type=\"text/javascript\">var y = 2; alert(y);</script>", renderable
102
+ end
103
+
104
+ def test_comment_block
105
+ renderable = comment {
106
+ "This is a test"
107
+ }
108
+ assert_equal "<!--This is a test-->", renderable
109
+ end
110
+
111
+ def test_img
112
+ renderable = img "src"=>"/this.jpg"
113
+ assert_equal "<img src=\"/this.jpg\" />", renderable
114
+
115
+ renderable = img "alt"=>"a photo"
116
+ assert_equal "<img alt=\"a photo\" />", renderable
117
+
118
+ renderable = img "src"=>"/this.jpg", "alt"=>"a photo"
119
+ assert_equal "<img alt=\"a photo\" src=\"/this.jpg\" />", renderable
120
+ end
121
+
122
+ def test_nesting_elements_can_have_attributes
123
+ renderable = p("class"=>"foo") { "something" }
124
+ assert_equal "<p class=\"foo\">something</p>", renderable
125
+ end
126
+
127
+ def test_base_template
128
+ assert_equal "<html><head></head><body></body></html>", BaseTemplate.new.render
129
+ end
130
+ end
@@ -0,0 +1,82 @@
1
+ require 'test/unit'
2
+ require 'deklarativna_core'
3
+
4
+ class DeklarativnaCoreTest < Test::Unit::TestCase
5
+ include Deklarativna
6
+
7
+ def test_nesting_renderable
8
+ renderable = NestingRenderable.new { |instance|
9
+ instance.tag_name = "html"
10
+ }
11
+ assert_equal "<html></html>", renderable.to_s
12
+ renderable = NestingRenderable.new { |instance|
13
+ instance.tag_name = "html"
14
+ instance.content = Proc.new {
15
+ NestingRenderable.new { |instance|
16
+ instance.tag_name = "body"
17
+ }
18
+ }
19
+ }
20
+ assert_equal "<html><body></body></html>", renderable.to_s
21
+ end
22
+
23
+ def test_comment_renderable
24
+ renderable = CommentRenderable.new { |instance|
25
+ instance.content = Proc.new {
26
+ "some whacky comment"
27
+ }
28
+ }
29
+ assert_equal "<!--some whacky comment-->", renderable.to_s
30
+ end
31
+
32
+ def test_single_tag_renderable
33
+ renderable = SingleTagRenderable.new { |instance|
34
+ instance.tag_name = "br"
35
+ }
36
+ assert_equal "<br />", renderable.to_s
37
+ renderable = SingleTagRenderable.new { |instance|
38
+ instance.tag_name = "link"
39
+ }
40
+ assert_equal "<link />", renderable.to_s
41
+ end
42
+
43
+ def test_attributes_display_correctly
44
+ renderable = SingleTagRenderable.new { |instance|
45
+ instance.tag_name = "link"
46
+ instance.attributes = {"rel"=>"stylesheet/css",
47
+ "src"=>"/style.css"}
48
+ }
49
+ assert_equal "<link rel=\"stylesheet/css\" src=\"/style.css\" />", renderable.to_s
50
+
51
+ renderable = SingleTagRenderable.new { |instance|
52
+ instance.tag_name = "link"
53
+ instance.attributes = {"rel"=>"stylesheet/css",
54
+ "src"=>"/style2.css"}
55
+ }
56
+ assert_equal "<link rel=\"stylesheet/css\" src=\"/style2.css\" />", renderable.to_s
57
+
58
+ renderable = NestingRenderable.new { |instance|
59
+ instance.tag_name = "script"
60
+ instance.attributes = {"type"=>"text/javascript"}
61
+ }
62
+ assert_equal "<script type=\"text/javascript\"></script>", renderable.to_s
63
+
64
+ renderable = NestingRenderable.new { |instance|
65
+ instance.tag_name = "body"
66
+ instance.attributes = {"class"=>"some-class"}
67
+ instance.content = Proc.new {
68
+ NestingRenderable.new { |instance|
69
+ instance.tag_name = "h1"
70
+ instance.content = Proc.new { "Hi!" }
71
+ }
72
+ }
73
+ }
74
+ assert_equal "<body class=\"some-class\"><h1>Hi!</h1></body>", renderable.to_s
75
+
76
+ renderable = CommentRenderable.new { |instance|
77
+ instance.content = Proc.new { "Hi!" }
78
+ instance.attributes = {"nothing"=>"will happen"}
79
+ }
80
+ assert_equal "<!--Hi!-->", renderable.to_s
81
+ end
82
+ end
metadata ADDED
@@ -0,0 +1,161 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: deklarativna
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - David Litvak
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-01-03 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ requirement: &id001 !ruby/object:Gem::Requirement
22
+ none: false
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ hash: 3
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ version_requirements: *id001
31
+ name: launchy
32
+ prerelease: false
33
+ type: :runtime
34
+ - !ruby/object:Gem::Dependency
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ hash: 3
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ version_requirements: *id002
45
+ name: shoulda
46
+ prerelease: false
47
+ type: :development
48
+ - !ruby/object:Gem::Dependency
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ hash: 23
55
+ segments:
56
+ - 1
57
+ - 0
58
+ - 0
59
+ version: 1.0.0
60
+ version_requirements: *id003
61
+ name: bundler
62
+ prerelease: false
63
+ type: :development
64
+ - !ruby/object:Gem::Dependency
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ hash: 7
71
+ segments:
72
+ - 1
73
+ - 6
74
+ - 4
75
+ version: 1.6.4
76
+ version_requirements: *id004
77
+ name: jeweler
78
+ prerelease: false
79
+ type: :development
80
+ - !ruby/object:Gem::Dependency
81
+ requirement: &id005 !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ version_requirements: *id005
91
+ name: rcov
92
+ prerelease: false
93
+ type: :development
94
+ description: |-
95
+ A Declarative HTML embedded DSL for HTML/XML Templating in Ruby,
96
+ This gem was intended to be use as teaching material for universitary students.
97
+ email: david.litvakb@gmail.com
98
+ executables: []
99
+
100
+ extensions: []
101
+
102
+ extra_rdoc_files:
103
+ - LICENSE
104
+ - README.md
105
+ files:
106
+ - .document
107
+ - .rvmrc
108
+ - GPL_v2
109
+ - Gemfile
110
+ - Gemfile.lock
111
+ - LICENSE
112
+ - README.md
113
+ - Rakefile
114
+ - VERSION
115
+ - deklarativna.gemspec
116
+ - examples/class_based_example.rb
117
+ - examples/dinamic_sinatra_example.rb
118
+ - examples/simple_example.rb
119
+ - examples/static_sinatra_example.rb
120
+ - lib/deklarativna.rb
121
+ - lib/deklarativna_core.rb
122
+ - lib/deklarativna_utils.rb
123
+ - run_test.sh
124
+ - test/helper.rb
125
+ - test/test_deklarativna.rb
126
+ - test/test_deklarativna_core.rb
127
+ homepage: http://github.com/dlitvakb/deklarativna
128
+ licenses:
129
+ - MIT
130
+ post_install_message:
131
+ rdoc_options: []
132
+
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ none: false
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ hash: 3
141
+ segments:
142
+ - 0
143
+ version: "0"
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ hash: 3
150
+ segments:
151
+ - 0
152
+ version: "0"
153
+ requirements: []
154
+
155
+ rubyforge_project:
156
+ rubygems_version: 1.8.11
157
+ signing_key:
158
+ specification_version: 3
159
+ summary: A Declarative HMTL embedded DSL for HTML/XML Templating in Ruby
160
+ test_files: []
161
+