From fe1f907759695607d822b626cb77f9de4f15b523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez?= Date: Tue, 24 Feb 2026 17:14:00 +0100 Subject: [PATCH 1/4] Better makefile --- Makefile | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index fb14ba8..98d84c2 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,18 @@ all: clean-container build-builders build-linux-debug-container +DB=~/.local/share/com.example.d4rt_formulas/d4rt_formulas/formulas.sqlite + build-container: ./flutterw --build-container clean: flutter clean - rm ~/.local/share/com.example.d4rt_formulas/d4rt_formulas/formulas.sqlite + [ -f $(DB) ] && rm $(DB) clean-container: build-container ./flutterw clean + rm .build-container-cache pub-get-container: build-container ./flutterw pub get @@ -35,11 +38,11 @@ run-linux-debug-container: pub-get-container run-web-debug-container: pub-get-container ./flutterw run --web-port $${WEB_PORT:-8081} -d web-server -run-linux-debug-native: build-linux-debug-container - ./build/linux/x64/debug/bundle/d4rt_formulas +run-linux-debug-native: + flutter run -d linux -run-web-debug-native: build-web-debug-container - cd build/web && python3 -m http.server $${WEB_PORT:-8081} +run-web-debug-native: + flutter run --web-port $${WEB_PORT:-8081} -d web-server ai: qwen --prompt-interactive --yolo "Read CLAUDE.md. Implement first task not already done in TODO.md" From a50474ef9b0755e7d1a36bf7c72d23afc62edfc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez?= Date: Tue, 24 Feb 2026 20:28:01 +0100 Subject: [PATCH 2/4] First test of network, string as input --- .../formulas/conversions_and_constants.d4rt | 10 ---- assets/formulas/energy_and_power.d4rt | 50 ------------------- assets/formulas/formulas.d4rt | 45 ----------------- assets/formulas/gravity.d4rt | 48 ++++++++++++++++++ assets/formulas/it-networking.d4rt | 37 ++++++++++++++ assets/formulas/kinematics_and_dynamics.d4rt | 2 + assets/formulas/materials_elasticity.d4rt | 16 +----- assets/formulas/medical_and_bio.d4rt | 16 +----- assets/formulas/optics.d4rt | 16 +----- assets/formulas/thermodynamics.d4rt | 16 ------ assets/formulas/trigonometry.d4rt | 2 + lib/defaults/default_corpus.dart | 15 +++++- lib/main.dart | 5 +- 13 files changed, 111 insertions(+), 167 deletions(-) create mode 100644 assets/formulas/it-networking.d4rt diff --git a/assets/formulas/conversions_and_constants.d4rt b/assets/formulas/conversions_and_constants.d4rt index a3f0de0..0d4f101 100644 --- a/assets/formulas/conversions_and_constants.d4rt +++ b/assets/formulas/conversions_and_constants.d4rt @@ -1,12 +1,2 @@ [ - {"name":"Temperature converter","description":r""" -Simple temperature converter example that returns the input value (Kelvin) as output. - -Formula: $$T_{out} = T_{in}$$ - -Inputs: `Input` in kelvin (K). -Output: `Output` in kelvin (K). - -![Temperature scales (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Temperature_scales.svg/800px-Temperature_scales.svg.png) -""","input":[{"name":"Input","unit":"Kelvin"}],"output":{"name":"Output","unit":"Kelvin"},"d4rtCode":"Output = Input;","tags":["converter","temperature"]} ] diff --git a/assets/formulas/energy_and_power.d4rt b/assets/formulas/energy_and_power.d4rt index f4d5322..0d4f101 100644 --- a/assets/formulas/energy_and_power.d4rt +++ b/assets/formulas/energy_and_power.d4rt @@ -1,52 +1,2 @@ [ - {"name":"Kinetic Energy","description":r""" -Energy possessed by a moving object. - -$$KE = \frac{1}{2}mv^2$$ - -Where: -- $m$: Mass (kg) -- $v$: Velocity (m/s) - -![Kinetic energy (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Kinetic_energy.svg/1200px-Kinetic_energy.svg.png) -""","input":[{"name":"m","unit":"kilogram"},{"name":"v","unit":"meters per second"}],"output":{"name":"KE","unit":"joule"},"d4rtCode":"KE = 0.5 * m * pow(v, 2);","tags":["physics","energy","mechanics"]}, - {"name":"Work","description":r""" -Energy transferred when a force moves an object. - -$$W = F d \cos(\theta)$$ - -Where: -- $W$: Work (Joules) -- $F$: Force (Newtons) -- $d$: Displacement (meters) -- $\theta$: Angle between force and displacement - -![Work (diagram) (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Work.svg/800px-Work.svg.png) -""","input":[{"name":"F","unit":"newton"},{"name":"d","unit":"meter"},{"name":"theta","unit":"degree"}],"output":{"name":"W","unit":"joule"},"d4rtCode":"var thetaRad = theta * (pi / 180); W = F * d * cos(thetaRad);","tags":["physics","energy","mechanics"]}, - {"name":"Power","description":r""" -Rate at which work is done or energy is transferred. - -$$P = \frac{W}{t}$$ - -Where: -- $P$: Power (Watts) -- $W$: Work or energy (Joules) -- $t$: Time (seconds) - -![Power (diagram) (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Power_equation.svg/800px-Power_equation.svg.png) -""","input":[{"name":"W","unit":"joule"},{"name":"t","unit":"second"}],"output":{"name":"P","unit":"watt"},"d4rtCode":"P = W / t;","tags":["physics","energy","mechanics"]}, - {"name":"Mass-Energy Equivalence","description":r""" -Einstein's mass-energy equivalence relation. - -$$E = mc^2$$ - -Where: -- $E$: Energy (Joules) -- $m$: Mass (kg) -- $c$: Speed of light $299{,}792{,}458\ \mathrm{m/s}$ - -This shows mass can be converted to energy and vice versa. - -![Einstein formula (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Einstein_light_beam.svg/800px-Einstein_light_beam.svg.png) -""","input":[{"name":"m","unit":"kilogram"}],"output":{"name":"E","unit":"joule"},"d4rtCode":"E = m * pow(299792458, 2);","tags":["physics","relativity","energy"]} ] diff --git a/assets/formulas/formulas.d4rt b/assets/formulas/formulas.d4rt index 7b3f7de..9357404 100644 --- a/assets/formulas/formulas.d4rt +++ b/assets/formulas/formulas.d4rt @@ -10,52 +10,7 @@ "d4rtCode": "Output = Input;", "tags": ["converter", "temperature" ] }, - // Free fall distance (vertical) - { - "name": "Free Fall Distance", - "description": r""" -Calculates vertical displacement under constant gravity -$$h = \frac{1}{2}gt^2$$ - -Where: -- $g$: Gravitational acceleration $9.81\ \mathrm{m/s^2}$ on Earth -- $t$: Time in free fall (seconds) - -![Free Fall Diagram](https://altcalculator.com/wp-content/uploads/2023/08/Free-Fall.png)""", - "input": [ - {"name": "t", "unit": "second"}, // Time in seconds - {"name": "g", "unit": "meters per second"} // Gravitational acceleration - ], - "output": {"name": "h", "unit": "meter"}, // Height in meters - "d4rtCode": "h = 0.5 * g * pow(t, 2);", - "tags": ["physics", "kinematics"] - }, - - // Newton's Law of Universal Gravitation - { - "name": "Gravitational Force", - "description": r''' -Newton's law of universal gravitation - -\(F = G\frac{m_1m_2}{r^2}\) - -Where: -- $G$: Gravitational constant $6.674\times 10^{-11}\ \mathrm{N\cdot m^2/kg^2}$ -- $m_1, m_2$: Masses of two objects -- $r$: Distance between centers of masses - -![Gravitation](https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/NewtonsLawOfUniversalGravitation.svg/1200px-NewtonsLawOfUniversalGravitation.svg.png)''', - "input": [ - {"name": "m1", "unit": "kilogram"}, // Mass 1 - {"name": "m2", "unit": "kilogram"}, // Mass 2 - {"name": "r", "unit": "meter"} // Distance between masses - ], - "output": {"name": "F", "unit": "newton"}, // Force in newtons - "d4rtCode": "F = (6.67430e-11 * m1 * m2) / pow(r, 2);", - "tags": ["physics", "astronomy", "gravity"] - }, - // Kinetic Energy { "name": "Kinetic Energy", diff --git a/assets/formulas/gravity.d4rt b/assets/formulas/gravity.d4rt index e69de29..84f415c 100644 --- a/assets/formulas/gravity.d4rt +++ b/assets/formulas/gravity.d4rt @@ -0,0 +1,48 @@ +[ + // Free fall distance (vertical) + { + "name": "Free Fall Distance", + "description": r""" +Calculates vertical displacement under constant gravity + +$$h = \frac{1}{2}gt^2$$ + +Where: +- $g$: Gravitational acceleration $9.81\ \mathrm{m/s^2}$ on Earth +- $t$: Time in free fall (seconds) + +![Free Fall Diagram](https://altcalculator.com/wp-content/uploads/2023/08/Free-Fall.png)""", + "input": [ + {"name": "t", "unit": "second"}, // Time in seconds + {"name": "g", "unit": "meters per second"} // Gravitational acceleration + ], + "output": {"name": "h", "unit": "meter"}, // Height in meters + "d4rtCode": "h = 0.5 * g * pow(t, 2);", + "tags": ["physics", "kinematics"] + }, + + // Newton's Law of Universal Gravitation + { + "name": "Gravitational Force", + "description": r''' +Newton's law of universal gravitation + +\(F = G\frac{m_1m_2}{r^2}\) + +Where: +- $G$: Gravitational constant $6.674\times 10^{-11}\ \mathrm{N\cdot m^2/kg^2}$ +- $m_1, m_2$: Masses of two objects +- $r$: Distance between centers of masses + +![Gravitation](https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/NewtonsLawOfUniversalGravitation.svg/1200px-NewtonsLawOfUniversalGravitation.svg.png)''', + "input": [ + {"name": "m1", "unit": "kilogram"}, // Mass 1 + {"name": "m2", "unit": "kilogram"}, // Mass 2 + {"name": "r", "unit": "meter"} // Distance between masses + ], + "output": {"name": "F", "unit": "newton"}, // Force in newtons + "d4rtCode": "F = (6.67430e-11 * m1 * m2) / pow(r, 2);", + "tags": ["physics", "astronomy", "gravity"] + }, + +] \ No newline at end of file diff --git a/assets/formulas/it-networking.d4rt b/assets/formulas/it-networking.d4rt new file mode 100644 index 0000000..3baaac3 --- /dev/null +++ b/assets/formulas/it-networking.d4rt @@ -0,0 +1,37 @@ +[ + { + "name": "Network Address from Host IP", + "description": r"""Calculates the network address from a host IP/MASK notation. + +Given a host IP address and subnet mask in CIDR notation (e.g., 192.168.1.100/24), +this formula extracts the network address (e.g., 192.168.1.0/24). + +Where: +- Host IP/MASK: IP address with CIDR subnet mask (e.g., 192.168.1.100/24) +- Network: The resulting network address in IP/MASK format (e.g., 192.168.1.0/24) + +The network address is calculated by applying the subnet mask to zero out the host bits.""", + "input": [ + {"name": "hostIP", "unit": "string"} + ], + "output": {"name": "network", "unit": "string"}, + "d4rtCode": r"""var parts = hostIP.split('/'); +var ip = parts[0]; +var mask = int.parse(parts[1]); +var octets = ip.split('.').map((e) => int.parse(e)).toList(); +var hostBits = 32 - mask; +var shiftAmount = hostBits; +var networkValue = 0; +for (var i = 0; i < 4; i++) { + networkValue = (networkValue << 8) | octets[i]; +} +networkValue = (networkValue >> shiftAmount) << shiftAmount; +var networkOctets = []; +for (var i = 0; i < 4; i++) { + networkOctets.insert(0, networkValue & 0xFF); + networkValue = networkValue >> 8; +} +network = networkOctets.join('.') + '/' + mask.toString();""", + "tags": ["networking", "ip", "subnetting", "cidr", "network"] + } +] diff --git a/assets/formulas/kinematics_and_dynamics.d4rt b/assets/formulas/kinematics_and_dynamics.d4rt index e69de29..32960f8 100644 --- a/assets/formulas/kinematics_and_dynamics.d4rt +++ b/assets/formulas/kinematics_and_dynamics.d4rt @@ -0,0 +1,2 @@ +[ +] \ No newline at end of file diff --git a/assets/formulas/materials_elasticity.d4rt b/assets/formulas/materials_elasticity.d4rt index dc16bb3..48e1ad2 100644 --- a/assets/formulas/materials_elasticity.d4rt +++ b/assets/formulas/materials_elasticity.d4rt @@ -1,16 +1,4 @@ [ - {"name":"Hooke's Law","description":r""" -Force exerted by a spring is proportional to its displacement (linear region). - -$$F = -kx$$ - -Where: -- $F$: Restoring force (Newtons) -- $k$: Spring constant (N/m) -- $x$: Displacement from equilibrium (meters) - -The negative sign indicates the force opposes displacement. - -![Hooke's law (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/HookesLaw.svg/800px-HookesLaw.svg.png) -""","input":[{"name":"k","unit":"newton per meter"},{"name":"x","unit":"meter"}],"output":{"name":"F","unit":"newton"},"d4rtCode":"F = -k * x;","tags":["physics","elasticity","oscillations"]} + {"name":"Hooke's Law","input":[{"name":"k","unit":"newton per meter"},{"name":"x","unit":"meter"}],"output":{"name":"F","unit":"newton"},"d4rtCode":"F = -k * x;","tags":["physics","elasticity","oscillations"]} ] + diff --git a/assets/formulas/medical_and_bio.d4rt b/assets/formulas/medical_and_bio.d4rt index 5136b6c..6a8bac0 100644 --- a/assets/formulas/medical_and_bio.d4rt +++ b/assets/formulas/medical_and_bio.d4rt @@ -1,16 +1,4 @@ [ - {"name":"Apgar Score","description":r""" -Newborn health assessment scoring system performed at 1 and 5 minutes after birth. - -The Apgar score sums five categories (0–2 points each): -1. Heart rate -2. Respiratory effort -3. Muscle tone -4. Reflex response -5. Color - -Total score ranges from 0 to 10. Higher scores indicate better newborn condition. - -![Apgar score (illustration) (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Apgar_scale.svg/800px-Apgar_scale.svg.png) -""","input":[{"name":"HeartRate","values":["Absent","< 100 bpm>","> 100 bpm"]},{"name":"Breathing","values":["Absent","Weak, irregular","Strong, robust cry"]},{"name":"MuscleTone","values":["None","Some","Flexed arms/leg, resists extension"]},{"name":"Reflexes","values":["No response","Grimace on aggressive stimulation","Cry on stimulation"]},{"name":"SkinColor","values":["Blue or pale","Blue extremities, pink body","Pink"]}],"output":{"name":"Result","unit":"string"},"d4rtCode":"var total = indexOf(\"HeartRate\") + indexOf(\"Breathing\") + indexOf(\"MuscleTone\") + indexOf(\"Reflexes\") + indexOf(\"SkinColor\"); late var interpretation; if( total < 4 ) { interpretation = 'Critical condition'; } else if( total < 7 ){ interpretation = 'Needs assistance'; } else { interpretation = 'Normal'; } Result = 'Score: \$total - \$interpretation';","tags":["medical","pediatrics","assessment"]} + {"name":"Apgar Score","input":[{"name":"HeartRate","values":["Absent","< 100 bpm>","> 100 bpm"]},{"name":"Breathing","values":["Absent","Weak, irregular","Strong, robust cry"]},{"name":"MuscleTone","values":["None","Some","Flexed arms/leg, resists extension"]},{"name":"Reflexes","values":["No response","Grimace on aggressive stimulation","Cry on stimulation"]},{"name":"SkinColor","values":["Blue or pale","Blue extremities, pink body","Pink"]}],"output":{"name":"Result","unit":"string"},"d4rtCode":"var total = indexOf(\"HeartRate\") + indexOf(\"Breathing\") + indexOf(\"MuscleTone\") + indexOf(\"Reflexes\") + indexOf(\"SkinColor\"); late var interpretation; if( total < 4 ) { interpretation = 'Critical condition'; } else if( total < 7 ){ interpretation = 'Needs assistance'; } else { interpretation = 'Normal'; } Result = 'Score: \$total - \$interpretation';","tags":["medical","pediatrics","assessment"]} ] + diff --git a/assets/formulas/optics.d4rt b/assets/formulas/optics.d4rt index c41b756..f28a4c4 100644 --- a/assets/formulas/optics.d4rt +++ b/assets/formulas/optics.d4rt @@ -1,16 +1,4 @@ [ - {"name":"Snell's Law","description":r""" -Law describing refraction of light at an interface between two media. - -$$n_1 \sin(\theta_1) = n_2 \sin(\theta_2)$$ - -Where: -- $n_1, n_2$: Refractive indices -- $\theta_1$: Angle of incidence -- $\theta_2$: Angle of refraction - -This law explains how light bends when passing between materials. - -![Refraction diagram (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Refraction_en.svg/800px-Refraction_en.svg.png) -""","input":[{"name":"n1","unit":"scalar"},{"name":"n2","unit":"scalar"},{"name":"theta1","unit":"degree"}],"output":{"name":"theta2","unit":"degree"},"d4rtCode":"var theta1Rad = theta1 * (pi / 180); var sinTheta2 = (n1 * sin(theta1Rad)) / n2; theta2 = asin(sinTheta2) * (180 / pi);","tags":["physics","optics","light"]} + {"name":"Snell's Law","input":[{"name":"n1","unit":"scalar"},{"name":"n2","unit":"scalar"},{"name":"theta1","unit":"degree"}],"output":{"name":"theta2","unit":"degree"},"d4rtCode":"var theta1Rad = theta1 * (pi / 180); var sinTheta2 = (n1 * sin(theta1Rad)) / n2; theta2 = asin(sinTheta2) * (180 / pi);","tags":["physics","optics","light"]} ] + diff --git a/assets/formulas/thermodynamics.d4rt b/assets/formulas/thermodynamics.d4rt index 94f813f..0d4f101 100644 --- a/assets/formulas/thermodynamics.d4rt +++ b/assets/formulas/thermodynamics.d4rt @@ -1,18 +1,2 @@ [ - {"name":"Ideal Gas Law","description":r""" -Equation of state for an ideal gas. - -$$PV = nRT$$ - -Where: -- $P$: Pressure (Pascals) -- $V$: Volume (m^3) -- $n$: Amount of substance (moles) -- $R$: Universal gas constant $8.314\ \mathrm{J/(mol\cdot K)}$ -- $T$: Temperature (Kelvin) - -This law combines Boyle's, Charles's and Avogadro's laws. - -![Ideal Gas](https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Ideal_gas_sphere.svg/800px-Ideal_gas_sphere.svg.png) -""","input":[{"name":"n","unit":"mole"},{"name":"T","unit":"kelvin"},{"name":"V","unit":"cubic meter"}],"output":{"name":"P","unit":"pascal"},"d4rtCode":"P = (n * 8.314462618 * T) / V;","tags":["physics","thermodynamics","gas"]} ] diff --git a/assets/formulas/trigonometry.d4rt b/assets/formulas/trigonometry.d4rt index e69de29..32960f8 100644 --- a/assets/formulas/trigonometry.d4rt +++ b/assets/formulas/trigonometry.d4rt @@ -0,0 +1,2 @@ +[ +] \ No newline at end of file diff --git a/lib/defaults/default_corpus.dart b/lib/defaults/default_corpus.dart index c0daed7..2b78476 100644 --- a/lib/defaults/default_corpus.dart +++ b/lib/defaults/default_corpus.dart @@ -52,10 +52,20 @@ Future createDefaultCorpus() async{ Future loadFormulas() async { final formulaResources = [ "assets/formulas/formulas.d4rt", + "assets/formulas/conversions_and_constants.d4rt", "assets/formulas/electromagnetism.d4rt", - "assets/formulas/thermodynamics.d4rt", + "assets/formulas/energy_and_power.d4rt", "assets/formulas/fluids_and_pressure.d4rt", - + "assets/formulas/geometry.d4rt", + "assets/formulas/gravity.d4rt", + "assets/formulas/it-networking.d4rt", + "assets/formulas/kinematics_and_dynamics.d4rt", + "assets/formulas/materials_elasticity.d4rt", + "assets/formulas/medical_and_bio.d4rt", + "assets/formulas/misc_math.d4rt", + "assets/formulas/optics.d4rt", + "assets/formulas/thermodynamics.d4rt", + "assets/formulas/trigonometry.d4rt", ]; for (final formRes in formulaResources) { @@ -63,6 +73,7 @@ Future createDefaultCorpus() async{ final literal = await loadResourceAsString(formRes); print( "Loaded $formRes"); final formulas = Formula.fromArrayStringLiteral(literal); + print( "Parsed $formRes"); final formulaElements = formulas.cast(); corpus.loadFormulaElements(formulaElements); } diff --git a/lib/main.dart b/lib/main.dart index da4781c..c2efe16 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:d4rt_formulas/d4rt_formulas.dart'; import 'package:flutter/material.dart'; import 'database/database_service.dart'; import 'package:drift/drift.dart' as drift; @@ -92,9 +93,9 @@ Future loadCorpusFromDatabaseOrAssets() async { // Load corpus from database elements return await Corpus.fromDatabaseElements(dbElements); } - } catch (e) { + } catch (e, st) { // If there's an error loading from database, fall back to default corpus - print('Error loading corpus from database: $e'); + errorHandler.notify(e,st); return await createDefaultCorpus(); } } From 7461a2addfe04d12bc3e56840165ca2f4287f8f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez?= Date: Thu, 26 Feb 2026 20:03:19 +0100 Subject: [PATCH 3/4] =?UTF-8?q?fn()=20for=20use=20inside=20formulas.=20Com?= =?UTF-8?q?piling=20in:=20Flutter=203.38.9=20=E2=80=A2=20channel=20stable?= =?UTF-8?q?=20=E2=80=A2=20https://github.com/flutter/flutter.git=20Framewo?= =?UTF-8?q?rk=20=E2=80=A2=20revision=2067323de285=20(4=20weeks=20ago)=20?= =?UTF-8?q?=E2=80=A2=202026-01-28=2013:43:12=20-0800=20Engine=20=E2=80=A2?= =?UTF-8?q?=20hash=205eb06b7ad5bb8cbc22c5230264c7a00ceac7674b=20(revision?= =?UTF-8?q?=20587c18f873)=20(29=20days=20ago)=20=E2=80=A2=202026-01-27=202?= =?UTF-8?q?3:23:03.000Z=20Tools=20=E2=80=A2=20Dart=203.10.8=20=E2=80=A2=20?= =?UTF-8?q?DevTools=202.51.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO.md | 3 +- docker/Dockerfile | 18 +- lib/corpus.dart | 2 +- lib/d4rt_bridge.dart | 19 ++ lib/database/formulas_database.g.dart | 231 +++++++++++------- lib/formula_evaluator.dart | 23 +- lib/main.dart | 8 +- linux/flutter/generated_plugin_registrant.cc | 4 - linux/flutter/generated_plugins.cmake | 1 - macos/Flutter/GeneratedPluginRegistrant.swift | 4 - pubspec.lock | 166 ++++++------- pubspec.yaml | 6 +- .../flutter/generated_plugin_registrant.cc | 3 - windows/flutter/generated_plugins.cmake | 1 - 14 files changed, 275 insertions(+), 214 deletions(-) create mode 100644 lib/d4rt_bridge.dart diff --git a/TODO.md b/TODO.md index 1107f1e..b09e566 100644 --- a/TODO.md +++ b/TODO.md @@ -32,4 +32,5 @@ - [X] Add a Share button to the formula list. It will export the array string literal of the formula with the units from Corpus.withDependencies(). - [X] Replace flutter-markdown with flutter-markdown-plus - [X] Heron's formula: investigate why a=3, b=40, c=5 yields NaN. Root cause: input values don't form a valid triangle (violate triangle inequality: 3+5=8 is not > 40). Added documentation note to the formula description. -- [ ] Investigate starup time when there is no previous database and corpus is loaded from assets. +- [ ] +- [ ] Investigate startup time when there is no previous database and corpus is loaded from assets. diff --git a/docker/Dockerfile b/docker/Dockerfile index 0c7eae8..5e58621 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/cirruslabs/flutter:3.32.3 +FROM ghcr.io/cirruslabs/flutter:3.38.9 # Install cmake, ninja, clang, pkg-config, and other tools for flutter linux RUN apt-get update && apt-get install -y \ @@ -32,14 +32,14 @@ RUN chown -R $USER_ID:$GROUP_ID /sdks/flutter USER $USER_ID:$GROUP_ID # Pre-cache Flutter artifacts for Linux, Android, and Web to speed up subsequent builds -WORKDIR /dummy_app_only_for_cache -RUN flutter create . && flutter pub get -RUN flutter precache --linux -RUN flutter build linux -RUN flutter precache --web -RUN flutter build web -RUN flutter precache --android -RUN flutter build apk +#WORKDIR /dummy_app_only_for_cache +#RUN flutter create . && flutter pub get +#RUN flutter precache --linux +#RUN flutter build linux +#RUN flutter precache --web +#RUN flutter build web +#RUN flutter precache --android +#RUN flutter build apk WORKDIR /app diff --git a/lib/corpus.dart b/lib/corpus.dart index 74c2146..b2f7cf2 100644 --- a/lib/corpus.dart +++ b/lib/corpus.dart @@ -165,7 +165,7 @@ class Corpus{ static Number _evaluate(String code, [D4rt? interpreter]) { final d4rtInterpreter = interpreter ?? FormulaEvaluator.createDefaultInterpreter(); FormulaEvaluator.prepareInterpreter(d4rtInterpreter); - final completeCode = "${FormulaEvaluator.d4rtImports}\n$code"; + final completeCode = "${FormulaEvaluator.preamble}\n$code"; final result = d4rtInterpreter.execute(source: completeCode); return result.toDouble(); } diff --git a/lib/d4rt_bridge.dart b/lib/d4rt_bridge.dart new file mode 100644 index 0000000..84eb6b2 --- /dev/null +++ b/lib/d4rt_bridge.dart @@ -0,0 +1,19 @@ +import 'package:d4rt/d4rt.dart'; +import 'package:get_it/get_it.dart'; +import 'corpus.dart'; +import 'formula_evaluator.dart'; + +part 'd4rt_bridge.g.dart'; + +@D4rtBridge(libraryUri: 'package:formulas/runtime_bridge.dart') +class D4rtBridgeImpl { + static dynamic fn(String formulaName, Map inputValues) { + var corpus = GetIt.instance.get(); + var evaluator = FormulaEvaluator(); + var formula = corpus.getFormula(formulaName); + if (formula == null) { + throw ArgumentError("Formula not found in corpus: $formulaName"); + } + return evaluator.evaluate(formula, inputValues); + } +} \ No newline at end of file diff --git a/lib/database/formulas_database.g.dart b/lib/database/formulas_database.g.dart index 1c8f48f..1153d1c 100644 --- a/lib/database/formulas_database.g.dart +++ b/lib/database/formulas_database.g.dart @@ -12,18 +12,27 @@ class $FormulaElementsTable extends FormulaElements static const VerificationMeta _idMeta = const VerificationMeta('id'); @override late final GeneratedColumn id = GeneratedColumn( - 'id', aliasedName, false, - hasAutoIncrement: true, - type: DriftSqlType.int, - requiredDuringInsert: false, - defaultConstraints: - GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); - static const VerificationMeta _elementTextMeta = - const VerificationMeta('elementText'); + 'id', + aliasedName, + false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'PRIMARY KEY AUTOINCREMENT', + ), + ); + static const VerificationMeta _elementTextMeta = const VerificationMeta( + 'elementText', + ); @override late final GeneratedColumn elementText = GeneratedColumn( - 'element_text', aliasedName, false, - type: DriftSqlType.string, requiredDuringInsert: true); + 'element_text', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); @override List get $columns => [id, elementText]; @override @@ -32,8 +41,10 @@ class $FormulaElementsTable extends FormulaElements String get actualTableName => $name; static const String $name = 'formula_elements'; @override - VerificationContext validateIntegrity(Insertable instance, - {bool isInserting = false}) { + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('id')) { @@ -41,9 +52,12 @@ class $FormulaElementsTable extends FormulaElements } if (data.containsKey('element_text')) { context.handle( + _elementTextMeta, + elementText.isAcceptableOrUnknown( + data['element_text']!, _elementTextMeta, - elementText.isAcceptableOrUnknown( - data['element_text']!, _elementTextMeta)); + ), + ); } else if (isInserting) { context.missing(_elementTextMeta); } @@ -56,10 +70,14 @@ class $FormulaElementsTable extends FormulaElements FormulaElement map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return FormulaElement( - id: attachedDatabase.typeMapping - .read(DriftSqlType.int, data['${effectivePrefix}id'])!, - elementText: attachedDatabase.typeMapping - .read(DriftSqlType.string, data['${effectivePrefix}element_text'])!, + id: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}id'], + )!, + elementText: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}element_text'], + )!, ); } @@ -88,8 +106,10 @@ class FormulaElement extends DataClass implements Insertable { ); } - factory FormulaElement.fromJson(Map json, - {ValueSerializer? serializer}) { + factory FormulaElement.fromJson( + Map json, { + ValueSerializer? serializer, + }) { serializer ??= driftRuntimeOptions.defaultSerializer; return FormulaElement( id: serializer.fromJson(json['id']), @@ -106,14 +126,15 @@ class FormulaElement extends DataClass implements Insertable { } FormulaElement copyWith({int? id, String? elementText}) => FormulaElement( - id: id ?? this.id, - elementText: elementText ?? this.elementText, - ); + id: id ?? this.id, + elementText: elementText ?? this.elementText, + ); FormulaElement copyWithCompanion(FormulaElementsCompanion data) { return FormulaElement( id: data.id.present ? data.id.value : this.id, - elementText: - data.elementText.present ? data.elementText.value : this.elementText, + elementText: data.elementText.present + ? data.elementText.value + : this.elementText, ); } @@ -157,8 +178,10 @@ class FormulaElementsCompanion extends UpdateCompanion { }); } - FormulaElementsCompanion copyWith( - {Value? id, Value? elementText}) { + FormulaElementsCompanion copyWith({ + Value? id, + Value? elementText, + }) { return FormulaElementsCompanion( id: id ?? this.id, elementText: elementText ?? this.elementText, @@ -190,8 +213,9 @@ class FormulaElementsCompanion extends UpdateCompanion { abstract class _$FormulasDatabase extends GeneratedDatabase { _$FormulasDatabase(QueryExecutor e) : super(e); $FormulasDatabaseManager get managers => $FormulasDatabaseManager(this); - late final $FormulaElementsTable formulaElements = - $FormulaElementsTable(this); + late final $FormulaElementsTable formulaElements = $FormulaElementsTable( + this, + ); @override Iterable> get allTables => allSchemaEntities.whereType>(); @@ -199,16 +223,16 @@ abstract class _$FormulasDatabase extends GeneratedDatabase { List get allSchemaEntities => [formulaElements]; } -typedef $$FormulaElementsTableCreateCompanionBuilder = FormulaElementsCompanion - Function({ - Value id, - required String elementText, -}); -typedef $$FormulaElementsTableUpdateCompanionBuilder = FormulaElementsCompanion - Function({ - Value id, - Value elementText, -}); +typedef $$FormulaElementsTableCreateCompanionBuilder = + FormulaElementsCompanion Function({ + Value id, + required String elementText, + }); +typedef $$FormulaElementsTableUpdateCompanionBuilder = + FormulaElementsCompanion Function({ + Value id, + Value elementText, + }); class $$FormulaElementsTableFilterComposer extends Composer<_$FormulasDatabase, $FormulaElementsTable> { @@ -220,10 +244,14 @@ class $$FormulaElementsTableFilterComposer super.$removeJoinBuilderFromRootComposer, }); ColumnFilters get id => $composableBuilder( - column: $table.id, builder: (column) => ColumnFilters(column)); + column: $table.id, + builder: (column) => ColumnFilters(column), + ); ColumnFilters get elementText => $composableBuilder( - column: $table.elementText, builder: (column) => ColumnFilters(column)); + column: $table.elementText, + builder: (column) => ColumnFilters(column), + ); } class $$FormulaElementsTableOrderingComposer @@ -236,10 +264,14 @@ class $$FormulaElementsTableOrderingComposer super.$removeJoinBuilderFromRootComposer, }); ColumnOrderings get id => $composableBuilder( - column: $table.id, builder: (column) => ColumnOrderings(column)); + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); ColumnOrderings get elementText => $composableBuilder( - column: $table.elementText, builder: (column) => ColumnOrderings(column)); + column: $table.elementText, + builder: (column) => ColumnOrderings(column), + ); } class $$FormulaElementsTableAnnotationComposer @@ -255,27 +287,38 @@ class $$FormulaElementsTableAnnotationComposer $composableBuilder(column: $table.id, builder: (column) => column); GeneratedColumn get elementText => $composableBuilder( - column: $table.elementText, builder: (column) => column); + column: $table.elementText, + builder: (column) => column, + ); } -class $$FormulaElementsTableTableManager extends RootTableManager< - _$FormulasDatabase, - $FormulaElementsTable, - FormulaElement, - $$FormulaElementsTableFilterComposer, - $$FormulaElementsTableOrderingComposer, - $$FormulaElementsTableAnnotationComposer, - $$FormulaElementsTableCreateCompanionBuilder, - $$FormulaElementsTableUpdateCompanionBuilder, - ( - FormulaElement, - BaseReferences<_$FormulasDatabase, $FormulaElementsTable, FormulaElement> - ), - FormulaElement, - PrefetchHooks Function()> { +class $$FormulaElementsTableTableManager + extends + RootTableManager< + _$FormulasDatabase, + $FormulaElementsTable, + FormulaElement, + $$FormulaElementsTableFilterComposer, + $$FormulaElementsTableOrderingComposer, + $$FormulaElementsTableAnnotationComposer, + $$FormulaElementsTableCreateCompanionBuilder, + $$FormulaElementsTableUpdateCompanionBuilder, + ( + FormulaElement, + BaseReferences< + _$FormulasDatabase, + $FormulaElementsTable, + FormulaElement + >, + ), + FormulaElement, + PrefetchHooks Function() + > { $$FormulaElementsTableTableManager( - _$FormulasDatabase db, $FormulaElementsTable table) - : super(TableManagerState( + _$FormulasDatabase db, + $FormulaElementsTable table, + ) : super( + TableManagerState( db: db, table: table, createFilteringComposer: () => @@ -284,44 +327,48 @@ class $$FormulaElementsTableTableManager extends RootTableManager< $$FormulaElementsTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => $$FormulaElementsTableAnnotationComposer($db: db, $table: table), - updateCompanionCallback: ({ - Value id = const Value.absent(), - Value elementText = const Value.absent(), - }) => - FormulaElementsCompanion( - id: id, - elementText: elementText, - ), - createCompanionCallback: ({ - Value id = const Value.absent(), - required String elementText, - }) => - FormulaElementsCompanion.insert( - id: id, - elementText: elementText, - ), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value elementText = const Value.absent(), + }) => FormulaElementsCompanion(id: id, elementText: elementText), + createCompanionCallback: + ({ + Value id = const Value.absent(), + required String elementText, + }) => FormulaElementsCompanion.insert( + id: id, + elementText: elementText, + ), withReferenceMapper: (p0) => p0 .map((e) => (e.readTable(table), BaseReferences(db, table, e))) .toList(), prefetchHooksCallback: null, - )); + ), + ); } -typedef $$FormulaElementsTableProcessedTableManager = ProcessedTableManager< - _$FormulasDatabase, - $FormulaElementsTable, - FormulaElement, - $$FormulaElementsTableFilterComposer, - $$FormulaElementsTableOrderingComposer, - $$FormulaElementsTableAnnotationComposer, - $$FormulaElementsTableCreateCompanionBuilder, - $$FormulaElementsTableUpdateCompanionBuilder, - ( +typedef $$FormulaElementsTableProcessedTableManager = + ProcessedTableManager< + _$FormulasDatabase, + $FormulaElementsTable, FormulaElement, - BaseReferences<_$FormulasDatabase, $FormulaElementsTable, FormulaElement> - ), - FormulaElement, - PrefetchHooks Function()>; + $$FormulaElementsTableFilterComposer, + $$FormulaElementsTableOrderingComposer, + $$FormulaElementsTableAnnotationComposer, + $$FormulaElementsTableCreateCompanionBuilder, + $$FormulaElementsTableUpdateCompanionBuilder, + ( + FormulaElement, + BaseReferences< + _$FormulasDatabase, + $FormulaElementsTable, + FormulaElement + >, + ), + FormulaElement, + PrefetchHooks Function() + >; class $FormulasDatabaseManager { final _$FormulasDatabase _db; diff --git a/lib/formula_evaluator.dart b/lib/formula_evaluator.dart index 8666304..73efa5d 100644 --- a/lib/formula_evaluator.dart +++ b/lib/formula_evaluator.dart @@ -1,8 +1,11 @@ import 'dart:math' as Math; import 'package:d4rt/d4rt.dart'; +import 'package:get_it/get_it.dart'; +import 'corpus.dart'; import 'formula_models.dart'; import 'error_handler.dart'; +import 'd4rt_bridge.dart'; @@ -71,13 +74,14 @@ class FormulaEvaluator { ); interpreter.registerBridgedClass(myMathDefinition, "package:d4rt_formulas.dart"); + registerD4rtBridgeBridges(interpreter); } static FormulaResult evaluateExpression(String code, [D4rt? interpreter]) { final d4rtInterpreter = interpreter ?? createDefaultInterpreter(); prepareInterpreter(d4rtInterpreter); final d4rtCode = """ - $d4rtImports + $preamble main() { late var result; @@ -166,15 +170,15 @@ class FormulaEvaluator { return formula.inputVarNames()..sort(); } - static final String d4rtImports = """ - import 'dart:math'; - import "package:d4rt_formulas.dart"; - """; - static final String signalMagicString = "###"; - static final String signal = """ - void signal( String msg ) => throw Exception("$signalMagicString\$msg"); + static final String preamble = """ + import 'dart:math'; + import "package:d4rt_formulas.dart"; + import "package:formulas/runtime_bridge.dart"; + void signal( String msg ) => throw Exception("$signalMagicString\$msg"); + dynamic fn(String formulaName, Map inputValues) => D4rtBridgeImpl.fn(formulaName, inputValues); + """; static const reservedVariableNames = { "variableValues", "indexOf", "variableAllowedValues"} ; @@ -183,8 +187,7 @@ class FormulaEvaluator { final buffer = StringBuffer(); buffer.writeln(""" - $d4rtImports - $signal + $preamble main() { """ diff --git a/lib/main.dart b/lib/main.dart index c2efe16..a1e6684 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:d4rt_formulas/d4rt_formulas.dart'; import 'package:flutter/material.dart'; +import 'package:get_it/get_it.dart'; import 'database/database_service.dart'; import 'package:drift/drift.dart' as drift; import 'service_locator.dart'; @@ -52,13 +53,16 @@ class _CorpusLoaderState extends State { if (snapshot.hasError) { return Center(child: Text('Error loading corpus: ${snapshot.error}')); } - + + var corpus = snapshot.data!; + GetIt.instance.registerSingleton(corpus); + // If the corpus is empty (user chose not to load default), we could handle that here // For now, just display the formula list return Scaffold( appBar: AppBar(title: const Text('Formulas')), body: FormulaList( - corpus: snapshot.data!, + corpus: corpus, formulas: snapshot.data!.getFormulas(), ), ); diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 4c0025f..f6f23bf 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,13 +6,9 @@ #include "generated_plugin_registrant.h" -#include #include void fl_register_plugins(FlPluginRegistry* registry) { - g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); - sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index ad279a8..f16b4c3 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,7 +3,6 @@ # list(APPEND FLUTTER_PLUGIN_LIST - sqlite3_flutter_libs url_launcher_linux ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index c5b331e..fccdd16 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,14 +5,10 @@ import FlutterMacOS import Foundation -import path_provider_foundation import share_plus -import sqlite3_flutter_libs import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) - Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index f187fdd..871f09b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f + sha256: c209688d9f5a5f26b2fb47a188131a6fb9e876ae9e47af3737c0b4f58a93470d url: "https://pub.dev" source: hosted - version: "85.0.0" + version: "91.0.0" analyzer: - dependency: transitive + dependency: "direct main" description: name: analyzer - sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" + sha256: f51c8499b35f9b26820cfe914828a6a98a94efd5cc78b37bb7d03debae3a1d08 url: "https://pub.dev" source: hosted - version: "7.7.1" + version: "8.4.1" args: dependency: transitive description: @@ -53,10 +53,10 @@ packages: dependency: transitive description: name: build - sha256: ce76b1d48875e3233fde17717c23d1f60a91cc631597e49a400c89b475395b1d + sha256: "275bf6bb2a00a9852c28d4e0b410da1d833a734d57d39d44f94bfc895a484ec3" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.4" build_config: dependency: transitive description: @@ -73,30 +73,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.1" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - sha256: d1d57f7807debd7349b4726a19fd32ec8bc177c71ad0febf91a20f84cd2d4b46 - url: "https://pub.dev" - source: hosted - version: "3.0.3" build_runner: dependency: "direct dev" description: name: build_runner - sha256: b24597fceb695969d47025c958f3837f9f0122e237c6a22cb082a5ac66c3ca30 + sha256: "39ad4ca8a2876779737c60e4228b4bcd35d4352ef7e14e47514093edc012c734" url: "https://pub.dev" source: hosted - version: "2.7.1" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - sha256: "066dda7f73d8eb48ba630a55acb50c4a84a2e6b453b1cb4567f581729e794f7b" - url: "https://pub.dev" - source: hosted - version: "9.3.1" + version: "2.11.1" built_collection: dependency: transitive description: @@ -109,10 +93,10 @@ packages: dependency: transitive description: name: built_value - sha256: "7931c90b84bc573fef103548e354258ae4c9d28d140e41961df6843c5d60d4d8" + sha256: "6ae8a6435a8c6520c7077b107e77f1fb4ba7009633259a4d49a8afd8e7efc5e9" url: "https://pub.dev" source: hosted - version: "8.12.3" + version: "8.12.4" characters: dependency: transitive description: @@ -161,6 +145,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" code_builder: dependency: transitive description: @@ -221,34 +213,34 @@ packages: dependency: "direct main" description: name: d4rt - sha256: eff6a10f31e9e5b60b99146a33204c5f2d74e20ac3eeb14132d8a8ed0921c6e1 + sha256: "4c178f741141592d60e4037c3205f9c081a3b32edc1061029a43667dff409a36" url: "https://pub.dev" source: hosted - version: "0.1.9" + version: "0.2.2" dart_style: dependency: transitive description: name: dart_style - sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb" + sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.3" drift: dependency: "direct main" description: name: drift - sha256: "83290a32ae006a7535c5ecf300722cb77177250d9df4ee2becc5fa8a36095114" + sha256: "970cd188fddb111b26ea6a9b07a62bf5c2432d74147b8122c67044ae3b97e99e" url: "https://pub.dev" source: hosted - version: "2.29.0" + version: "2.31.0" drift_dev: dependency: "direct dev" description: name: drift_dev - sha256: "6019f827544e77524ffd5134ae0cb75dfd92ef5ef3e269872af92840c929cd43" + sha256: "917184b2fb867b70a548a83bf0d36268423b38d39968c06cce4905683da49587" url: "https://pub.dev" source: hosted - version: "2.29.0" + version: "2.31.0" equatable: dependency: transitive description: @@ -302,14 +294,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.5" - flutter_d4rt: - dependency: "direct main" - description: - name: flutter_d4rt - sha256: "7ab9d3f91de5c10db115ccab1d9b1588946f744850f5bacc243cfc9041dd0a4c" - url: "https://pub.dev" - source: hosted - version: "0.0.5" flutter_highlight: dependency: transitive description: @@ -380,10 +364,10 @@ packages: dependency: "direct main" description: name: get_it - sha256: "1d648d2dd2047d7f7450d5727ca24ee435f240385753d90b49650e3cdff32e56" + sha256: "568d62f0e68666fb5d95519743b3c24a34c7f19d834b0658c46e26d778461f66" url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "9.2.1" glob: dependency: transitive description: @@ -416,6 +400,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.3" + hooks: + dependency: transitive + description: + name: hooks + sha256: "7a08a0d684cb3b8fb604b78455d5d352f502b68079f7b80b831c62220ab0a4f6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" http: dependency: transitive description: @@ -460,10 +452,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.11.0" leak_tracker: dependency: transitive description: @@ -560,6 +552,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac" + url: "https://pub.dev" + source: hosted + version: "0.17.4" nested: dependency: transitive description: @@ -576,6 +576,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" package_config: dependency: transitive description: @@ -612,18 +620,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "3b4c1fc3aa55ddc9cd4aa6759984330d5c8e66aa7702a6223c61540dc6380c37" + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e url: "https://pub.dev" source: hosted - version: "2.2.19" + version: "2.2.22" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd" + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.6.0" path_provider_linux: dependency: transitive description: @@ -785,10 +793,10 @@ packages: dependency: transitive description: name: source_gen - sha256: "800f12fb87434defa13432ab37e33051b43b290a174e15259563b043cda40c46" + sha256: "1d562a3c1f713904ebbed50d2760217fd8a51ca170ac4b05b0db490699dbac17" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.2.0" source_map_stack_trace: dependency: transitive description: @@ -809,10 +817,10 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" url: "https://pub.dev" source: hosted - version: "1.10.1" + version: "1.10.2" sqlite3: dependency: transitive description: @@ -825,18 +833,18 @@ packages: dependency: "direct main" description: name: sqlite3_flutter_libs - sha256: "1e800ebe7f85a80a66adacaa6febe4d5f4d8b75f244e9838a27cb2ffc7aec08d" + sha256: "3ed7553eee7bb368f8950f58ba29f634e06e813c029aff6a0d60862b96de8454" url: "https://pub.dev" source: hosted - version: "0.5.41" + version: "0.6.0+eol" sqlparser: dependency: transitive description: name: sqlparser - sha256: "162435ede92bcc793ea939fdc0452eef0a73d11f8ed053b58a89792fba749da5" + sha256: "337e9997f7141ffdd054259128553c348635fa318f7ca492f07a4ab76f850d19" url: "https://pub.dev" source: hosted - version: "0.42.1" + version: "0.43.1" stack_trace: dependency: transitive description: @@ -901,14 +909,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.12" - timing: - dependency: transitive - description: - name: timing - sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" - url: "https://pub.dev" - source: hosted - version: "1.0.2" tuple: dependency: transitive description: @@ -937,18 +937,18 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "81777b08c498a292d93ff2feead633174c386291e35612f8da438d6e92c4447e" + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" url: "https://pub.dev" source: hosted - version: "6.3.20" + version: "6.3.28" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" url: "https://pub.dev" source: hosted - version: "6.3.4" + version: "6.4.1" url_launcher_linux: dependency: transitive description: @@ -961,10 +961,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" url: "https://pub.dev" source: hosted - version: "3.2.3" + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: @@ -977,10 +977,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" url_launcher_windows: dependency: transitive description: @@ -993,10 +993,10 @@ packages: dependency: transitive description: name: uuid - sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" url: "https://pub.dev" source: hosted - version: "4.5.2" + version: "4.5.3" vector_graphics: dependency: transitive description: @@ -1017,10 +1017,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc + sha256: "5a88dd14c0954a5398af544651c7fb51b457a2a556949bfb25369b210ef73a74" url: "https://pub.dev" source: hosted - version: "1.1.19" + version: "1.2.0" vector_math: dependency: transitive description: @@ -1033,10 +1033,10 @@ packages: dependency: transitive description: name: vm_service - sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" url: "https://pub.dev" source: hosted - version: "15.0.0" + version: "15.0.2" watcher: dependency: transitive description: @@ -1110,5 +1110,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.8.1 <4.0.0" - flutter: ">=3.32.0" + dart: ">=3.10.3 <4.0.0" + flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml index 38dd148..9d9144a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.0.0 + sdk: ^3.10.0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -35,8 +35,8 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: resource_portable: - d4rt: - flutter_d4rt: + d4rt: ^0.2.0 + analyzer: ^8.4.1 flutter_markdown_plus: flutter_markdown_plus_latex: flutter_code_editor: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 0143d6e..c3384ec 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -7,14 +7,11 @@ #include "generated_plugin_registrant.h" #include -#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); - Sqlite3FlutterLibsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b707726..01d3836 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -4,7 +4,6 @@ list(APPEND FLUTTER_PLUGIN_LIST share_plus - sqlite3_flutter_libs url_launcher_windows ) From 9b6887f58ae9ad527c424da8ae48a2a55d4de53a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez?= Date: Thu, 26 Feb 2026 20:39:40 +0100 Subject: [PATCH 4/4] Missing generated file --- lib/d4rt_bridge.g.dart | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 lib/d4rt_bridge.g.dart diff --git a/lib/d4rt_bridge.g.dart b/lib/d4rt_bridge.g.dart new file mode 100644 index 0000000..acce1e5 --- /dev/null +++ b/lib/d4rt_bridge.g.dart @@ -0,0 +1,37 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'd4rt_bridge.dart'; + +// ************************************************************************** +// D4rtBridgeGenerator +// ************************************************************************** + +/// Generated bridge for D4rtBridgeImpl. +/// +/// Do not modify by hand. + +/// Bridge definition for [D4rtBridgeImpl]. +final d4rtBridgeImplBridge = BridgedClass( + name: 'D4rtBridgeImpl', + nativeType: D4rtBridgeImpl, + staticMethods: { + 'fn': (visitor, positionalArgs, namedArgs) { + positionalArgs.requireExactCount(2, 'D4rtBridgeImpl.fn'); + return D4rtBridgeImpl.fn( + positionalArgs.required(0, 'formulaName'), + positionalArgs.extractMap(1, 'inputValues'), + ); + }, + }, +); + +/// Register all d4rt_bridge bridges from this file with the interpreter. +void registerD4rtBridgeBridges(D4rt interpreter) { + // ignore: unused_local_variable + const defaultUri = 'd4rt_bridge.dart'; + + interpreter.registerBridgedClass( + d4rtBridgeImplBridge, + 'package:formulas/runtime_bridge.dart', + ); +}