jekyll-rdf 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 110cb3800452fb5622a7f01dd39c367ed6d4a181
4
+ data.tar.gz: d7bd153e3055b51569e85fcaae039db8b44e60ad
5
+ SHA512:
6
+ metadata.gz: 8ace2caa161e8103fdb6d2de6f60fb570a0103fba2c9e6a16e571e68fbab0ba67d7a6d865d97aa5fa470d851998edaa60853015278824b74660c60dc7596c2ee
7
+ data.tar.gz: eeef2100f84e9d3b2272ed15e41f95f8386d8319e87068102ea29d50dd529c1ab35cbea5c48e0a4761511b0aef64fa98e6f082389a48bf8ac67deca61cdbb08c
data/lib/jekyll-rdf.rb ADDED
@@ -0,0 +1,19 @@
1
+ ##
2
+ # JekyllRdf converts RDF data into static websites
3
+ #
4
+ #
5
+ require 'jekyll'
6
+ require 'linkeddata'
7
+ require 'sparql'
8
+
9
+
10
+ require 'jekyll/drops/rdf_term'
11
+ require 'jekyll/drops/rdf_statement'
12
+ require 'jekyll/drops/rdf_literal'
13
+ require 'jekyll/drops/rdf_resource'
14
+ require 'jekyll/filters/rdf_sparql_query'
15
+ require 'jekyll/filters/rdf_property'
16
+ require 'jekyll/filters/rdf_property_list'
17
+ require 'jekyll/rdf_main_generator'
18
+ require 'jekyll/rdf_page_data'
19
+ require 'jekyll/rdf_template_mapper'
@@ -0,0 +1,18 @@
1
+ module Jekyll
2
+ module Drops
3
+
4
+ ##
5
+ # Represents an RDF literal to the Liquid template engine
6
+ #
7
+ class RdfLiteral < RdfTerm
8
+
9
+ ##
10
+ # Return a user-facing string representing this RdfLiteral
11
+ #
12
+ def name
13
+ term.to_s
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,153 @@
1
+ module Jekyll
2
+ module Drops
3
+ class RdfResource < RdfTerm
4
+
5
+ ##
6
+ # The Jekyll::Site of this Jekyll::Drops::RdfResource
7
+ #
8
+ attr_accessor :site
9
+
10
+ ##
11
+ # The Jekyll::RdfPageData of this Jekyll::Drops::RdfResource
12
+ #
13
+ attr_accessor :page
14
+
15
+ ##
16
+ # Return a list of Jekyll::Drops::RdfStatements whose subject, predicate or object is the RDF resource represented by the receiver
17
+ #
18
+ def statements
19
+ @statements ||= statements_as_subject + statements_as_predicate + statements_as_object
20
+ end
21
+
22
+ ##
23
+ # Return a list of Jekyll::Drops::RdfStatements whose subject is the RDF resource represented by the receiver
24
+ #
25
+ def statements_as_subject
26
+ @statements_as_subject ||= statements_as :subject
27
+ end
28
+
29
+ ##
30
+ # Return a list of Jekyll::Drops::RdfStatements whose predicate is the RDF resource represented by the receiver
31
+ #
32
+ def statements_as_predicate
33
+ @statements_as_predicate ||= statements_as :predicate
34
+ end
35
+
36
+ ##
37
+ # Return a list of Jekyll::Drops::RdfStatements whose object is the RDF resource represented by the receiver
38
+ #
39
+ def statements_as_object
40
+ @statements_as_object ||= statements_as :object
41
+ end
42
+
43
+ ##
44
+ # Return a filename corresponding to the RDF resource represented by the receiver. The mapping between RDF resources and filenames should be bijective.
45
+ #
46
+ def filename(domain_name, baseurl)
47
+ @filename ||= generate_file_name(domain_name, baseurl)
48
+ end
49
+
50
+ ##
51
+ # types finds the type and superclasses of the resource
52
+ #
53
+ def types
54
+ @types ||= begin
55
+ types = [ term.to_s ]
56
+ t = statements_as(:subject).find{ |s| s.predicate.term.to_s=="http://www.w3.org/1999/02/22-rdf-syntax-ns#type" }
57
+ if t
58
+ types << t.object.term.to_s
59
+ t = t.object
60
+ while t.super_class
61
+ s = t.super_class
62
+ types << s.term.to_s
63
+ t = s
64
+ end
65
+ end
66
+ types
67
+ end
68
+ end
69
+
70
+ ##
71
+ # Return the first super class resource of the receiver or nil, if no super class resource can be found
72
+ #
73
+ def super_class
74
+ s = statements_as(:subject).find{ |s| s.predicate.term.to_s=="http://www.w3.org/2000/01/rdf-schema#subClassOf" }
75
+ if s
76
+ s.object
77
+ end
78
+ end
79
+
80
+ ##
81
+ # Return a user-facing string representing this RdfResource
82
+ #
83
+ def name
84
+ @name ||= begin
85
+ n = statements_as(:subject).find{ |s| s.predicate.term.to_s=="http://xmlns.com/foaf/0.1/name" }
86
+ n ? n.object.name : term.to_s
87
+ end
88
+ end
89
+
90
+ ##
91
+ # Return the URL of the page representing this RdfResource
92
+ #
93
+ def page_url
94
+ page ? page.url.chomp('index.html') : term.to_s
95
+ end
96
+
97
+ ##
98
+ # Return a list of RDF statements where the represented RDF resource plays a role
99
+ # * +role+ - which role the represented RDF resource should play:
100
+ # :subject ::
101
+ # Return a list of Jekyll::Drops::RdfStatements whose subject is the RDF resource represented by the receiver
102
+ # :predicate ::
103
+ # Return a list of Jekyll::Drops::RdfStatements whose predicate is the RDF resource represented by the receiver
104
+ # :object ::
105
+ # Return a list of Jekyll::Drops::RdfStatements whose object is the RDF resource represented by the receiver
106
+ #
107
+ def statements_as(role)
108
+ graph.query(role.to_sym => term).map do |statement|
109
+ RdfStatement.new(statement, graph, site)
110
+ end
111
+ end
112
+
113
+ private
114
+ ##
115
+ # Generate a filename corresponding to the RDF resource represented by the receiver. The mapping between RDF resources and filenames should be bijective. If the url of the rdf is the same as of the hosting site it will be omitted.
116
+ # * +domain_name+
117
+ #
118
+ def generate_file_name(domain_name, baseurl)
119
+ begin
120
+ uri = URI::split(term.to_s)
121
+ file_name = "rdfsites/" # in this directory all external RDF sites are stored
122
+ if (uri[2] == domain_name)
123
+ file_name = ""
124
+ uri[0] = nil
125
+ uri[2] = nil
126
+ uri[5] = uri[5].sub(baseurl,'')
127
+ end
128
+ (0..8).each do |i|
129
+ if uri[i]
130
+ case i
131
+ when 2
132
+ file_name += "#{uri[i].gsub('.','/')}/"
133
+ when 8
134
+ file_name = file_name[0..-2]
135
+ file_name += "##{uri[i]}"
136
+ else
137
+ file_name += "#{uri[i]}/"
138
+ end
139
+ end
140
+ end
141
+ unless file_name[-1] == '/'
142
+ file_name += '/'
143
+ end
144
+ file_name += 'index.html'
145
+ file_name.gsub('//','/')
146
+ rescue URI::InvalidURIError
147
+ file_name = "rdfsites/blanknode/#{term.to_s}/index.html"
148
+ end
149
+ end
150
+
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,37 @@
1
+ module Jekyll
2
+ module Drops
3
+
4
+ ##
5
+ # Represents an RDF statement to the Liquid template engine
6
+ #
7
+ class RdfStatement < Liquid::Drop
8
+
9
+ ##
10
+ # The subject RdfTerm of this RDF statement
11
+ #
12
+ attr_reader :subject
13
+
14
+ ##
15
+ # The predicate RdfTerm of this RDF statement
16
+ #
17
+ attr_reader :predicate
18
+
19
+ ##
20
+ # The object RdfTerm of this RDF statement
21
+ #
22
+ attr_reader :object
23
+
24
+ ##
25
+ # Create a new Jekyll::Drops::RdfStatement
26
+ #
27
+ # * +statement+ - The statement to be represented
28
+ # * +graph+ - The RDF::Graph which contains the +statement+
29
+ # * +site+ - The Jekyll::Site to be enriched
30
+ def initialize(statement, graph, site)
31
+ @subject ||= Jekyll::Drops::RdfTerm.build_term_drop(statement.subject, graph, site)
32
+ @predicate ||= Jekyll::Drops::RdfTerm.build_term_drop(statement.predicate, graph, site)
33
+ @object ||= Jekyll::Drops::RdfTerm.build_term_drop(statement.object, graph, site)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,60 @@
1
+ module Jekyll
2
+ module Drops
3
+
4
+ ##
5
+ # Represents an RDF term to the Liquid template engine
6
+ #
7
+ class RdfTerm < Liquid::Drop
8
+
9
+ ##
10
+ # The represented RDF term
11
+ #
12
+ attr_reader :term
13
+
14
+ ##
15
+ # The RDF::Graph which contains the represented +term+
16
+ #
17
+ attr_reader :graph
18
+
19
+ ##
20
+ # Create a new Jekyll::Drops::RdfTerm
21
+ #
22
+ # * +term+ - The term to be represented
23
+ # * +graph+ - The RDF::Graph which contains the represented +term+
24
+ #
25
+ def initialize(term, graph)
26
+ @term ||= term
27
+ @graph ||= graph
28
+ end
29
+
30
+ ##
31
+ # Convert this RdfTerm into a human-readable string
32
+ #
33
+ def to_s
34
+ name
35
+ end
36
+
37
+ ##
38
+ # Convert an RDF term into a new Jekyll::Drops::RdfTerm
39
+ #
40
+ # * +term+ - The term to be represented
41
+ # * +graph+ - The RDF::Graph which contains the represented +term+
42
+ # * +site+ - The Jekyll::Site to be enriched
43
+ #
44
+ def self.build_term_drop(term, graph, site)
45
+ case term
46
+ when RDF::URI, RDF::Node
47
+ if site
48
+ resource = site.data['resources'].find{ |r| r.term == term }
49
+ end
50
+ resource ? resource : RdfResource.new(term, graph)
51
+ when RDF::Literal
52
+ return RdfLiteral.new(term, graph)
53
+ else
54
+ return nil
55
+ end
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,22 @@
1
+ module Jekyll
2
+ module RdfProperty
3
+
4
+ def rdf_property(input, params)
5
+ return input unless input.is_a?(Jekyll::Drops::RdfResource)
6
+ begin
7
+ params = params.split(",")
8
+ results = input.page.data['rdf'].statements_as_subject.select{ |s| s.predicate.term.to_s == params[0] }
9
+ lang = params[1] || input.site.config['language']
10
+ if results.count > 1 && results.first.object.term.is_a?(RDF::Term)
11
+ p = results.find{ |s| s.object.term.language == lang }
12
+ end
13
+ p = results.first unless p
14
+ return unless p
15
+ (p.object.name).to_s
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+
22
+ Liquid::Template.register_filter(Jekyll::RdfProperty)
@@ -0,0 +1,16 @@
1
+ module Jekyll
2
+ module RdfPropertyList
3
+
4
+ def rdf_property_list(input, property)
5
+ return input unless input.is_a?(Jekyll::Drops::RdfResource)
6
+ begin
7
+ result = input.page.data['rdf'].statements_as_subject.select{ |s| s.predicate.term.to_s == property }.map{|p| p.object.name}
8
+ return unless result
9
+ result
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+
16
+ Liquid::Template.register_filter(Jekyll::RdfPropertyList)
@@ -0,0 +1,20 @@
1
+ module Jekyll
2
+ module RdfSparqlQuery
3
+
4
+ def sparql_query(input, query)
5
+ return input unless input.is_a?(Jekyll::Drops::RdfResource)
6
+ query.gsub!('?resourceUri', "<#{input.term.to_s}>")
7
+ begin
8
+ result = input.site.data['sparql'].query(query).map do |solution|
9
+ hsh = solution.to_hash
10
+ hsh.update(hsh){ |k,v| Jekyll::Drops::RdfTerm.build_term_drop(v, input.graph, input.site) }
11
+ hsh.collect{|k,v| [k.to_s, v]}.to_h
12
+ end
13
+ return result
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+
20
+ Liquid::Template.register_filter(Jekyll::RdfSparqlQuery)
@@ -0,0 +1,85 @@
1
+ module Jekyll
2
+
3
+ ##
4
+ #
5
+ # Jekyll::RdfMainGenerator enriches a Jekyll::Site with RDF triples
6
+ #
7
+ class RdfMainGenerator < Jekyll::Generator
8
+ safe true
9
+ priority :highest
10
+
11
+ ##
12
+ # #generate performs the enrichment of a Jekyll::Site with rdf triples
13
+ #
14
+ # * +site+ - The Jekyll::Site whose #data is to be enriched
15
+ #
16
+ def generate(site)
17
+ config = site.config.fetch('jekyll_rdf')
18
+
19
+ graph = RDF::Graph.load(config['path'])
20
+ sparql = SPARQL::Client.new(graph)
21
+
22
+ # restrict RDF graph with restriction
23
+ resources = extract_resources(config['restriction'], config['include_blank'], graph, sparql)
24
+
25
+ site.data['sparql'] = sparql
26
+ site.data['resources'] = []
27
+
28
+ mapper = Jekyll::RdfTemplateMapper.new(config['template_mappings'], config['default_template'])
29
+
30
+ # create RDF pages for each URI
31
+ resources.each do |uri|
32
+ resource = Jekyll::Drops::RdfResource.new(uri, graph)
33
+ site.pages << RdfPageData.new(site, site.source, resource, mapper)
34
+ end
35
+ end
36
+
37
+ ##
38
+ # #extract_resources returns resources from an RDF graph.
39
+ #
40
+ # Literals are omitted.
41
+ # Blank nodes are only returned if +include_blank+ is true.
42
+ # Duplicate nodes are removed.
43
+ #
44
+ # * +selection+ - choose any of the following:
45
+ # nil ::
46
+ # no restrictions, return subjects, predicates, objects
47
+ # "subjects" ::
48
+ # return only subjects
49
+ # "predicates" ::
50
+ # return only predicates
51
+ # "objects" ::
52
+ # return only objects
53
+ # Otherwise ::
54
+ # consider +selection+ to be a SPARQL query and return answer set to this SPARQL query
55
+ # * +include_blank+ - If true, blank nodes are also returned, otherwise blank nodes are omitted
56
+ # * +graph+ - The RDF graph to restrict
57
+ # * +sparql+ - The SPARQL client to run queries against
58
+ #
59
+ def extract_resources(selection, include_blank, graph, sparql)
60
+
61
+ case selection
62
+ when nil # Config parameter not present
63
+ object_resources = extract_resources("objects", include_blank, graph, sparql)
64
+ subject_resources = extract_resources("subjects", include_blank, graph, sparql)
65
+ predicate_resources = extract_resources("predicates", include_blank, graph, sparql)
66
+ return object_resources.concat(subject_resources).concat(predicate_resources).uniq
67
+ when "objects"
68
+ graph.objects
69
+ when "subjects"
70
+ graph.subjects
71
+ when "predicates"
72
+ graph.predicates
73
+ else
74
+ # Custom query
75
+ sparql.query(selection).map{ |sol| sol[:resourceUri] }
76
+ end.reject do |s| # Reject literals
77
+ s.class <= RDF::Literal
78
+ end.select do |s| # Select URIs and blank nodes in case of include_blank
79
+ include_blank || s.class == RDF::URI
80
+ end.uniq
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -0,0 +1,35 @@
1
+ module Jekyll
2
+
3
+ ##
4
+ # JekyllRdf::RdfPageData creates pages for each RDF resource using a given template
5
+ #
6
+ class RdfPageData < Jekyll::Page
7
+
8
+ ##
9
+ # initialize initializes the page
10
+ # * +site+ - The Jekyll site we want to enrich with RDF data
11
+ # * +base+ - The base of the site
12
+ # * +resource+ - The RDF resource for which the page is rendered
13
+ # * +mapper+ - The layout-mapping
14
+ #
15
+ def initialize(site, base, resource, mapper)
16
+ @site = site
17
+ @base = base
18
+ @dir = ""
19
+ @name = resource.filename(URI::split(site.config['url'])[2], site.config['baseurl'])
20
+ self.process(@name)
21
+
22
+ template = mapper.map(resource)
23
+ self.read_yaml(File.join(base, '_layouts'), template)
24
+
25
+ self.data['title'] = resource.name
26
+ self.data['rdf'] = resource
27
+
28
+ resource.page = self
29
+ resource.site = site
30
+ site.data['resources'] << resource
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,40 @@
1
+ module Jekyll
2
+
3
+ ##
4
+ # Jekyll::RdfTemplateMapper maps resources to templates
5
+ #
6
+ class RdfTemplateMapper
7
+
8
+ ##
9
+ # A Hash mapping a type resource to a template name
10
+ attr_accessor :resources_to_templates
11
+
12
+ ##
13
+ # Default template name
14
+ attr_accessor :default_template
15
+
16
+ ##
17
+ # Create a new Jekyll::RdfTemplateMapper
18
+ #
19
+ # * +resources_to_templates+ - A Hash mapping a type resource to a template name
20
+ # * +default_template+ - Default template name
21
+ def initialize(resources_to_templates, default_template)
22
+ @resources_to_templates = resources_to_templates
23
+ @default_template = default_template
24
+ end
25
+
26
+ ##
27
+ # Maps a resource to a template name.
28
+ #
29
+ # Returns the template name of one of the +resource+'s types, if available. Returns the default template name otherwise.
30
+ def map(resource)
31
+ resource.types.each do |type|
32
+ tmpl = resources_to_templates[type]
33
+ return tmpl unless tmpl.nil?
34
+ end
35
+ return default_template
36
+ end
37
+
38
+ end
39
+
40
+ end
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-rdf
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Elias Saalmann
8
+ - Christian Frommert
9
+ - Simon Jakobi
10
+ - Arne Jonas Präger
11
+ - Maxi Bornmann
12
+ - Georg Hackel
13
+ - Eric Füg
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+ date: 2016-05-25 00:00:00.000000000 Z
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: linkeddata
21
+ requirement: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.99'
26
+ type: :runtime
27
+ prerelease: false
28
+ version_requirements: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.99'
33
+ - !ruby/object:Gem::Dependency
34
+ name: sparql
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.99'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.99'
47
+ - !ruby/object:Gem::Dependency
48
+ name: jekyll
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.1'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.1'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '10.1'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '10.1'
75
+ - !ruby/object:Gem::Dependency
76
+ name: coveralls
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.8'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.8'
89
+ - !ruby/object:Gem::Dependency
90
+ name: test-unit
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.0'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: shoulda-context
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.1'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.1'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rspec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: pry-byebug
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '3.4'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.4'
145
+ description: Generate static sites with Jekyll based on RDF data
146
+ email: mail@esaalmann.de
147
+ executables: []
148
+ extensions: []
149
+ extra_rdoc_files: []
150
+ files:
151
+ - lib/jekyll-rdf.rb
152
+ - lib/jekyll/drops/rdf_literal.rb
153
+ - lib/jekyll/drops/rdf_resource.rb
154
+ - lib/jekyll/drops/rdf_statement.rb
155
+ - lib/jekyll/drops/rdf_term.rb
156
+ - lib/jekyll/filters/rdf_property.rb
157
+ - lib/jekyll/filters/rdf_property_list.rb
158
+ - lib/jekyll/filters/rdf_sparql_query.rb
159
+ - lib/jekyll/rdf_main_generator.rb
160
+ - lib/jekyll/rdf_page_data.rb
161
+ - lib/jekyll/rdf_template_mapper.rb
162
+ homepage: http://pcai042.informatik.uni-leipzig.de/~dtp16/
163
+ licenses:
164
+ - MIT
165
+ metadata: {}
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 2.4.5
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: Hypertext Publication System for Templates Resource Rendering
186
+ test_files: []