scribble 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +455 -0
  6. data/Rakefile +2 -0
  7. data/lib/scribble.rb +44 -0
  8. data/lib/scribble/block.rb +25 -0
  9. data/lib/scribble/converter.rb +10 -0
  10. data/lib/scribble/errors.rb +24 -0
  11. data/lib/scribble/method.rb +91 -0
  12. data/lib/scribble/methods/if.rb +26 -0
  13. data/lib/scribble/methods/layout.rb +25 -0
  14. data/lib/scribble/methods/partial.rb +14 -0
  15. data/lib/scribble/methods/times.rb +11 -0
  16. data/lib/scribble/nodes/call.rb +55 -0
  17. data/lib/scribble/nodes/ending.rb +6 -0
  18. data/lib/scribble/nodes/node.rb +24 -0
  19. data/lib/scribble/nodes/value.rb +16 -0
  20. data/lib/scribble/objects/boolean.rb +33 -0
  21. data/lib/scribble/objects/fixnum.rb +53 -0
  22. data/lib/scribble/objects/nil.rb +21 -0
  23. data/lib/scribble/objects/string.rb +62 -0
  24. data/lib/scribble/parsing/nester.rb +49 -0
  25. data/lib/scribble/parsing/parser.rb +132 -0
  26. data/lib/scribble/parsing/reporter.rb +71 -0
  27. data/lib/scribble/parsing/transform.rb +87 -0
  28. data/lib/scribble/partial.rb +41 -0
  29. data/lib/scribble/registry.rb +95 -0
  30. data/lib/scribble/support/context.rb +98 -0
  31. data/lib/scribble/support/matcher.rb +74 -0
  32. data/lib/scribble/support/unmatched.rb +70 -0
  33. data/lib/scribble/support/utilities.rb +49 -0
  34. data/lib/scribble/template.rb +61 -0
  35. data/lib/scribble/version.rb +3 -0
  36. data/scribble.gemspec +22 -0
  37. data/test/all.rb +23 -0
  38. data/test/errors_test.rb +94 -0
  39. data/test/methods/if_test.rb +49 -0
  40. data/test/methods/layout_test.rb +71 -0
  41. data/test/methods/partial_test.rb +85 -0
  42. data/test/methods/times_test.rb +10 -0
  43. data/test/objects/boolean_test.rb +162 -0
  44. data/test/objects/fixnum_test.rb +236 -0
  45. data/test/objects/nil_test.rb +83 -0
  46. data/test/objects/string_test.rb +268 -0
  47. data/test/parsing/parsing_test.rb +234 -0
  48. data/test/registry_test.rb +264 -0
  49. data/test/template_test.rb +51 -0
  50. data/test/test_helper.rb +65 -0
  51. metadata +127 -0
