scribble 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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