aura-lang 1.3.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.
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aura
4
+ # Single source of truth for the framework version. Referenced by the
5
+ # gemspec, the CLI banner, and the generated-code header so they can never
6
+ # drift apart again.
7
+ VERSION = "1.3.0"
8
+ end
data/lib/aura.rb ADDED
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Aura -- the declarative AI web framework. This file is the loader and public
4
+ # API surface; the compiler pipeline lives in the focused modules under
5
+ # lib/aura/ (parser -> transformer -> analyzer -> codegen).
6
+
7
+ require "json"
8
+ require "fileutils"
9
+
10
+ # Torch is only needed to *run* generated models. Transpilation, `check`, and
11
+ # `build` all work without it, so a missing install is not fatal here.
12
+ begin
13
+ require "torch"
14
+ rescue LoadError
15
+ nil
16
+ end
17
+
18
+ require_relative "aura/version"
19
+ require_relative "aura/diagnostics"
20
+ require_relative "aura/emitter"
21
+ require_relative "aura/parser"
22
+ require_relative "aura/transformer"
23
+ require_relative "aura/analyzer"
24
+ require_relative "aura/codegen"
25
+ require_relative "aura/docker"
26
+ require_relative "aura/vercel"
27
+
28
+ module Aura
29
+ # A small, fully-parseable starter app used by `aura init` and the
30
+ # "file not found" recovery path in `aura run`. Kept here so the CLI and the
31
+ # test-suite share a single source of truth.
32
+ STARTER_TEMPLATE = <<~AURA
33
+ environment production do
34
+ device :cpu
35
+ log_level :info
36
+ end
37
+
38
+ model greeter neural_network do
39
+ input text
40
+ output greeting "Hello from Aura!"
41
+ end
42
+
43
+ route "/hello" get do
44
+ output prediction from greeter.predict(input) format :json
45
+ end
46
+
47
+ run web on port: 3000
48
+ AURA
49
+
50
+ module_function
51
+
52
+ # Strip `#` comments before parsing -- both full-line and trailing/inline
53
+ # (e.g. `scheduler :step_lr # note`). A `#` inside a double-quoted string is
54
+ # left intact. Comment text is removed but newlines are preserved, so line
55
+ # numbers stay accurate for diagnostics. Also normalizes the source to UTF-8
56
+ # (examples may contain emoji, etc.).
57
+ def preprocess(source)
58
+ source.to_s.dup.force_encoding("UTF-8")
59
+ .each_line.map { |line| strip_comment(line) }.join
60
+ end
61
+
62
+ # Remove a trailing `# ...` comment from a single line, ignoring any `#` that
63
+ # sits inside a double-quoted string. Backslash escapes are honored so a `\"`
64
+ # inside a string does not prematurely end it. A trailing newline (if present)
65
+ # is preserved so downstream line numbers do not shift.
66
+ def strip_comment(line)
67
+ in_string = false
68
+ escaped = false
69
+ line.each_char.with_index do |ch, i|
70
+ if escaped
71
+ escaped = false
72
+ elsif ch == "\\"
73
+ escaped = true
74
+ elsif ch == '"'
75
+ in_string = !in_string
76
+ elsif ch == "#" && !in_string
77
+ tail = line.end_with?("\n") ? "\n" : ""
78
+ return line[0...i].rstrip + tail
79
+ end
80
+ end
81
+ line
82
+ end
83
+
84
+ # Parse source into the raw Parslet tree, converting a Parslet failure into a
85
+ # friendly Aura::ParseError with line/column. Returns the raw tree so callers
86
+ # may run the Transformer themselves.
87
+ def parse(source)
88
+ clean = preprocess(source)
89
+ Parser.new.parse(clean)
90
+ rescue Parslet::ParseFailed => e
91
+ raise Diagnostics.from_parslet(e, clean)
92
+ end
93
+
94
+ # Full front-end: parse -> transform -> semantic analysis. Returns the flat
95
+ # list of semantic node hashes.
96
+ def to_nodes(source)
97
+ tree = parse(source)
98
+ nodes = Transformer.new.apply(tree)
99
+ nodes = nodes.is_a?(Array) ? nodes : [nodes]
100
+ nodes = nodes.flatten.compact.select { |n| n.is_a?(Hash) }
101
+ Analyzer.analyze(nodes)
102
+ end
103
+
104
+ # Transpile Aura source to a Ruby program (String).
105
+ def transpile(source)
106
+ CodeGen.generate(to_nodes(source))
107
+ end
108
+
109
+ # Transpile and execute a .aura file. Generated code uses classic Sinatra,
110
+ # which boots the server at exit.
111
+ def run_file(filename)
112
+ eval(transpile(File.read(filename)), TOPLEVEL_BINDING, filename) # rubocop:disable Security/Eval
113
+ end
114
+
115
+ # Generate Docker deployment assets for a .aura file (backs `aura deploy`).
116
+ def build_docker(filename)
117
+ Docker.build(filename)
118
+ end
119
+
120
+ # Generate Vercel deployment assets for an LLM-only .aura file
121
+ # (backs `aura deploy <file> --target vercel`).
122
+ def build_vercel(filename)
123
+ Vercel.build(filename)
124
+ end
125
+ end
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aura-lang
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ platform: ruby
6
+ authors:
7
+ - John V. Teixido
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-06-16 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: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sinatra
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: puma
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '7.2'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '9.0'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '7.2'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '9.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: json
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.7'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.7'
75
+ - !ruby/object:Gem::Dependency
76
+ name: red-datasets
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.1'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.1'
89
+ - !ruby/object:Gem::Dependency
90
+ name: dotenv
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.1'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.1'
103
+ description: A professional-grade framework for building AI pipelines and AI-integrated
104
+ web apps with Ruby and Torch. A RootSpace.app product founded and developed by John
105
+ V. Teixido.
106
+ email: john@rootspace.app
107
+ executables:
108
+ - aura
109
+ extensions: []
110
+ extra_rdoc_files: []
111
+ files:
112
+ - CHANGELOG.md
113
+ - LICENSE
114
+ - README.md
115
+ - Rakefile
116
+ - aura-lang.gemspec
117
+ - bin/aura
118
+ - examples/assistant.aura
119
+ - examples/chatbot.aura
120
+ - examples/hello.aura
121
+ - examples/mnist_classifier.aura
122
+ - examples/sentiment.aura
123
+ - examples/transfer_api.aura
124
+ - lib/aura.rb
125
+ - lib/aura/analyzer.rb
126
+ - lib/aura/codegen.rb
127
+ - lib/aura/diagnostics.rb
128
+ - lib/aura/docker.rb
129
+ - lib/aura/emitter.rb
130
+ - lib/aura/parser.rb
131
+ - lib/aura/transformer.rb
132
+ - lib/aura/vercel.rb
133
+ - lib/aura/version.rb
134
+ homepage: https://rootspace.app
135
+ licenses:
136
+ - MIT
137
+ metadata: {}
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '3.2'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubygems_version: 3.5.22
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: 'Aura: The Declarative AI Web Framework. A RootSpace.app product founded
157
+ and developed by John V. Teixido.'
158
+ test_files: []