doc_contract 0.1.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 (58) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +191 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/config/doc_contract_manifest.js +3 -0
  6. data/app/assets/javascripts/doc_contract/application.coffee +68 -0
  7. data/app/assets/stylesheets/doc_contract/application.sass +52 -0
  8. data/app/assets/stylesheets/doc_contract/pandoc.css +15 -0
  9. data/app/controllers/concerns/doc_contract/shared_template_and_instance_methods.rb +71 -0
  10. data/app/controllers/doc_contract/application_controller.rb +20 -0
  11. data/app/controllers/doc_contract/contract_instances_controller.rb +56 -0
  12. data/app/controllers/doc_contract/contract_templates_controller.rb +69 -0
  13. data/app/helpers/doc_contract/application_helper.rb +178 -0
  14. data/app/models/concerns/yaml_validator.rb +9 -0
  15. data/app/models/doc_contract/contract_instance.rb +39 -0
  16. data/app/models/doc_contract/contract_template.rb +37 -0
  17. data/app/views/doc_contract/application/_button-destroy-record.html.slim +1 -0
  18. data/app/views/doc_contract/application/_button-edit-record.html.slim +1 -0
  19. data/app/views/doc_contract/application/_button-new-record.html.slim +1 -0
  20. data/app/views/doc_contract/application/_button-preview-html.html.slim +9 -0
  21. data/app/views/doc_contract/application/_button-preview-markdown.html.slim +9 -0
  22. data/app/views/doc_contract/application/_button-preview-pdf.html.slim +1 -0
  23. data/app/views/doc_contract/application/_definition_table_attribute_errors.html.slim +7 -0
  24. data/app/views/doc_contract/application/_messages.html.slim +4 -0
  25. data/app/views/doc_contract/application/_navigation.html.slim +18 -0
  26. data/app/views/doc_contract/application/main.html.slim +6 -0
  27. data/app/views/doc_contract/contract_instances/_form.html.slim +25 -0
  28. data/app/views/doc_contract/contract_instances/edit.html.slim +3 -0
  29. data/app/views/doc_contract/contract_instances/index.html.slim +34 -0
  30. data/app/views/doc_contract/contract_instances/new.html.slim +3 -0
  31. data/app/views/doc_contract/contract_instances/show.html.slim +25 -0
  32. data/app/views/doc_contract/contract_templates/_form.html.slim +34 -0
  33. data/app/views/doc_contract/contract_templates/edit.html.slim +3 -0
  34. data/app/views/doc_contract/contract_templates/index.html.slim +31 -0
  35. data/app/views/doc_contract/contract_templates/new.html.slim +3 -0
  36. data/app/views/doc_contract/contract_templates/show.html.slim +28 -0
  37. data/app/views/doc_contract/kaminari/_first_page.html.slim +2 -0
  38. data/app/views/doc_contract/kaminari/_gap.html.slim +2 -0
  39. data/app/views/doc_contract/kaminari/_last_page.html.slim +2 -0
  40. data/app/views/doc_contract/kaminari/_next_page.html.slim +2 -0
  41. data/app/views/doc_contract/kaminari/_page.html.slim +6 -0
  42. data/app/views/doc_contract/kaminari/_paginator.html.slim +11 -0
  43. data/app/views/doc_contract/kaminari/_prev_page.html.slim +2 -0
  44. data/app/views/layouts/doc_contract/application.html.slim +23 -0
  45. data/config/initializers/human_plural.rb +16 -0
  46. data/config/locales/en.yml +30 -0
  47. data/config/routes.rb +17 -0
  48. data/db/migrate/20220118150923_create_doc_contract_contract_templates.rb +10 -0
  49. data/db/migrate/20220121160034_add_markdown_to_doc_contract_contract_templates.rb +5 -0
  50. data/db/migrate/20220121165825_add_config_yml_to_doc_contract_contract_templates.rb +5 -0
  51. data/db/migrate/20220122151402_create_doc_contract_contract_instances.rb +11 -0
  52. data/db/migrate/20220125183437_add_titlepage_background_to_contract_templates.rb +5 -0
  53. data/lib/doc_contract/engine.rb +24 -0
  54. data/lib/doc_contract/handlebars.rb +99 -0
  55. data/lib/doc_contract/version.rb +3 -0
  56. data/lib/doc_contract.rb +9 -0
  57. data/lib/tasks/doc_contract_tasks.rake +4 -0
  58. metadata +254 -0
