porous 0.3.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87cf02a737a26d181f89e3ee42f73574a30473e490b4ce045d76960e3dbc6fa5
4
- data.tar.gz: 679a28921b7fc66630d2ec21b75543cd7dc4906d3f77230a052ff9fb08ab1281
3
+ metadata.gz: 87c6a954ddaf691739b880123048bf3345ece37389404d7a1c7163b27119c0ac
4
+ data.tar.gz: d13c2be795c751e8eb6095e0642560065e4815ff04ac17ffd7605e1092d775ba
5
5
  SHA512:
6
- metadata.gz: 7e25b7156a1e9d10c8d66ea198be3ddb3da0a87aa904519b6fbe0c71006e13d33f5840c051114c7a8e8506ce73f033492fb1bc4089506534759b8bc1a86d18e6
7
- data.tar.gz: 8da9145c152a0d93d0a2d182f3ade0da334dc9bb898a75483675173f341a3ea42e5fcd1bc8e16b5e949e92b283fc1f845f7772c3fd19e193283d5338a8acd557
6
+ metadata.gz: 84e53a85958c58e66417eeadc77fd35332ac0f30b7b59eaef49e39ebeb1cc83d8f3dc906d848c40eb1f4ca08604e36d06efc6b72de0427911a185f705278ce95
7
+ data.tar.gz: 7e42e43664d2329d25f47999bddf7e0c28cbd2ccd36c69ce81e4e94a4e6894a5c905bc5f9ddce41b0ce6770f5f116c369b48c6d2622135e8b2e32221e7d1a6d5
data/CHANGELOG.md CHANGED
@@ -1,6 +1,5 @@
1
1
  ## [Planned]
2
2
 
3
- - Production mode
4
3
  - Data Abstraction Layer / Object Relational Model
5
4
  - Event Model
6
5
  - Plugin / Extension system
@@ -13,6 +12,20 @@
13
12
  - Disk (file)
14
13
  - Databases (SQLite, PostgreSQL)
15
14
 
15
+ ## [Unreleased]
16
+
17
+ ## [0.3.1] - 24 February 2024
18
+
19
+ - Production Mode
20
+ - `porous build production`
21
+ - `porous server`
22
+ - Needs `ssl/cert.pem` and `ssl/key.pem`
23
+ - Binds on :80 and :443
24
+ - Development Mode
25
+ - `porous dev`
26
+ - Binds on :9292
27
+ - Serves favicon from `static/favicon.svg`
28
+
16
29
  ## [0.3.0] - 22 February 2024
17
30
 
18
31
  - WebSockets support
data/README.md CHANGED
@@ -42,21 +42,21 @@ Porous is not a framework. You don't build an application with it as a dependenc
42
42
 
43
43
  ## Usage
44
44
 
45
- Porous is still pre-alpha and so is not ready for usage yet, but the general idea is that you would define your application's entities, pages, components and events in Ruby scripts structured in a specific way. Then you would simply run `porous` while pointing it to that folder and it will spin up a Rack-compatible web server for you to use.
45
+ Porous is still pre-alpha and so is not ready for usage yet, but the general idea is that you would define your application's entities, pages, components and events in Ruby scripts structured in a specific way. Then you would simply run `porous server` while pointing it to that folder and it will spin up a Rack-compatible web server for you to use.
46
46
 
47
47
  > ⚠️ Expect any and all APIs to change radically until version 1.0! Hence why it won't be documented or properly tested until things settle to a more stable state.
48
48
 
49
- To start a new Porous project simply `gem install porous` using whichever Ruby environment you want to use (Ruby 3.0+). Then change to that directory and run:
49
+ To start a new Porous project simply `gem install porous` using whichever Ruby environment you want to use (Ruby 3.0+) and then `porous new` with your project name. Then change to that directory and run:
50
50
 
51
- $ porous server
51
+ $ porous dev
52
52
 
53
- By default Porous will run at `localhost:9292`. Now you can edit `pages/home.rb` or add more pages. Files you modify will be hot-reloaded so you can simply open the page in your browser and edit the file. Hot-reloading will be improved once WebSockets support is implemented.
53
+ By default Porous will run at `localhost:9292`. Now you can edit `pages/home.rb` or add more pages. Files you modify will be hot-reloaded, so you can simply open the page in your browser and edit the file.
54
54
 
55
55
  ### Running examples
56
56
 