@@ -0,0 +1,51 @@
1
+ require_relative 'test_helper'
2
+
3
+ describe Scribble::Template do
4
+
5
+ # Rendering
6
+
7
+ it 'can be rendered multiple times' do
8
+ template = Scribble::Template.new('Hello World')
9
+ assert_equal 'Hello World', template.render
10
+ assert_equal 'Hello World', template.render
11
+ assert_equal 'Hello World', template.render
12
+ end
13
+
14
+ # Partial loading
15
+
16
+ it "can't load partials without a loader" do
17
+ assert_raises_message 'Cannot load partial' do
18
+ Scribble::Template.new('Hello World').load 'some_partial', nil
19
+ end
20
+ end
21
+
22
+ it "loads partials when it has a loader" do
23
+ loader = MockLoader.new some_partial: ''
24
+ assert_instance_of Scribble::Partial::Context, Scribble::Template.new('Hello World', loader: loader).load('some_partial', nil)
25
+ end
26
+
27
+ # Formats
28
+
29
+ it "can't render in format without template format" do
30
+ assert_raises_message 'Cannot convert to' do
31
+ Scribble::Template.new('Hello World').render format: :render_format
32
+ end
33
+ end
34
+
35
+ it "can't render in format without suitable converter" do
36
+ assert_raises_message 'No suitable converter' do
37
+ Scribble::Template.new('Hello World', format: :template_format).render format: :render_format
38
+ end
39
+ end
40
+
41
+ it "won't need converter to render in template format" do
42
+ assert_scribble_render 'Hello World', 'Hello World',
43
+ format: :template_format, template: {format: :template_format}
44
+ end
45
+
46
+ it "renders in format when it has a template format and a suitable converter" do
47
+ converter = MockConverter.new :template_format, :render_format
48
+ assert_scribble_render 'Hello World', 'template_format > render_format(Hello World)',
49
+ format: :render_format, template: {format: :template_format, converters: [converter]}
50
+ end
51
+ end
@@ -0,0 +1,65 @@
1
+ require 'pry'
2
+ require 'minitest/autorun'
3
+
4
+ require_relative '../lib/scribble'
5
+
6
+ module MiniTest::Assertions
7
+ def assert_scribble_parse source, serialized_transform
8
+ assert_equal serialized_transform, serialize_transform(Scribble::Template.new(source).nodes)
9
+ end
10
+
11
+ def assert_scribble_render source, render_result, template: {}, **options
12
+ assert_equal render_result, Scribble::Template.new(source, **template).render(options)
13
+ end
14
+
15
+ def assert_scribble_raises source, exception_class = Scribble::Errors::Undefined, message = nil
16
+ e = assert_raises exception_class do
17
+ Scribble::Template.new(source).render
18
+ end
19
+ assert_equal message, e.message unless message.nil?
20
+ end
21
+
22
+ def assert_raises_message regex, exception_class = RuntimeError, &block
23
+ assert_match regex, assert_raises(exception_class, &block).message
24
+ end
25
+
26
+ def serialize_transform node = transform
27
+ case node
28
+ when Array then node.map { |node| serialize_transform node }.join(', ')
29
+ when Scribble::Nodes::Value then node.value.is_a?(String) ? "'#{node.value}'" : node.value.inspect
30
+ when Scribble::Nodes::Call
31
+ call = node.name.to_s
32
+ call = "#{serialize_transform(node.receiver)}.#{call}" if node.receiver
33
+ call = "#{call}(#{serialize_transform node.args})" unless node.allow_variable
34
+ call = "#{call} { #{serialize_transform node.nodes} }" if node.nodes
35
+ call
36
+ else raise "Unable to serialize transform: #{node.inspect}"
37
+ end
38
+ end
39
+ end
40
+
41
+ class MockLoader
42
+ def initialize partials
43
+ @partials = partials
44
+ end
45
+
46
+ def load name
47
+ source, format = @partials[name.to_sym]
48
+ Scribble::Partial.new source, format: format
49
+ end
50
+ end
51
+
52
+ MockConverter = Struct.new :from, :to do
53
+ def convert source
54
+ "#{from} > #{to}(#{source})"
55
+ end
56
+ end
57
+
58
+ class Scribble::Registry
59
+ def reset
60
+ class_names, methods = @class_names.dup, @methods.dup
61
+ yield
62
+ ensure
63
+ @class_names, @methods = class_names, methods
64
+ end
65
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scribble
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Stefan Kroes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: parslet
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ description: Scribble is a client facing template language similar to Liquid. Scribble
28
+ was written in Ruby and can be used in any Ruby or Ruby on Rails project. It takes
29
+ a template file, consisting of text and Scribble tags and transforms it into text.
30
+ Scribble can be used to transform any plain text format like HTML, Markdown, JSON,
31
+ XML, etc. Client facing means that it is safe to use Scribble to run/evaluate user
32
+ provided templates.
33
+ email:
34
+ - stefan.kroes@lab01.nl
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files: []
38
+ files:
39
+ - ".gitignore"
40
+ - Gemfile
41
+ - LICENSE.txt
42
+ - README.md
43
+ - Rakefile
44
+ - lib/scribble.rb
45
+ - lib/scribble/block.rb
46
+ - lib/scribble/converter.rb
47
+ - lib/scribble/errors.rb
48
+ - lib/scribble/method.rb
49
+ - lib/scribble/methods/if.rb
50
+ - lib/scribble/methods/layout.rb
51
+ - lib/scribble/methods/partial.rb
52
+ - lib/scribble/methods/times.rb
53
+ - lib/scribble/nodes/call.rb
54
+ - lib/scribble/nodes/ending.rb
55
+ - lib/scribble/nodes/node.rb
56
+ - lib/scribble/nodes/value.rb
57
+ - lib/scribble/objects/boolean.rb
58
+ - lib/scribble/objects/fixnum.rb
59
+ - lib/scribble/objects/nil.rb
60
+ - lib/scribble/objects/string.rb
61
+ - lib/scribble/parsing/nester.rb
62
+ - lib/scribble/parsing/parser.rb
63
+ - lib/scribble/parsing/reporter.rb
64
+ - lib/scribble/parsing/transform.rb
65
+ - lib/scribble/partial.rb
66
+ - lib/scribble/registry.rb
67
+ - lib/scribble/support/context.rb
68
+ - lib/scribble/support/matcher.rb
69
+ - lib/scribble/support/unmatched.rb
70
+ - lib/scribble/support/utilities.rb
71
+ - lib/scribble/template.rb
72
+ - lib/scribble/version.rb
73
+ - scribble.gemspec
74
+ - test/all.rb
75
+ - test/errors_test.rb
76
+ - test/methods/if_test.rb
77
+ - test/methods/layout_test.rb
78
+ - test/methods/partial_test.rb
79
+ - test/methods/times_test.rb
80
+ - test/objects/boolean_test.rb
81
+ - test/objects/fixnum_test.rb
82
+ - test/objects/nil_test.rb
83
+ - test/objects/string_test.rb
84
+ - test/parsing/parsing_test.rb
85
+ - test/registry_test.rb
86
+ - test/template_test.rb
87
+ - test/test_helper.rb
88
+ homepage: https://github.com/stefankroes/scribble
89
+ licenses:
90
+ - MIT
91
+ metadata: {}
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements: []
107
+ rubyforge_project:
108
+ rubygems_version: 2.4.2
109
+ signing_key:
110
+ specification_version: 4
111
+ summary: Scribble is a client facing template language similar to Liquid build in
112
+ Ruby
113
+ test_files:
114
+ - test/all.rb
115
+ - test/errors_test.rb
116
+ - test/methods/if_test.rb
117
+ - test/methods/layout_test.rb
118
+ - test/methods/partial_test.rb
119
+ - test/methods/times_test.rb
120
+ - test/objects/boolean_test.rb
121
+ - test/objects/fixnum_test.rb
122
+ - test/objects/nil_test.rb
123
+ - test/objects/string_test.rb
124
+ - test/parsing/parsing_test.rb
125
+ - test/registry_test.rb
126
+ - test/template_test.rb
127
+ - test/test_helper.rb