@@ -0,0 +1,30 @@
1
+ en:
2
+ general:
3
+ back: Back
4
+ boolean_yes: 'Yes'
5
+ boolean_no: 'No'
6
+ are_you_sure: "Are you sure?"
7
+ collection:
8
+ empty: "There are no %{models}"
9
+ edit_button: 'Edit %{models}'
10
+ last_changed:
11
+ mixed_values: (mixed)
12
+ action:
13
+ index:
14
+ label: "Listing %{models}"
15
+ new:
16
+ label: "Add %{model}"
17
+ show:
18
+ label: "%{model}"
19
+ edit:
20
+ label: "Edit %{model}"
21
+ create:
22
+ successfull: '%{model} is successfully created'
23
+ update:
24
+ successfull: '%{model} is successfully updated'
25
+ destroy:
26
+ label: "Delete %{model}"
27
+ successfull: '%{model} is successfully deleted'
28
+ download:
29
+ label: Download
30
+
data/config/routes.rb ADDED
@@ -0,0 +1,17 @@
1
+ DocContract::Engine.routes.draw do
2
+ resources :contract_templates do
3
+ member do
4
+ post :processed_markdown
5
+ post :processed_html
6
+ get :get_pdf
7
+ end
8
+ end
9
+ resources :contract_instances do
10
+ member do
11
+ post :processed_markdown
12
+ post :processed_html
13
+ get :get_pdf
14
+ end
15
+ end
16
+ root 'application#main'
17
+ end
@@ -0,0 +1,10 @@
1
+ class CreateDocContractContractTemplates < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :doc_contract_contract_templates do |t|
4
+ t.string :name
5
+ t.string :latex_template
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ class AddMarkdownToDocContractContractTemplates < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :doc_contract_contract_templates, :markdown, :text
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddConfigYmlToDocContractContractTemplates < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :doc_contract_contract_templates, :config_yml, :text
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ class CreateDocContractContractInstances < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :doc_contract_contract_instances do |t|
4
+ t.string :name
5
+ t.text :config_yml
6
+ t.belongs_to :contract_template, null: false, foreign_key: {to_table: 'doc_contract_contract_templates'}
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class AddTitlepageBackgroundToContractTemplates < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :doc_contract_contract_templates, :titlepage_background, :string
4
+ end
5
+ end
@@ -0,0 +1,24 @@
1
+ require 'numbers_and_words'
2
+ module DocContract
3
+ class Engine < ::Rails::Engine
4
+ #isolate_namespace self.name.deconstantize.safe_constantize
5
+ isolate_namespace DocContract
6
+ initializer "doc_contract.assets.precompile" do |main_app|
7
+ #app.config.assets.precompile << "config/engine_name_manifest.js"
8
+ main_app.config.assets.precompile << "doc_contract/application.css"
9
+ main_app.config.assets.precompile << "doc_contract/application.js"
10
+ main_app.config.doc_contract = ActiveSupport::OrderedOptions.new
11
+ main_app.config.doc_contract.show_readme_on_main_page = true
12
+ main_app.config.doc_contract.link_home_content = '<i class="arrow left icon"></i> Back'
13
+ end
14
+
15
+ # add migrations to containing application
16
+ initializer 'doc_contract.append_migrations' do |app|
17
+ unless app.root.to_s.match root.to_s
18
+ config.paths["db/migrate"].expanded.each do |expanded_path|
19
+ app.config.paths["db/migrate"] << expanded_path
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,99 @@
1
+ module DocContract
2
+ class Handlebars
3
+ COMPILE_ATTRIBUTES = %w[
4
+ title subtitle
5
+ header-left header-center header-right
6
+ footer-left footer-center footer-right
7
+ ]
8
+ class DummyEscaper
9
+ def self.escape(value)
10
+ value
11
+ end
12
+ end
13
+
14
+ def self.renderer
15
+ return @@handlebars_renderer if class_variable_defined? :@@handlebars_renderer
16
+ renderer = ::Handlebars::Handlebars.new
17
+ renderer.set_escaper DummyEscaper # Do not escape HTML
18
+ currency_helper = Proc.new do |context, value, currency_symbol|
19
+ if Integer === value or value.to_i == value
20
+ sprintf("#{currency_symbol} %.0f,-", value) #.gsub(/(\d)(?=\d{3}+,)/, '\1.')
21
+ else
22
+ sprintf("#{currency_symbol} %.2f", value.to_f) #.gsub(/(\d)(?=\d{3}+,)/, '\1.')
23
+ end
24
+ end
25
+ #renderer.register_helper(:euro) do |context, value|
26
+ # if Integer === value or value.to_i == value
27
+ # sprintf("&euro; %.0f,-", value) #.gsub(/(\d)(?=\d{3}+,)/, '\1.')
28
+ # else
29
+ # sprintf("&euro; %.2f", value.to_f) #.gsub(/(\d)(?=\d{3}+,)/, '\1.')
30
+ # end
31
+ #end
32
+ eval_boolean = Proc.new do |context, values, compare_lambda|
33
+ blocks, comparables = values.partition{|v| v.is_a? ::Handlebars::Tree::Block}
34
+ true_blk, false_blk = blocks
35
+ comparables = comparables.map{|v| v.is_a?(Parslet::Slice) ? v.to_s : v}
36
+ if compare_lambda.arity == 1
37
+ are_equal = compare_lambda.call(comparables)
38
+ else
39
+ are_equal = compare_lambda.call(*comparables)
40
+ end
41
+ if true_blk.items.present? # assumed internal helper usecase without blocks
42
+ are_equal ? true_blk.fn(context) : false_blk.try(:fn, context)
43
+ else
44
+ are_equal
45
+ end
46
+ end
47
+ renderer.register_helper(:euro) { |context, value| currency_helper.call context, value, '&euro;' }
48
+ renderer.register_helper(:dollar) { |context, value| currency_helper.call context, value, '$' }
49
+ renderer.register_helper(:peso) { |context, value| currency_helper.call context, value, '$' }
50
+ renderer.register_helper(:plus) {|context, value, addition, *rest| value.to_f + addition.to_f }
51
+ renderer.register_helper(:sum) {|context, *values, bkl| (values.first.is_a?(Array) ? values.first : values).map(&:to_f).sum }
52
+ renderer.register_helper(:eq) { |context, *values| eval_boolean.call context, values, ->(vals){ vals.uniq.length <= 1 } }
53
+ renderer.register_helper(:neq) { |context, *values| eval_boolean.call context, values, ->(vals){ vals.uniq.length > 1 } }
54
+ renderer.register_helper(:gt) { |context, *values| eval_boolean.call context, values, ->(a, b){ a > b } }
55
+ renderer.register_helper(:includes) { |context, *values| eval_boolean.call context, values, ->(vals){ vals.first.include? vals.last } }
56
+ renderer.register_helper(:map) do |context, array, key|
57
+ return [] unless array.present?
58
+ array.map{|e| e[key.to_s] || e[key.to_sym]}
59
+ end
60
+ renderer.register_helper(:upcase) {|context, value| value.to_s.upcase }
61
+ renderer.register_helper(:downcase) {|context, value| value.to_s.downcase }
62
+ renderer.register_helper(:to_sentence) do |context, array, nester|
63
+ case nester
64
+ when String, Parslet::Slice
65
+ array.map{|e| e[nester.to_s] || e[nester.to_sym]}.to_sentence
66
+ else
67
+ array.to_sentence
68
+ end
69
+ end
70
+ renderer.register_helper(:to_words) { |context, value| value.to_words }
71
+ @@handlebars_renderer = renderer
72
+ end
73
+
74
+ def self.compile(text, object, process_attributes: true)
75
+ object ||= {}
76
+ if process_attributes
77
+ object.stringify_keys!
78
+ enrich_object(object)
79
+ end
80
+ compiled = renderer.compile(text)
81
+ compiled.call(object)
82
+ end
83
+
84
+ def self.enrich_object(object)
85
+ object['today'] = Date.today.iso8601 if object['today'].blank?
86
+ object.keys.each do |k|
87
+ if k =~ /_items$/ and object[k].is_a?(Array)
88
+ amounts_sum = object[k].map{|o| (o[:amount] || o['amount']).to_f}.sum
89
+ object["#{k}_total"] = amounts_sum
90
+ end
91
+ if COMPILE_ATTRIBUTES.include? k
92
+ #TODO check self reference, maybe even circular?
93
+ object[k] = compile(object[k], object, process_attributes: false)
94
+ end
95
+ end
96
+ object
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,3 @@
1
+ module DocContract
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,9 @@
1
+ require "doc_contract/version"
2
+ require "doc_contract/engine"
3
+ require "doc_contract/handlebars"
4
+ require 'ruby-handlebars'
5
+ require 'open3'
6
+
7
+ module DocContract
8
+ # Your code goes here...
9
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :doc_contract do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,254 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: doc_contract
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Benjamin ter Kuile
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-03-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-handlebars
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: redcarpet
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: cancancan
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: ransack
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: kaminari
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: numbers_and_words
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: factory_bot_rails
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: jquery-rails
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: coffee-rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Create nice and easy contracts based on pandoc which uses LaTeX
168
+ email:
169
+ - bterkuile@gmail.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - MIT-LICENSE
175
+ - README.md
176
+ - Rakefile
177
+ - app/assets/config/doc_contract_manifest.js
178
+ - app/assets/javascripts/doc_contract/application.coffee
179
+ - app/assets/stylesheets/doc_contract/application.sass
180
+ - app/assets/stylesheets/doc_contract/pandoc.css
181
+ - app/controllers/concerns/doc_contract/shared_template_and_instance_methods.rb
182
+ - app/controllers/doc_contract/application_controller.rb
183
+ - app/controllers/doc_contract/contract_instances_controller.rb
184
+ - app/controllers/doc_contract/contract_templates_controller.rb
185
+ - app/helpers/doc_contract/application_helper.rb
186
+ - app/models/concerns/yaml_validator.rb
187
+ - app/models/doc_contract/contract_instance.rb
188
+ - app/models/doc_contract/contract_template.rb
189
+ - app/views/doc_contract/application/_button-destroy-record.html.slim
190
+ - app/views/doc_contract/application/_button-edit-record.html.slim
191
+ - app/views/doc_contract/application/_button-new-record.html.slim
192
+ - app/views/doc_contract/application/_button-preview-html.html.slim
193
+ - app/views/doc_contract/application/_button-preview-markdown.html.slim
194
+ - app/views/doc_contract/application/_button-preview-pdf.html.slim
195
+ - app/views/doc_contract/application/_definition_table_attribute_errors.html.slim
196
+ - app/views/doc_contract/application/_messages.html.slim
197
+ - app/views/doc_contract/application/_navigation.html.slim
198
+ - app/views/doc_contract/application/main.html.slim
199
+ - app/views/doc_contract/contract_instances/_form.html.slim
200
+ - app/views/doc_contract/contract_instances/edit.html.slim
201
+ - app/views/doc_contract/contract_instances/index.html.slim
202
+ - app/views/doc_contract/contract_instances/new.html.slim
203
+ - app/views/doc_contract/contract_instances/show.html.slim
204
+ - app/views/doc_contract/contract_templates/_form.html.slim
205
+ - app/views/doc_contract/contract_templates/edit.html.slim
206
+ - app/views/doc_contract/contract_templates/index.html.slim
207
+ - app/views/doc_contract/contract_templates/new.html.slim
208
+ - app/views/doc_contract/contract_templates/show.html.slim
209
+ - app/views/doc_contract/kaminari/_first_page.html.slim
210
+ - app/views/doc_contract/kaminari/_gap.html.slim
211
+ - app/views/doc_contract/kaminari/_last_page.html.slim
212
+ - app/views/doc_contract/kaminari/_next_page.html.slim
213
+ - app/views/doc_contract/kaminari/_page.html.slim
214
+ - app/views/doc_contract/kaminari/_paginator.html.slim
215
+ - app/views/doc_contract/kaminari/_prev_page.html.slim
216
+ - app/views/layouts/doc_contract/application.html.slim
217
+ - config/initializers/human_plural.rb
218
+ - config/locales/en.yml
219
+ - config/routes.rb
220
+ - db/migrate/20220118150923_create_doc_contract_contract_templates.rb
221
+ - db/migrate/20220121160034_add_markdown_to_doc_contract_contract_templates.rb
222
+ - db/migrate/20220121165825_add_config_yml_to_doc_contract_contract_templates.rb
223
+ - db/migrate/20220122151402_create_doc_contract_contract_instances.rb
224
+ - db/migrate/20220125183437_add_titlepage_background_to_contract_templates.rb
225
+ - lib/doc_contract.rb
226
+ - lib/doc_contract/engine.rb
227
+ - lib/doc_contract/handlebars.rb
228
+ - lib/doc_contract/version.rb
229
+ - lib/tasks/doc_contract_tasks.rake
230
+ homepage: http://mozolutions.com
231
+ licenses:
232
+ - MIT
233
+ metadata:
234
+ homepage_uri: http://mozolutions.com
235
+ post_install_message:
236
+ rdoc_options: []
237
+ require_paths:
238
+ - lib
239
+ required_ruby_version: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ required_rubygems_version: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - ">="
247
+ - !ruby/object:Gem::Version
248
+ version: '0'
249
+ requirements: []
250
+ rubygems_version: 3.3.6
251
+ signing_key:
252
+ specification_version: 4
253
+ summary: Create nice and easy contracts based on pandoc
254
+ test_files: []