aspen-cli 0.1.2

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 (86) hide show
  1. checksums.yaml +7 -0
  2. data/.github/FUNDING.yml +12 -0
  3. data/.gitignore +16 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +175 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +84 -0
  10. data/Rakefile +10 -0
  11. data/aspen.gemspec +48 -0
  12. data/bin/aspen +3 -0
  13. data/bin/console +22 -0
  14. data/bin/setup +8 -0
  15. data/lib/aspen/abstract_parser.rb +72 -0
  16. data/lib/aspen/abstract_statement.rb +34 -0
  17. data/lib/aspen/actions/compile.rb +31 -0
  18. data/lib/aspen/actions/push.rb +39 -0
  19. data/lib/aspen/actions/watch.rb +55 -0
  20. data/lib/aspen/actions.rb +8 -0
  21. data/lib/aspen/adapters.rb +38 -0
  22. data/lib/aspen/ast/nodes/attribute.rb +16 -0
  23. data/lib/aspen/ast/nodes/comment.rb +15 -0
  24. data/lib/aspen/ast/nodes/content.rb +17 -0
  25. data/lib/aspen/ast/nodes/custom_statement.rb +19 -0
  26. data/lib/aspen/ast/nodes/edge.rb +15 -0
  27. data/lib/aspen/ast/nodes/label.rb +15 -0
  28. data/lib/aspen/ast/nodes/narrative.rb +15 -0
  29. data/lib/aspen/ast/nodes/node.rb +20 -0
  30. data/lib/aspen/ast/nodes/statement.rb +17 -0
  31. data/lib/aspen/ast/nodes/type.rb +46 -0
  32. data/lib/aspen/ast.rb +18 -0
  33. data/lib/aspen/cli/commands/build.rb +26 -0
  34. data/lib/aspen/cli/commands/build_steps.rb +204 -0
  35. data/lib/aspen/cli/commands/compile.rb +27 -0
  36. data/lib/aspen/cli/commands/generate.rb +23 -0
  37. data/lib/aspen/cli/commands/new.rb +115 -0
  38. data/lib/aspen/cli/commands/push.rb +15 -0
  39. data/lib/aspen/cli/commands/version.rb +15 -0
  40. data/lib/aspen/cli/commands/watch.rb +30 -0
  41. data/lib/aspen/cli/commands.rb +28 -0
  42. data/lib/aspen/cli/templates/.gitignore +6 -0
  43. data/lib/aspen/cli/templates/airtable.yml +1 -0
  44. data/lib/aspen/cli/templates/convert +16 -0
  45. data/lib/aspen/cli/templates/db.yml.erb +22 -0
  46. data/lib/aspen/cli/templates/docker-compose.yml +23 -0
  47. data/lib/aspen/cli/templates/manifest.yml.erb +31 -0
  48. data/lib/aspen/cli.rb +9 -0
  49. data/lib/aspen/compiler.rb +209 -0
  50. data/lib/aspen/contracts/default_attribute_contract.rb +29 -0
  51. data/lib/aspen/contracts.rb +1 -0
  52. data/lib/aspen/conversion.rb +43 -0
  53. data/lib/aspen/custom_grammar/ast/nodes/bare.rb +17 -0
  54. data/lib/aspen/custom_grammar/ast/nodes/capture_segment.rb +19 -0
  55. data/lib/aspen/custom_grammar/ast/nodes/content.rb +17 -0
  56. data/lib/aspen/custom_grammar/ast/nodes/expression.rb +17 -0
  57. data/lib/aspen/custom_grammar/ast.rb +13 -0
  58. data/lib/aspen/custom_grammar/compiler.rb +80 -0
  59. data/lib/aspen/custom_grammar/grammar.rb +78 -0
  60. data/lib/aspen/custom_grammar/lexer.rb +76 -0
  61. data/lib/aspen/custom_grammar/matcher.rb +43 -0
  62. data/lib/aspen/custom_grammar/parser.rb +51 -0
  63. data/lib/aspen/custom_grammar.rb +23 -0
  64. data/lib/aspen/custom_statement.rb +35 -0
  65. data/lib/aspen/discourse.rb +122 -0
  66. data/lib/aspen/edge.rb +35 -0
  67. data/lib/aspen/errors.rb +158 -0
  68. data/lib/aspen/helpers.rb +17 -0
  69. data/lib/aspen/lexer.rb +195 -0
  70. data/lib/aspen/list.rb +19 -0
  71. data/lib/aspen/node.rb +53 -0
  72. data/lib/aspen/parser.rb +183 -0
  73. data/lib/aspen/renderers/abstract_renderer.rb +22 -0
  74. data/lib/aspen/renderers/cypher_base_renderer.rb +36 -0
  75. data/lib/aspen/renderers/cypher_batch_renderer.rb +55 -0
  76. data/lib/aspen/renderers/cypher_renderer.rb +18 -0
  77. data/lib/aspen/renderers/gexf_renderer.rb +47 -0
  78. data/lib/aspen/renderers/json_renderer.rb +40 -0
  79. data/lib/aspen/renderers.rb +9 -0
  80. data/lib/aspen/schemas/discourse_schema.rb +64 -0
  81. data/lib/aspen/schemas/grammar_schema.rb +24 -0
  82. data/lib/aspen/statement.rb +42 -0
  83. data/lib/aspen/system_default.rb +12 -0
  84. data/lib/aspen/version.rb +3 -0
  85. data/lib/aspen.rb +65 -0
  86. metadata +300 -0
