lively-electron 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bffd92014d38c79bc289629c4dfe8df220c0c3b6ded3686c9f866dac7e4f8693
4
+ data.tar.gz: c1e426dc11315953d167497056c40a95c553212c526866db81c2a9cacfa76d5e
5
+ SHA512:
6
+ metadata.gz: ce6a4525127b609bc2b7e00b971ad2e321b0f739ef115453dfae0ad8347f52ae3e50692be948b933067bb981a10b0c8d8212d3d66fd1358dd35923c15f4aa70c
7
+ data.tar.gz: a416d1d5636928c0817b6b9211b357a81501c664378aa5c795bcb4405ae9ece0a6ba7d91ab08a808c01824ae548581b64ac6935cd2a07b717672607442aa0d5c
checksums.yaml.gz.sig ADDED
Binary file
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ development_mode = ARGV.delete("--development")
5
+
6
+ if development_mode
7
+ ENV["LIVELY_VARIANT"] = "development"
8
+ ENV["CONSOLE_LEVEL"] = "debug"
9
+ end
10
+
11
+ main_js = File.join(__dir__, "..", "src", "main.js")
12
+ Process.exec("npx", "electron", main_js, *ARGV)
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "async/service"
5
+ require_relative "../lib/lively/electron"
6
+
7
+ ARGV.each do |path|
8
+ require(path)
9
+ end
10
+
11
+ configuration = Async::Service::Configuration.build do
12
+ service "lively-electron" do
13
+ include Lively::Electron::Environment::Application
14
+ end
15
+ end
16
+
17
+ Async::Service::Controller.run(configuration)
@@ -0,0 +1,222 @@
1
+ # Getting Started
2
+
3
+ This guide explains how to get started with `lively-electron` to create desktop applications from Lively Ruby applications.
4
+
5
+ ## Installation
6
+
7
+ Add the gem to your project:
8
+
9
+ ~~~ bash
10
+ $ bundle add lively-electron
11
+ ~~~
12
+
13
+ Also install the npm package for the Electron wrapper:
14
+
15
+ ~~~ bash
16
+ $ npm install lively-electron
17
+ ~~~
18
+
19
+ ## Core Concepts
20
+
21
+ `lively-electron` has several core components:
22
+
23
+ - A {ruby Lively::Electron::Environment::Application} which provides the server configuration for Electron apps using file descriptor inheritance.
24
+ - Standard {ruby Lively::Application} classes work without modification in desktop applications.
25
+
26
+ ## Usage
27
+
28
+ Create a new directory for your desktop app:
29
+
30
+ ~~~ bash
31
+ $ mkdir my_desktop_app
32
+ $ cd my_desktop_app
33
+ ~~~
34
+
35
+ Create a `gems.rb` file:
36
+
37
+ ~~~ ruby
38
+ source "https://rubygems.org"
39
+
40
+ gem "lively-electron"
41
+ ~~~
42
+
43
+ Install the dependencies:
44
+
45
+ ~~~ bash
46
+ $ bundle install
47
+ ~~~
48
+
49
+ ### Creating Your Application
50
+
51
+ Create an `application.rb` file:
52
+
53
+ ~~~ ruby
54
+ #!/usr/bin/env ruby
55
+ # frozen_string_literal: true
56
+
57
+ require "lively"
58
+
59
+ class HelloWorldView < Live::View
60
+ def initialize(...)
61
+ super
62
+
63
+ @data[:message] ||= "Hello from Lively Electron!"
64
+ end
65
+
66
+ def count
67
+ @data[:count].to_i
68
+ end
69
+
70
+ def count=(value)
71
+ @data[:count] = value.to_s
72
+ end
73
+
74
+ def handle(event)
75
+ action = event[:detail][:action]
76
+ case action
77
+ when "click"
78
+ self.count += 1
79
+ @data[:message] = "Clicked #{@data[:count]} times!"
80
+ update!
81
+ when "reset"
82
+ self.count = 0
83
+ @data[:message] = "Click the button below."
84
+ update!
85
+ end
86
+ end
87
+
88
+ def render(builder)
89
+ builder.tag(:div, class: "hello-app") do
90
+ builder.tag(:h1) { builder.text(@data[:message]) }
91
+
92
+ builder.tag(:div, class: "buttons") do
93
+ builder.tag(:button, onClick: forward_event(action: "click")) do
94
+ builder.text("Click me!")
95
+ end
96
+
97
+ if self.count > 0
98
+ builder.tag(:button, onClick: forward_event(action: "reset"), class: "reset") do
99
+ builder.text("Reset")
100
+ end
101
+ end
102
+ end
103
+
104
+ builder.tag(:p, class: "info") do
105
+ builder.text("This Lively app is running in Electron via file descriptor inheritance")
106
+ end
107
+
108
+ builder.tag(:p, class: "tech") do
109
+ builder.text("Node.js (bind port) → FD inheritance → Ruby (Lively) ↔ HTTP ↔ Electron (Chromium)")
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ Application = Lively::Application[HelloWorldView]
116
+ ~~~
117
+
118
+ ### Styling Your Application
119
+
120
+ Create a `public/_static/index.css` file:
121
+
122
+ ~~~ css
123
+ body {
124
+ margin: 0;
125
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
126
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
127
+ min-height: 100vh;
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ }
132
+
133
+ .hello-app {
134
+ background: white;
135
+ border-radius: 12px;
136
+ padding: 40px;
137
+ box-shadow: 0 10px 30px rgba(0,0,0,0.2);
138
+ text-align: center;
139
+ max-width: 500px;
140
+ margin: 20px;
141
+ }
142
+
143
+ .hello-app h1 {
144
+ color: #333;
145
+ margin-bottom: 30px;
146
+ font-size: 2.2em;
147
+ font-weight: 300;
148
+ }
149
+
150
+ .buttons {
151
+ margin: 30px 0;
152
+ }
153
+
154
+ .buttons button {
155
+ background: #007acc;
156
+ color: white;
157
+ border: none;
158
+ padding: 14px 28px;
159
+ border-radius: 8px;
160
+ font-size: 16px;
161
+ cursor: pointer;
162
+ margin: 0 10px;
163
+ transition: all 0.2s ease;
164
+ }
165
+
166
+ .buttons button:hover {
167
+ background: #005a9e;
168
+ transform: translateY(-1px);
169
+ }
170
+
171
+ .buttons button.reset {
172
+ background: #dc3545;
173
+ }
174
+
175
+ .buttons button.reset:hover {
176
+ background: #c82333;
177
+ }
178
+
179
+ .info {
180
+ color: #666;
181
+ margin: 30px 0 10px;
182
+ font-size: 1.1em;
183
+ }
184
+
185
+ .tech {
186
+ color: #999;
187
+ font-size: 0.9em;
188
+ font-family: Monaco, 'Courier New', monospace;
189
+ background: #f8f9fa;
190
+ padding: 10px;
191
+ border-radius: 4px;
192
+ margin-top: 20px;
193
+ }
194
+ ~~~
195
+
196
+ ### Running Your Desktop App
197
+
198
+ Launch your Lively application in Electron:
199
+
200
+ ~~~ bash
201
+ $ lively-electron application.rb
202
+ ~~~
203
+
204
+ You should see a desktop window with your interactive Lively application running natively.
205
+
206
+ ### Development Mode
207
+
208
+ For development with DevTools enabled:
209
+
210
+ ~~~ bash
211
+ $ lively-electron --development application.rb
212
+ ~~~
213
+
214
+ ### Testing Server Only
215
+
216
+ You can test just the Ruby server component:
217
+
218
+ ~~~ bash
219
+ $ lively-electron-server application.rb
220
+ ~~~
221
+
222
+ This starts the server without opening the Electron window, useful for debugging the Ruby application logic.
@@ -0,0 +1,13 @@
1
+ # Automatically generated context index for Utopia::Project guides.
2
+ # Do not edit then files in this directory directly, instead edit the guides and then run `bake utopia:project:agent:context:update`.
3
+ ---
4
+ description: Electron wrapper for Lively Ruby applications
5
+ metadata:
6
+ documentation_uri: https://github.com/socketry/lively-electron/
7
+ funding_uri: https://github.com/sponsors/ioquatix
8
+ source_code_uri: https://github.com/socketry/lively-electron.git
9
+ files:
10
+ - path: getting-started.md
11
+ title: Getting Started
12
+ description: This guide explains how to get started with `lively-electron` to create
13
+ desktop applications from Lively Ruby applications.
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2025, by Samuel Williams.
5
+
6
+ require "lively/environment/application"
7
+ require "io/endpoint/bound_endpoint"
8
+ require "console"
9
+
10
+ # @namespace
11
+ module Lively
12
+ # @namespace
13
+ module Electron
14
+ # @namespace
15
+ module Environment
16
+ # Represents the environment configuration for a Lively Electron application server.
17
+ #
18
+ # This module provides server configuration for Electron apps, using TCP
19
+ # localhost binding for direct connection from Electron/Chromium.
20
+ module Application
21
+ include Lively::Environment::Application
22
+
23
+ def url
24
+ "http://localhost:0/"
25
+ end
26
+
27
+ def endpoint
28
+ if descriptor = ENV["LIVELY_SERVER_DESCRIPTOR"]
29
+ Console.info(self, "Using inherited file descriptor.", descriptor: descriptor)
30
+ bound_socket = Socket.for_fd(descriptor.to_i)
31
+
32
+ # Ensure that the socket is non-blocking:
33
+ bound_socket.nonblock = true
34
+
35
+ endpoint = IO::Endpoint::BoundEndpoint.new(nil, [bound_socket])
36
+ end
37
+
38
+ Async::HTTP::Endpoint.parse(self.url, endpoint)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2025, by Samuel Williams.
5
+
6
+ # @namespace
7
+ module Lively
8
+ # @namespace
9
+ module Electron
10
+ VERSION = "0.1.0"
11
+ end
12
+ end
13
+
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2025, by Samuel Williams.
5
+
6
+ require "lively"
7
+ require_relative "electron/version"
8
+ require_relative "electron/environment"
data/license.md ADDED
@@ -0,0 +1,21 @@
1
+ # MIT License
2
+
3
+ Copyright, 2025, by Samuel Williams.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/readme.md ADDED
@@ -0,0 +1,37 @@
1
+ # Lively Electron
2
+
3
+ Electron wrapper for running [Lively](https://github.com/socketry/lively) Ruby applications as desktop apps.
4
+
5
+ [![Development Status](https://github.com/socketry/lively-electron/workflows/Test/badge.svg)](https://github.com/socketry/lively-electron/actions?workflow=Test)
6
+
7
+ ## Usage
8
+
9
+ Please see the [project documentation](https://github.com/socketry/lively-electron/) for more details.
10
+
11
+ - [Getting Started](https://github.com/socketry/lively-electron/guides/getting-started/index) - This guide explains how to get started with `lively-electron` to create desktop applications from Lively Ruby applications.
12
+
13
+ ## Releases
14
+
15
+ Please see the [project releases](https://github.com/socketry/lively-electron/releases/index) for all releases.
16
+
17
+ ### v0.1.0
18
+
19
+ - Initial implementation.
20
+
21
+ ## Contributing
22
+
23
+ We welcome contributions to this project.
24
+
25
+ 1. Fork it.
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`).
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`).
28
+ 4. Push to the branch (`git push origin my-new-feature`).
29
+ 5. Create new Pull Request.
30
+
31
+ ### Developer Certificate of Origin
32
+
33
+ In order to protect users of this project, we require all contributors to comply with the [Developer Certificate of Origin](https://developercertificate.org/). This ensures that all contributions are properly licensed and attributed.
34
+
35
+ ### Community Guidelines
36
+
37
+ This project is best served by a collaborative and respectful environment. Treat each other professionally, respect differing viewpoints, and engage constructively. Harassment, discrimination, or harmful behavior is not tolerated. Communicate clearly, listen actively, and support one another. If any issues arise, please inform the project maintainers.
data/releases.md ADDED
@@ -0,0 +1,5 @@
1
+ # Releases
2
+
3
+ ## v0.1.0
4
+
5
+ - Initial implementation.
data/src/main.js ADDED
@@ -0,0 +1,155 @@
1
+ const {app, BrowserWindow, ipcMain} = require('electron');
2
+ const {spawn} = require('child_process');
3
+ const http = require('http');
4
+ const net = require('net');
5
+ const path = require('path');
6
+ const fs = require('fs');
7
+
8
+ class LivelyElectronApp {
9
+ constructor() {
10
+ this.rubyProcess = null;
11
+ this.mainWindow = null;
12
+ this.serverUrl = null;
13
+
14
+ // Store the working directory (should be preserved by direct CLI)
15
+ this.originalCwd = process.cwd();
16
+ console.log('💾 Working directory:', this.originalCwd);
17
+ }
18
+
19
+ isDevelopment() {
20
+ const variant = process.env.LIVELY_VARIANT || process.env.VARIANT;
21
+ return variant === "development";
22
+ }
23
+
24
+ async start() {
25
+ try {
26
+ // 1. Start Ruby Lively server on TCP localhost
27
+ await this.startLivelyServer();
28
+
29
+ // 2. Create Electron window (connects directly to Ruby server)
30
+ await this.createWindow();
31
+
32
+ console.log(`Lively Electron started - Ruby server: ${this.serverUrl}`);
33
+ } catch (error) {
34
+ console.error('Failed to start Lively Electron:', error);
35
+ app.quit();
36
+ }
37
+ }
38
+
39
+ async startLivelyServer() {
40
+ return new Promise((resolve, reject) => {
41
+ // Forward all CLI args to the Ruby server; let the Ruby script decide the application file
42
+ const args = process.argv.slice(2);
43
+
44
+ // Create server and let it bind+listen, then pass handle to child
45
+ const server = net.createServer();
46
+ server.listen(0, '127.0.0.1', () => {
47
+ const port = server.address().port;
48
+ this.serverUrl = `http://localhost:${port}`;
49
+
50
+ const fd = server._handle.fd;
51
+
52
+ // Start Ruby process with FD passed via stdio and forward all CLI args
53
+ const livelyElectronScript = path.join(__dirname, '..', 'bin', 'lively-electron-server');
54
+ const childArgs = args.slice();
55
+
56
+ const child = spawn('bundle', ['exec', livelyElectronScript, ...childArgs], {
57
+ stdio: [
58
+ 'inherit', // stdin
59
+ 'inherit', // stdout
60
+ 'inherit', // stderr
61
+ fd // Pass socket FD as stdio[3]
62
+ ],
63
+ env: {
64
+ ...process.env,
65
+ LIVELY_SERVER_DESCRIPTOR: '3' // Tell child it's on FD 3
66
+ }
67
+ });
68
+
69
+ child.on('spawn', () => {
70
+ this.rubyProcess = child;
71
+ server.close((error) => {
72
+ if (error) {
73
+ reject(error);
74
+ } else {
75
+ console.log(`✅ Ruby server should be ready: ${this.serverUrl}`);
76
+ resolve();
77
+ }
78
+ });
79
+ });
80
+
81
+ child.on('error', (error) => {
82
+ server.close();
83
+ console.error('Failed to spawn Ruby process:', error);
84
+ reject(error);
85
+ });
86
+
87
+ child.on('close', (code) => {
88
+ this.rubyProcess = null;
89
+ console.log(`Ruby process exited with code ${code}`);
90
+ if (code !== 0) {
91
+ reject(new Error(`Ruby process failed with code ${code}`));
92
+ }
93
+ });
94
+ });
95
+ });
96
+ }
97
+
98
+ async createWindow() {
99
+ this.mainWindow = new BrowserWindow({
100
+ width: 1200,
101
+ height: 800,
102
+ webPreferences: {
103
+ nodeIntegration: false,
104
+ contextIsolation: true,
105
+ enableRemoteModule: false
106
+ },
107
+ titleBarStyle: 'hiddenInset'
108
+ });
109
+
110
+ // Load the Lively app directly
111
+ await this.mainWindow.loadURL(this.serverUrl);
112
+
113
+ // Open DevTools in development mode
114
+ if (this.isDevelopment()) {
115
+ this.mainWindow.webContents.openDevTools();
116
+ }
117
+
118
+ this.mainWindow.on('closed', () => {
119
+ this.cleanup();
120
+ });
121
+ }
122
+
123
+ cleanup() {
124
+ if (this.rubyProcess) {
125
+ this.rubyProcess.kill();
126
+ }
127
+ }
128
+ }
129
+
130
+ // Electron app lifecycle
131
+ app.whenReady().then(() => {
132
+ console.log('Electron ready, starting Lively app...');
133
+ const livelyApp = new LivelyElectronApp();
134
+ livelyApp.start().catch(error => {
135
+ console.error('Failed to start Lively app:', error);
136
+ app.quit();
137
+ });
138
+ });
139
+
140
+ app.on('window-all-closed', () => {
141
+ if (process.platform !== 'darwin') {
142
+ app.quit();
143
+ }
144
+ });
145
+
146
+ app.on('activate', () => {
147
+ if (BrowserWindow.getAllWindows().length === 0) {
148
+ const livelyApp = new LivelyElectronApp();
149
+ livelyApp.start();
150
+ }
151
+ });
152
+
153
+ app.on('before-quit', () => {
154
+ // Cleanup will be handled by window close event
155
+ });
data.tar.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ c�T��F����;�l�%A&��F�{Fҵ���!��ū����c]6kU*�;dv�A�o��G�P�'-ڃnΦ��Q�u|�`0����X��ƺ
2
+ ��_�OzY���X̅=m�x'��]�];,�%��i��� U���6�3$��l�vx�7f��qV� G �q+�����l�Ӏo� ��Kk@ ��Z"�o�!=��Wj[��������x�t�)tE̵N�tĬCUER���u��=V㸾�-��v��n+2\���: ���ЯL��ʜ{�̫WC;~���Q�(����u]��^"� u ��4}����#k����#P����8����T��b�Xj����Oz�-h}sn_f�5����z���@�P��,�0�Hf�3˜�8Oދ|i
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lively-electron
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Samuel Williams
8
+ bindir: bin
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11
13
+ ZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK
14
+ CZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz
15
+ MjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd
16
+ MBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj
17
+ bzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
18
+ igKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2
19
+ 9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW
20
+ sGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE
21
+ e5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN
22
+ XibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss
23
+ RZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn
24
+ tUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM
25
+ zp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW
26
+ xm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
27
+ BBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs
28
+ aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs
29
+ aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE
30
+ cBsSYwK6fYpM+hA5B5yZY2+L0Z+27jF1pWGgbhPH8/FjjBLVn+VFok3CDpRqwXCl
31
+ xCO40JEkKdznNy2avOMra6PFiQyOE74kCtv7P+Fdc+FhgqI5lMon6tt9rNeXmnW/
32
+ c1NaMRdxy999hmRGzUSFjozcCwxpy/LwabxtdXwXgSay4mQ32EDjqR1TixS1+smp
33
+ 8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws
34
+ JkxfQWC+jBVeG9ZtPhQgZpfhvh+6hMhraUYRQ6XGyvBqEUe+yo6DKIT3MtGE2+CP
35
+ eX9i9ZWBydWb8/rvmwmX2kkcBbX0hZS1rcR593hGc61JR6lvkGYQ2MYskBveyaxt
36
+ Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
37
+ voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
38
+ -----END CERTIFICATE-----
39
+ date: 1980-01-02 00:00:00.000000000 Z
40
+ dependencies:
41
+ - !ruby/object:Gem::Dependency
42
+ name: lively
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.14'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.14'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sus
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: covered
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bake-test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ executables:
98
+ - lively-electron
99
+ - lively-electron-server
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - bin/lively-electron
104
+ - bin/lively-electron-server
105
+ - context/getting-started.md
106
+ - context/index.yaml
107
+ - lib/lively/electron.rb
108
+ - lib/lively/electron/environment.rb
109
+ - lib/lively/electron/version.rb
110
+ - license.md
111
+ - readme.md
112
+ - releases.md
113
+ - src/main.js
114
+ homepage: https://github.com/socketry/lively-electron
115
+ licenses:
116
+ - MIT
117
+ metadata:
118
+ documentation_uri: https://github.com/socketry/lively-electron/
119
+ funding_uri: https://github.com/sponsors/ioquatix
120
+ source_code_uri: https://github.com/socketry/lively-electron.git
121
+ rdoc_options: []
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '3.2'
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubygems_version: 3.6.9
136
+ specification_version: 4
137
+ summary: Electron wrapper for Lively Ruby applications
138
+ test_files: []
metadata.gz.sig ADDED
Binary file