57
- To test out some example "apps" using Porous you can navigate to the examples folder and in any folder run:
57
+ To test out an example application using Porous you can clone the [Porous website](https://github.com/exastencil/porous.dev) and in that directory:
58
58
 
59
- $ porous server
59
+ $ porous dev
60
60
 
61
61
  ## Development
62
62
 
@@ -20,6 +20,7 @@ module Porous
20
20
 
21
21
  script src: '/static/dist/application.js', id: 'application'
22
22
  script src: 'https://cdn.tailwindcss.com'
23
+ link rel: 'icon', href: '/static/favicon.svg'
23
24
  end
24
25
 
25
26
  body class: 'bg-gray-50 dark:bg-gray-900' do
@@ -12,10 +12,10 @@ module Porous
12
12
  true
13
13
  end
14
14
 
15
- desc 'build', 'Build static assets'
16
- def build
15
+ desc 'build ENV', 'Build static assets for environment (default: development)'
16
+ def build(env = :development)
17
17
  empty_directory 'static/dist', verbose: false, force: options[:force]
18
- Porous::Server::Builder.new.build
18
+ Porous::Server::Builder.new(env.to_sym).build
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Porous
4
+ class CLI < Thor
5
+ check_unknown_options!
6
+
7
+ namespace :dev
8
+
9
+ desc 'dev', 'Starts a Porous development server'
10
+ def dev # rubocop:todo Metrics/MethodLength, Metrics/AbcSize
11
+ empty_directory 'static/dist', verbose: false, force: options[:force]
12
+
13
+ Agoo::Log.configure(
14
+ dir: '',
15
+ console: true,
16
+ classic: true,
17
+ colorize: true,
18
+ states: {
19
+ INFO: true,
20
+ DEBUG: false,
21
+ connect: false,
22
+ request: false,
23
+ response: false,
24
+ eval: true,
25
+ push: true
26
+ }
27
+ )
28
+
29
+ Agoo::Server.init 9292, Dir.pwd, thread_count: 1
30
+ Agoo::Server.use Rack::ContentLength
31
+ Agoo::Server.use Rack::Static, urls: ['/static']
32
+ Agoo::Server.use Rack::ShowExceptions
33
+
34
+ # Socket Communication
35
+ $socket ||= Porous::Server::Socket.new
36
+ Agoo::Server.handle nil, '/connect', Porous::Server::Connect.new
37
+ # Server-Side Rendering
38
+ Agoo::Server.handle nil, '**', Porous::Server::Application.new
39
+ Agoo::Server.start
40
+ # Live Reload Builder
41
+ Server::Builder.new.build.start
42
+ end
43
+ end
44
+ end
@@ -6,19 +6,7 @@ module Porous
6
6
 
7
7
  namespace :server
8
8
 
9
- desc 'server [OPTIONS]', 'Starts Porous server'
10
- method_option :port,
11
- aliases: :p,
12
- type: :numeric,
13
- default: 9292,
14
- desc: 'The port Porous will listen on'
15
-
16
- method_option :host,
17
- aliases: :h,
18
- type: :string,
19
- default: 'localhost',
20
- desc: 'The host address Porous will bind to'
21
-
9
+ desc 'server [OPTIONS]', 'Starts Porous server in production mode'
22
10
  def server # rubocop:todo Metrics/MethodLength
23
11
  Agoo::Log.configure(dir: '',
24
12
  console: true,
@@ -27,26 +15,33 @@ module Porous
27
15
  states: {
28
16
  INFO: true,
29
17
  DEBUG: false,
30
- connect: false,
31
- request: false,
18
+ connect: true,
19
+ request: true,
32
20
  response: false,
33
- eval: true,
34
- push: true
21
+ eval: false,
22
+ push: false
35
23
  })
36
24
 
37
- Agoo::Server.init 9292, Dir.pwd, thread_count: 1
25
+ Agoo::Server.init(
26
+ 80, '.',
27
+ thread_count: 0,
28
+ ssl_cert: 'ssl/cert.pem',
29
+ ssl_key: 'ssl/key.pem',
30
+ bind: [
31
+ 'http://127.0.0.1:80',
32
+ 'https://127.0.0.1:443'
33
+ ]
34
+ )
38
35
  Agoo::Server.use Rack::ContentLength
39
36
  Agoo::Server.use Rack::Static, urls: ['/static']
40
- Agoo::Server.use Rack::ShowExceptions
41
37
 
42
38
  # Socket Communication
43
39
  $socket ||= Porous::Server::Socket.new
44
40
  Agoo::Server.handle nil, '/connect', Porous::Server::Connect.new
45
41
  # Server-Side Rendering
46
42
  Agoo::Server.handle nil, '**', Porous::Server::Application.new
43
+
47
44
  Agoo::Server.start
48
- # Live Reload Builder
49
- Server::Builder.new.build.start
50
45
  end
51
46
  end
52
47
  end
@@ -1 +1,2 @@
1
1
  static/dist
2
+ ssl
@@ -1,7 +1,21 @@
1
1
  # <%= config[:project_name] %>
2
2
 
3
+ ## Development
4
+
3
5
  ```sh
4
- $ porous run
6
+ $ porous dev
5
7
  ```
6
8
 
7
- Go to [http://localhost:8080/](http://localhost:8080/)
9
+ Go to [http://localhost:9292/](http://localhost:9292/)
10
+
11
+ ## Production
12
+
13
+ Place your SSL certificate in `ssl`:
14
+
15
+ - `ssl/cert.pem`
16
+ - `ssl/key.pem`
17
+
18
+ ```sh
19
+ $ porous build production
20
+ $ porous server
21
+ ```
@@ -32,11 +32,7 @@ class Home
32
32
  end
33
33
  a href: 'https://github.com/exastencil/porous', target: '_blank', rel: 'noopener',
34
34
  class: 'flex items-center space-x-2 text-gray-500 dark:text-gray-400' do
35
- svg role: 'img', width: '24', height: '24', class: 'w-5 h-5', viewBox: '0 0 24 24', fill: 'currentColor',
36
- xmlns: 'http://www.w3.org/2000/svg' do
37
- title 'GitHub'
38
- path d: 'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'
39
- end
35
+ img class: 'w-8 h-8 text-gray-500', src: '/static/github.svg'
40
36
  span 'View on GitHub'
41
37
  end
42
38
  end
@@ -0,0 +1,4 @@
1
+ <svg role="img" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
2
+ <title>GitHub logo</title>
3
+ <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
4
+ </svg>
data/lib/porous/cli.rb CHANGED
@@ -12,5 +12,6 @@ require 'rack'
12
12
  require 'rackup/server'
13
13
 
14
14
  require 'porous/cli/build'
15
+ require 'porous/cli/dev'
15
16
  require 'porous/cli/new'
16
17
  require 'porous/cli/server'
@@ -5,7 +5,8 @@ require 'opal/builder_scheduler/sequential'
5
5
  module Porous
6
6
  module Server
7
7
  class Builder
8
- def initialize
8
+ def initialize(environment = :development)
9
+ @environment = environment
9
10
  @build_queue = Queue.new
10
11
  @last_build = nil
11
12
  @latest_change = Dir.glob(File.join('**', '*.rb')).map { |f| File.mtime f }.max
@@ -17,7 +18,8 @@ module Porous
17
18
  @latest_change = modified if modified > @latest_change
18
19
  "require '#{relative_path}'"
19
20
  end
20
- build_string = "require 'porous'; #{components.join ";"}".gsub '.rb', ''
21
+ build_string = "require 'porous'; #{components.join ";"}; ".gsub '.rb', ''
22
+ build_string << inject_socket_connection
21
23
  builder = Opal::Builder.new scheduler: Opal::BuilderScheduler::Sequential, cache: false
22
24
  builder.build_str build_string, '(inline)'
23
25
  File.binwrite "#{Dir.pwd}/static/dist/application.js", builder.to_s
@@ -42,11 +44,16 @@ module Porous
42
44
  Thread.new { build }.join
43
45
 
44
46
  # Notify clients
45
- $socket.public 'build', @last_build.inspect
47
+ $socket&.public 'build', @last_build.inspect
46
48
  @build_queue.clear
47
49
  end
48
50
  end
49
51
  # rubocop:enable Metrics/AbcSize
52
+
53
+ def inject_socket_connection
54
+ uri = @environment == :production ? 'wss://localhost/connect' : 'ws://localhost:9292/connect'
55
+ "$connection = '#{uri}'; "
56
+ end
50
57
  end
51
58
  end
52
59
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Porous
4
- VERSION = '0.3.0'
4
+ VERSION = '0.3.1'
5
5
  end
data/opal/porous.rb CHANGED
@@ -29,7 +29,7 @@ end
29
29
 
30
30
  $document.ready do
31
31
  Porous::Application.mount_to($document.body)
32
- Browser::Socket.new 'ws://localhost:9292/connect' do
32
+ Browser::Socket.new $connection do
33
33
  on :open do |_e|
34
34
  $console.info 'Connected to server!'
35
35
  end
@@ -38,14 +38,9 @@ $document.ready do
38
38
  channel, content = e.data.split '|'
39
39
  case channel
40
40
  when 'build'
41
- if content == 'started'
42
- $console.log 'New build started…'
43
- else
44
- $console.log 'Reloading scripts…'
45
- $document.location.reload
46
- end
41
+ $document.location.reload unless content == 'started'
47
42
  else
48
- $console.log "Received #{e.data}"
43
+ $console.log e.data
49
44
  end
50
45
  end
51
46
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: porous
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Exa Stencil
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-22 00:00:00.000000000 Z
11
+ date: 2024-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: agoo
@@ -102,11 +102,13 @@ files:
102
102
  - lib/porous/application.rb
103
103
  - lib/porous/cli.rb
104
104
  - lib/porous/cli/build.rb
105
+ - lib/porous/cli/dev.rb
105
106
  - lib/porous/cli/new.rb
106
107
  - lib/porous/cli/server.rb
107
108
  - lib/porous/cli/template/.gitignore.tt
108
109
  - lib/porous/cli/template/README.md.tt
109
110
  - lib/porous/cli/template/pages/home.rb
111
+ - lib/porous/cli/template/static/github.svg
110
112
  - lib/porous/cli/template/static/hero.png
111
113
  - lib/porous/component.rb
112
114
  - lib/porous/component/class_methods.rb