@@ -0,0 +1,55 @@
1
+ module Aspen
2
+ module Renderers
3
+ class CypherBatchRenderer < AbstractRenderer
4
+
5
+ # Sorts statements by signature, where signature could be
6
+ # (Person)-[KNOWS]-(Person) or (Company)-[HIRED]->(Person).
7
+ def render
8
+ groups = statements.inject(
9
+ Hash.new { |h, k| h[k] = [] }
10
+ ) do |memo, statement|
11
+ memo[statement.signature] << statement
12
+ memo
13
+ end
14
+ groups.inject([]) do |memo, elem|
15
+ signature, statements = elem
16
+ if signature == "custom"
17
+ # Delegate custom statements to the base renderer
18
+ memo << CypherBaseRenderer.new(statements, environment).render
19
+ else
20
+ first = statements.first
21
+ values = statements.map do |statement|
22
+ "{from: #{statement.origin.attributes.values.first.inspect}, to: #{statement.target.attributes.values.first.inspect}}"
23
+ end.join(",\n ")
24
+ memo << ERB.new(template).result_with_hash(
25
+ signature: signature,
26
+ values: values,
27
+ origin_label: first.origin.label,
28
+ target_label: first.target.label,
29
+ origin_attr: first.origin.attributes.keys.first,
30
+ target_attr: first.target.attributes.keys.first,
31
+ edge_cypher: first.edge.to_cypher,
32
+ )
33
+ end
34
+ memo
35
+ end.join("\n\n")
36
+ end
37
+
38
+ def template
39
+ <<~TEMPLATE
40
+ // <%= signature %>
41
+
42
+ WITH [
43
+ <%= values %>
44
+ ] as values
45
+
46
+ UNWIND values as row
47
+ MERGE (from:<%= origin_label %> {<%= origin_attr %>: row.from})
48
+ MERGE (to:<%= target_label %> {<%= target_attr %>: row.to})
49
+ MERGE (from)<%= edge_cypher %>(to)
50
+ TEMPLATE
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,18 @@
1
+ require 'aspen/renderers/cypher_base_renderer'
2
+ require 'aspen/renderers/cypher_batch_renderer'
3
+
4
+ module Aspen
5
+ module Renderers
6
+ class CypherRenderer < AbstractRenderer
7
+
8
+ def render
9
+ if environment[:batch].nil? || environment[:batch]
10
+ CypherBatchRenderer.new(statements).render
11
+ else
12
+ CypherBaseRenderer.new(statements).render
13
+ end
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,47 @@
1
+ module Aspen
2
+ module Renderers
3
+ class GexfRenderer < AbstractRenderer
4
+
5
+ def render
6
+ joiner = "\n "
7
+ <<~GEXF
8
+ <gexf xmlns="http://www.gexf.net/1.2draft" version="1.2">
9
+ <graph mode="static" defaultedgetype="directed">
10
+ <nodes>
11
+ #{nodes.map(&:strip).join(joiner)}
12
+ </nodes>
13
+ <edges>
14
+ #{relationships.map(&:strip).join(joiner)}
15
+ </edges>
16
+ </graph>
17
+ </gexf>
18
+ GEXF
19
+ end
20
+
21
+ def nodes
22
+ statements.flat_map(&:nodes).map do |node|
23
+ attrs = node.attributes.map do |k, v|
24
+ "#{k}=\"#{v}\""
25
+ end.join(" ")
26
+ <<~GEXF
27
+ <node id="#{node.nickname}" label="#{node.label}" #{attrs}>
28
+ GEXF
29
+ end
30
+ end
31
+
32
+ def relationships
33
+ # @todo: Add in Custom Statements
34
+ statements.map.with_index do |st, id|
35
+ if st.is_a? Aspen::CustomStatement
36
+ next # NO OP
37
+ else
38
+ <<~GEXF
39
+ <edge id="#{id}" source="#{st.origin.nickname}" target="#{st.target.nickname}" label="#{st.edge.label}">
40
+ GEXF
41
+ end
42
+ end.compact
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,40 @@
1
+ module Aspen
2
+ module Renderers
3
+ class JsonRenderer < AbstractRenderer
4
+
5
+ def render
6
+ {
7
+ nodes: nodes,
8
+ edges: relationships
9
+ }.to_json
10
+ end
11
+
12
+ def nodes
13
+ statements.flat_map(&:nodes).map do |node|
14
+ node.attributes.merge({
15
+ id: node.nickname,
16
+ label: node.label
17
+ })
18
+ end
19
+ end
20
+
21
+ def relationships
22
+ statements.map.with_index do |st, id|
23
+ # @todo: Add in Custom Statements
24
+ if st.is_a? Aspen::CustomStatement
25
+ next # NO OP
26
+ else
27
+ {
28
+ id: "e#{id}",
29
+ source: st.origin.nickname,
30
+ target: st.target.nickname,
31
+ label: st.edge.label,
32
+ reciprocal: st.edge.reciprocal?
33
+ }
34
+ end
35
+ end.compact
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,9 @@
1
+ module Aspen
2
+ module Renderers
3
+ end
4
+ end
5
+
6
+ require 'aspen/renderers/abstract_renderer'
7
+ require 'aspen/renderers/cypher_renderer'
8
+ require 'aspen/renderers/gexf_renderer'
9
+ require 'aspen/renderers/json_renderer'
@@ -0,0 +1,64 @@
1
+ =begin
2
+
3
+ Example:
4
+
5
+ default:
6
+ label: Person
7
+ attribute: name (text)
8
+ attributes:
9
+ Event: title (text)
10
+ Company: year_founded (number)
11
+
12
+ only:
13
+ nodes: Person, Company
14
+ relationships: knows, works for
15
+
16
+ reciprocal: knows
17
+
18
+ grammar:
19
+ -
20
+ match: (Person a) knows (Person b).
21
+ template: {{{a}}}-[:KNOWS]->{{{b}}}.
22
+
23
+ =end
24
+
25
+ require 'dry/schema'
26
+ require 'aspen/schemas/grammar_schema'
27
+
28
+ module Aspen
29
+ module Schemas
30
+
31
+ LABEL = /^([A-Z][A-Za-z0-9]+)+$/
32
+ LABEL_LIST = /^([A-Z][A-Za-z0-9]+)(,\s*([A-Z][A-Za-z0-9]+))*$/
33
+ EDGE_LIST = /^([A-Za-z\s]+)(,\s*[A-Za-z\s]+)*$/
34
+ IDENT = /^[A-Za-z]\w*$/
35
+ IDENT_LIST = /^(\w+)(,\s*\w+)*$/
36
+
37
+ DiscourseSchema = Dry::Schema.Params do
38
+ # config.validate_keys = true
39
+
40
+ optional(:adapter)
41
+
42
+ optional(:default).hash do
43
+ optional(:label).filled(:string, format?: LABEL)
44
+ optional(:attribute).filled(:string, format?: IDENT)
45
+ optional(:attributes).filled(:hash) # TODO Validate hash
46
+ end
47
+
48
+ optional(:allow_only).hash do
49
+ optional(:nodes).filled
50
+ optional(:edges).filled
51
+ end
52
+
53
+ # TODO Validate that there are no reciprocal relationships
54
+ # not listed in `only`
55
+ # Is there a way to do something like:
56
+ # included_in?: [ self.only ] if self.only
57
+ # Yes! If we make this a validation!
58
+ optional(:reciprocal).filled(:string, format?: EDGE_LIST)
59
+
60
+ optional(:grammar).array(GrammarSchema)
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,24 @@
1
+ require 'dry/schema'
2
+
3
+ =begin
4
+
5
+ grammar:
6
+ -
7
+ match:
8
+ - (Person a) knows (Person b).
9
+ template: {{{a}}}-[:KNOWS]->{{{b}}}.
10
+
11
+ =end
12
+
13
+ module Aspen
14
+ module Schemas
15
+
16
+ GrammarSchema = Dry::Schema.Params do
17
+ config.validate_keys = true
18
+
19
+ required(:match).array(:str?)
20
+ required(:template).filled(:string)
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,42 @@
1
+ require 'aspen/abstract_statement'
2
+
3
+ module Aspen
4
+ class Statement < AbstractStatement
5
+
6
+ attr_reader :origin, :edge, :target, :type
7
+
8
+ def type
9
+ :vanilla
10
+ end
11
+
12
+ def signature
13
+ [
14
+ origin.signature,
15
+ edge.signature,
16
+ target.signature
17
+ ].join()
18
+ end
19
+
20
+ # @param origin [Aspen::Node]
21
+ # @param edge [Aspen::Edge]
22
+ # @param target [Aspen::Node]
23
+ def initialize(origin: , edge: , target: )
24
+ @origin = origin
25
+ @edge = edge
26
+ @target = target
27
+ end
28
+
29
+ def nodes
30
+ [origin, target]
31
+ end
32
+
33
+ def to_cypher
34
+ [
35
+ origin.nickname_node,
36
+ edge.to_cypher,
37
+ target.nickname_node
38
+ ].join('')
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,12 @@
1
+ module Aspen
2
+ module SystemDefault
3
+
4
+ def self.label
5
+ "Entity".freeze
6
+ end
7
+
8
+ def self.attr_name
9
+ "name".freeze
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module Aspen
2
+ VERSION = "0.1.2"
3
+ end
data/lib/aspen.rb ADDED
@@ -0,0 +1,65 @@
1
+ require 'aspen/abstract_parser'
2
+ require 'aspen/abstract_statement'
3
+ require 'aspen/adapters'
4
+ require 'aspen/ast'
5
+ require 'aspen/compiler'
6
+ require 'aspen/contracts'
7
+ require 'aspen/custom_grammar'
8
+ require 'aspen/custom_statement'
9
+ require 'aspen/discourse'
10
+ require 'aspen/edge'
11
+ require 'aspen/errors'
12
+ require 'aspen/lexer'
13
+ require 'aspen/node'
14
+ require 'aspen/parser'
15
+ require 'aspen/renderers'
16
+ require 'aspen/statement'
17
+ require 'aspen/system_default'
18
+ require 'aspen/version'
19
+
20
+ module Aspen
21
+
22
+ @@available_formats = []
23
+
24
+ def self.available_formats
25
+ @@available_formats
26
+ end
27
+
28
+ def self.available_formats=(*args)
29
+ @@available_formats = Array(args).flatten
30
+ end
31
+
32
+ # Set the available formats for the compiler.
33
+ Aspen::Adapters::Registry.new
34
+
35
+ # TODO: There wants to be a pre-compiler stage/object.
36
+
37
+ SEPARATOR = "----".freeze
38
+
39
+ def self.compile_code(code, environment = {})
40
+ tokens = Lexer.tokenize(code, environment)
41
+ ast = Parser.parse(tokens, environment)
42
+ Compiler.render(ast, environment)
43
+ end
44
+
45
+ def self.compile_text(text, environment = {})
46
+ assert_text(text)
47
+
48
+ if text.include?(SEPARATOR)
49
+ env, _sep, code = text.partition(SEPARATOR)
50
+ compile_code(code, YAML.load(env).merge(environment))
51
+ else
52
+ code = text
53
+ compile_code(code, environment)
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def self.assert_text(text)
60
+ if text.strip.empty?
61
+ raise Aspen::Error, "Text must be provided to the `Aspen.compile_text` method."
62
+ end
63
+ end
64
+
65
+ end
metadata ADDED
@@ -0,0 +1,300 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aspen-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Matt Cloyd
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-12-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.12'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.12'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '6.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '6.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: airtable
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.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.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: dry-cli
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.6.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.6.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: dry-container
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.7'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.7'
97
+ - !ruby/object:Gem::Dependency
98
+ name: dry-monads
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: dry-validation
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 1.5.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 1.5.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: dry-types
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: listen
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: mustache
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: neo4j-core
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 9.0.0
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: 9.0.0
181
+ description: "\n Aspen is a simple markup language that renders into Cypher. Write
182
+ narrative data,\n mark it up, and compile to Cypher.\n "
183
+ email:
184
+ - cloyd.matt@gmail.com
185
+ executables:
186
+ - aspen
187
+ extensions: []
188
+ extra_rdoc_files: []
189
+ files:
190
+ - ".github/FUNDING.yml"
191
+ - ".gitignore"
192
+ - ".travis.yml"
193
+ - CODE_OF_CONDUCT.md
194
+ - Gemfile
195
+ - Gemfile.lock
196
+ - LICENSE.txt
197
+ - README.md
198
+ - Rakefile
199
+ - aspen.gemspec
200
+ - bin/aspen
201
+ - bin/console
202
+ - bin/setup
203
+ - lib/aspen.rb
204
+ - lib/aspen/abstract_parser.rb
205
+ - lib/aspen/abstract_statement.rb
206
+ - lib/aspen/actions.rb
207
+ - lib/aspen/actions/compile.rb
208
+ - lib/aspen/actions/push.rb
209
+ - lib/aspen/actions/watch.rb
210
+ - lib/aspen/adapters.rb
211
+ - lib/aspen/ast.rb
212
+ - lib/aspen/ast/nodes/attribute.rb
213
+ - lib/aspen/ast/nodes/comment.rb
214
+ - lib/aspen/ast/nodes/content.rb
215
+ - lib/aspen/ast/nodes/custom_statement.rb
216
+ - lib/aspen/ast/nodes/edge.rb
217
+ - lib/aspen/ast/nodes/label.rb
218
+ - lib/aspen/ast/nodes/narrative.rb
219
+ - lib/aspen/ast/nodes/node.rb
220
+ - lib/aspen/ast/nodes/statement.rb
221
+ - lib/aspen/ast/nodes/type.rb
222
+ - lib/aspen/cli.rb
223
+ - lib/aspen/cli/commands.rb
224
+ - lib/aspen/cli/commands/build.rb
225
+ - lib/aspen/cli/commands/build_steps.rb
226
+ - lib/aspen/cli/commands/compile.rb
227
+ - lib/aspen/cli/commands/generate.rb
228
+ - lib/aspen/cli/commands/new.rb
229
+ - lib/aspen/cli/commands/push.rb
230
+ - lib/aspen/cli/commands/version.rb
231
+ - lib/aspen/cli/commands/watch.rb
232
+ - lib/aspen/cli/templates/.gitignore
233
+ - lib/aspen/cli/templates/airtable.yml
234
+ - lib/aspen/cli/templates/convert
235
+ - lib/aspen/cli/templates/db.yml.erb
236
+ - lib/aspen/cli/templates/docker-compose.yml
237
+ - lib/aspen/cli/templates/manifest.yml.erb
238
+ - lib/aspen/compiler.rb
239
+ - lib/aspen/contracts.rb
240
+ - lib/aspen/contracts/default_attribute_contract.rb
241
+ - lib/aspen/conversion.rb
242
+ - lib/aspen/custom_grammar.rb
243
+ - lib/aspen/custom_grammar/ast.rb
244
+ - lib/aspen/custom_grammar/ast/nodes/bare.rb
245
+ - lib/aspen/custom_grammar/ast/nodes/capture_segment.rb
246
+ - lib/aspen/custom_grammar/ast/nodes/content.rb
247
+ - lib/aspen/custom_grammar/ast/nodes/expression.rb
248
+ - lib/aspen/custom_grammar/compiler.rb
249
+ - lib/aspen/custom_grammar/grammar.rb
250
+ - lib/aspen/custom_grammar/lexer.rb
251
+ - lib/aspen/custom_grammar/matcher.rb
252
+ - lib/aspen/custom_grammar/parser.rb
253
+ - lib/aspen/custom_statement.rb
254
+ - lib/aspen/discourse.rb
255
+ - lib/aspen/edge.rb
256
+ - lib/aspen/errors.rb
257
+ - lib/aspen/helpers.rb
258
+ - lib/aspen/lexer.rb
259
+ - lib/aspen/list.rb
260
+ - lib/aspen/node.rb
261
+ - lib/aspen/parser.rb
262
+ - lib/aspen/renderers.rb
263
+ - lib/aspen/renderers/abstract_renderer.rb
264
+ - lib/aspen/renderers/cypher_base_renderer.rb
265
+ - lib/aspen/renderers/cypher_batch_renderer.rb
266
+ - lib/aspen/renderers/cypher_renderer.rb
267
+ - lib/aspen/renderers/gexf_renderer.rb
268
+ - lib/aspen/renderers/json_renderer.rb
269
+ - lib/aspen/schemas/discourse_schema.rb
270
+ - lib/aspen/schemas/grammar_schema.rb
271
+ - lib/aspen/statement.rb
272
+ - lib/aspen/system_default.rb
273
+ - lib/aspen/version.rb
274
+ homepage: https://github.com/beechnut/aspen
275
+ licenses:
276
+ - MIT
277
+ metadata:
278
+ homepage_uri: https://github.com/beechnut/aspen
279
+ source_code_uri: https://github.com/beechnut/aspen
280
+ post_install_message:
281
+ rdoc_options: []
282
+ require_paths:
283
+ - lib
284
+ required_ruby_version: !ruby/object:Gem::Requirement
285
+ requirements:
286
+ - - ">="
287
+ - !ruby/object:Gem::Version
288
+ version: 2.3.0
289
+ required_rubygems_version: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ requirements: []
295
+ rubygems_version: 3.1.6
296
+ signing_key:
297
+ specification_version: 4
298
+ summary: Aspen turns simple text into graph data, compiling it into Cypher for Neo4j
299
+ graph databases.
300
+ test_files: []