wassup 0.3.2 → 0.4.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: bc1589d0e24a9bac6c55315341d403e6083a82d7e6f1c05316264c005a5bcbe4
4
- data.tar.gz: 35453b0fd0f67c6a25f4d3fdd94d5dd59bb0c03aaae3ecfc54f5b157ec34f8fa
3
+ metadata.gz: 2164cf9c9102e1abf2ba7703a50018ae66e2b16ca3ff7202f2b9bb34e250e6b3
4
+ data.tar.gz: c5178959ef98124fddc2b6af5901b3fe718a4f1c8cc49fa177ec438aff3453e1
5
5
  SHA512:
6
- metadata.gz: 3889de2432cded98ced5b57f48daef6e26baa5d3faf3b7388f85208dd806ae09b0c21684c16b9816bc07d7958e9c1861c62088b08dac528bb98d1609b284f953
7
- data.tar.gz: 7aadbc0767bdc437ee312e0497e5f71f9b2bd0976104c732a27d27c7dd423631622e3abb531bfb2eaa9c63b90e5455803e91170ac502ae6b09d2e2979ed21cf5
6
+ metadata.gz: 28ce6b6d4b756b0e5f90e99947929293a2edbd1a63dbc51deef9c4ab411ed6638eea892c0e86e896a4d746502ef9b880f7ed6d01d004410832def9aaad45762e
7
+ data.tar.gz: 3e8053061acc17ad9aa8fee89ca161d5547a05f2ae3d0a79d4871a8f4be384ad2072564fad67ca4bb7d229a6f1c104e0ec2a90718d1b5b95d81a82f972699fde
data/Gemfile CHANGED
@@ -3,5 +3,8 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in wassup.gemspec
4
4
  gemspec
5
5
 
6
+ gem "colorize"
7
+ gem "rest-client"
8
+
6
9
  gem "rake", "~> 12.0"
7
10
  gem "rspec", "~> 3.0"
data/Gemfile.lock CHANGED
@@ -1,23 +1,24 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wassup (0.2.1)
4
+ wassup (0.4.0)
5
5
  curses
6
6
  rest-client
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- curses (1.4.2)
11
+ colorize (0.8.1)
12
+ curses (1.4.4)
12
13
  diff-lcs (1.4.4)
13
14
  domain_name (0.5.20190701)
14
15
  unf (>= 0.0.5, < 1.0.0)
15
16
  http-accept (1.7.0)
16
- http-cookie (1.0.4)
17
+ http-cookie (1.0.5)
17
18
  domain_name (~> 0.5)
18
19
  mime-types (3.4.1)
19
20
  mime-types-data (~> 3.2015)
20
- mime-types-data (3.2021.1115)
21
+ mime-types-data (3.2023.0218.1)
21
22
  netrc (0.11.0)
22
23
  rake (12.3.3)
23
24
  rest-client (2.1.0)
@@ -40,15 +41,17 @@ GEM
40
41
  rspec-support (3.10.3)
41
42
  unf (0.1.4)
42
43
  unf_ext
43
- unf_ext (0.0.8)
44
+ unf_ext (0.0.8.2)
44
45
 
45
46
  PLATFORMS
46
47
  arm64-darwin-21
47
48
 
48
49
  DEPENDENCIES
50
+ colorize
49
51
  rake (~> 12.0)
52
+ rest-client
50
53
  rspec (~> 3.0)
51
54
  wassup!
52
55
 
53
56
  BUNDLED WITH
54
- 2.2.3
57
+ 2.2.33
data/bin/wassup CHANGED
@@ -4,6 +4,7 @@ require 'wassup'
4
4
 
5
5
  debug = ARGV.delete("--debug")
6
6
  path = ARGV[0] || 'Supfile'
7
+ port = ARGV[1] || 0
7
8
 
8
9
  unless File.exists?(path)
9
10
  raise "Missing file: #{path}"
@@ -12,5 +13,5 @@ end
12
13
  if debug
13
14
  Wassup::App.debug(path: path)
14
15
  else
15
- Wassup::App.start(path: path)
16
+ Wassup::App.start(path: path, port: port.to_i)
16
17
  end
@@ -53,8 +53,9 @@ const config = {
53
53
  type: 'doc',
54
54
  docId: 'intro',
55
55
  position: 'left',
56
- label: 'Tutorial',
56
+ label: 'Docs',
57
57
  },
58
+ {to: 'showcase', label: 'Showcase', position: 'left'},
58
59
  {to: '/blog', label: 'Blog', position: 'left'},
59
60
  {
60
61
  href: 'https://github.com/joshdholtz/wassup',
@@ -80,7 +81,7 @@ const config = {
80
81
  items: [
81
82
  {
82
83
  label: 'Twitter',
83
- href: 'https://twitter.com/joshdholtz',
84
+ href: 'https://twitter.com/WassupDashboard',
84
85
  },
85
86
  ],
86
87
  },
@@ -5,6 +5,7 @@
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
+ "name": "docs",
8
9
  "version": "0.0.0",
9
10
  "dependencies": {
10
11
  "@docusaurus/core": "2.0.0-beta.10",
@@ -11138,7 +11139,6 @@
11138
11139
  "version": "4.5.3",
11139
11140
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz",
11140
11141
  "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==",
11141
- "dev": true,
11142
11142
  "bin": {
11143
11143
  "tsc": "bin/tsc",
11144
11144
  "tsserver": "bin/tsserver"
@@ -14098,7 +14098,8 @@
14098
14098
  "@mdx-js/react": {
14099
14099
  "version": "1.6.22",
14100
14100
  "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz",
14101
- "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg=="
14101
+ "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==",
14102
+ "requires": {}
14102
14103
  },
14103
14104
  "@mdx-js/runtime": {
14104
14105
  "version": "1.6.22",
@@ -14181,42 +14182,50 @@
14181
14182
  "@svgr/babel-plugin-add-jsx-attribute": {
14182
14183
  "version": "6.0.0",
14183
14184
  "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz",
14184
- "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA=="
14185
+ "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==",
14186
+ "requires": {}
14185
14187
  },
14186
14188
  "@svgr/babel-plugin-remove-jsx-attribute": {
14187
14189
  "version": "6.0.0",
14188
14190
  "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz",
14189
- "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw=="
14191
+ "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==",
14192
+ "requires": {}
14190
14193
  },
14191
14194
  "@svgr/babel-plugin-remove-jsx-empty-expression": {
14192
14195
  "version": "6.0.0",
14193
14196
  "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz",
14194
- "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA=="
14197
+ "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==",
14198
+ "requires": {}
14195
14199
  },
14196
14200
  "@svgr/babel-plugin-replace-jsx-attribute-value": {
14197
14201
  "version": "6.0.0",
14198
14202
  "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz",
14199
- "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ=="
14203
+ "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==",
14204
+ "requires": {}
14200
14205
  },
14201
14206
  "@svgr/babel-plugin-svg-dynamic-title": {
14202
14207
  "version": "6.0.0",
14203
14208
  "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz",
14204
- "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg=="
14209
+ "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==",
14210
+ "requires": {}
14205
14211
  },
14206
14212
  "@svgr/babel-plugin-svg-em-dimensions": {
14207
14213
  "version": "6.0.0",
14208
14214
  "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz",
14209
- "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA=="
14215
+ "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==",
14216
+ "requires": {}
14210
14217
  },
14211
14218
  "@svgr/babel-plugin-transform-react-native-svg": {
14212
14219
  "version": "6.0.0",
14213
14220
  "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz",
14214
- "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ=="
14221
+ "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==",
14222
+ "requires": {}
14215
14223
  },
14216
14224
  "@svgr/babel-plugin-transform-svg-component": {
14217
14225
  "version": "6.1.0",
14218
14226
  "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.1.0.tgz",
14219
- "integrity": "sha512-1zacrn08K5RyV2NtXahOZ5Im/+aB1Y0LVh6QpzwgQV05sY7H5Npq+OcW/UqXbfB2Ua/WnHsFossFQqigCjarYg=="
14227
+ "integrity": "sha512-1zacrn08K5RyV2NtXahOZ5Im/+aB1Y0LVh6QpzwgQV05sY7H5Npq+OcW/UqXbfB2Ua/WnHsFossFQqigCjarYg==",
14228
+ "requires": {}
14220
14229
  },
14221
14230
  "@svgr/babel-preset": {
14222
14231
  "version": "6.1.0",
@@ -14666,17 +14675,20 @@
14666
14675
  "acorn-dynamic-import": {
14667
14676
  "version": "4.0.0",
14668
14677
  "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
14669
- "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw=="
14678
+ "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==",
14679
+ "requires": {}
14670
14680
  },
14671
14681
  "acorn-import-assertions": {
14672
14682
  "version": "1.8.0",
14673
14683
  "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
14674
- "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw=="
14684
+ "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
14685
+ "requires": {}
14675
14686
  },
14676
14687
  "acorn-jsx": {
14677
14688
  "version": "5.3.2",
14678
14689
  "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
14679
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="
14690
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
14691
+ "requires": {}
14680
14692
  },
14681
14693
  "acorn-walk": {
14682
14694
  "version": "8.2.0",
@@ -14737,7 +14749,8 @@
14737
14749
  "ajv-keywords": {
14738
14750
  "version": "3.5.2",
14739
14751
  "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
14740
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
14752
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
14753
+ "requires": {}
14741
14754
  },
14742
14755
  "algoliasearch": {
14743
14756
  "version": "4.11.0",
@@ -15845,7 +15858,8 @@
15845
15858
  "cssnano-utils": {
15846
15859
  "version": "2.0.1",
15847
15860
  "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz",
15848
- "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ=="
15861
+ "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==",
15862
+ "requires": {}
15849
15863
  },
15850
15864
  "csso": {
15851
15865
  "version": "4.2.0",
@@ -17171,7 +17185,8 @@
17171
17185
  "icss-utils": {
17172
17186
  "version": "5.1.0",
17173
17187
  "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
17174
- "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="
17188
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
17189
+ "requires": {}
17175
17190
  },
17176
17191
  "ignore": {
17177
17192
  "version": "5.1.9",
@@ -18427,22 +18442,26 @@
18427
18442
  "postcss-discard-comments": {
18428
18443
  "version": "5.0.1",
18429
18444
  "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz",
18430
- "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg=="
18445
+ "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==",
18446
+ "requires": {}
18431
18447
  },
18432
18448
  "postcss-discard-duplicates": {
18433
18449
  "version": "5.0.1",
18434
18450
  "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz",
18435
- "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA=="
18451
+ "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==",
18452
+ "requires": {}
18436
18453
  },
18437
18454
  "postcss-discard-empty": {
18438
18455
  "version": "5.0.1",
18439
18456
  "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz",
18440
- "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw=="
18457
+ "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==",
18458
+ "requires": {}
18441
18459
  },
18442
18460
  "postcss-discard-overridden": {
18443
18461
  "version": "5.0.1",
18444
18462
  "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz",
18445
- "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q=="
18463
+ "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==",
18464
+ "requires": {}
18446
18465
  },
18447
18466
  "postcss-discard-unused": {
18448
18467
  "version": "5.0.1",
@@ -18532,7 +18551,8 @@
18532
18551
  "postcss-modules-extract-imports": {
18533
18552
  "version": "3.0.0",
18534
18553
  "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
18535
- "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw=="
18554
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
18555
+ "requires": {}
18536
18556
  },
18537
18557
  "postcss-modules-local-by-default": {
18538
18558
  "version": "4.0.0",
@@ -18563,7 +18583,8 @@
18563
18583
  "postcss-normalize-charset": {
18564
18584
  "version": "5.0.1",
18565
18585
  "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz",
18566
- "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg=="
18586
+ "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==",
18587
+ "requires": {}
18567
18588
  },
18568
18589
  "postcss-normalize-display-values": {
18569
18590
  "version": "5.0.1",
@@ -18713,7 +18734,8 @@
18713
18734
  "postcss-zindex": {
18714
18735
  "version": "5.0.1",
18715
18736
  "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.0.1.tgz",
18716
- "integrity": "sha512-nwgtJJys+XmmSGoYCcgkf/VczP8Mp/0OfSv3v0+fw0uABY4yxw+eFs0Xp9nAZHIKnS5j+e9ywQ+RD+ONyvl5pA=="
18737
+ "integrity": "sha512-nwgtJJys+XmmSGoYCcgkf/VczP8Mp/0OfSv3v0+fw0uABY4yxw+eFs0Xp9nAZHIKnS5j+e9ywQ+RD+ONyvl5pA==",
18738
+ "requires": {}
18717
18739
  },
18718
18740
  "prepend-http": {
18719
18741
  "version": "2.0.0",
@@ -18737,7 +18759,8 @@
18737
18759
  "prism-react-renderer": {
18738
18760
  "version": "1.2.1",
18739
18761
  "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz",
18740
- "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg=="
18762
+ "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==",
18763
+ "requires": {}
18741
18764
  },
18742
18765
  "prismjs": {
18743
18766
  "version": "1.25.0",
@@ -19116,7 +19139,8 @@
19116
19139
  "react-side-effect": {
19117
19140
  "version": "2.1.1",
19118
19141
  "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz",
19119
- "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ=="
19142
+ "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==",
19143
+ "requires": {}
19120
19144
  },
19121
19145
  "react-textarea-autosize": {
19122
19146
  "version": "8.3.3",
@@ -20435,8 +20459,7 @@
20435
20459
  "typescript": {
20436
20460
  "version": "4.5.3",
20437
20461
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz",
20438
- "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==",
20439
- "dev": true
20462
+ "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ=="
20440
20463
  },
20441
20464
  "ua-parser-js": {
20442
20465
  "version": "0.7.31",
@@ -20676,7 +20699,8 @@
20676
20699
  "use-isomorphic-layout-effect": {
20677
20700
  "version": "1.1.1",
20678
20701
  "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz",
20679
- "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ=="
20702
+ "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==",
20703
+ "requires": {}
20680
20704
  },
20681
20705
  "use-latest": {
20682
20706
  "version": "1.2.0",
@@ -21047,7 +21071,8 @@
21047
21071
  "ws": {
21048
21072
  "version": "8.3.0",
21049
21073
  "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
21050
- "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw=="
21074
+ "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
21075
+ "requires": {}
21051
21076
  }
21052
21077
  }
21053
21078
  },
@@ -21152,7 +21177,8 @@
21152
21177
  "ws": {
21153
21178
  "version": "7.5.6",
21154
21179
  "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
21155
- "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA=="
21180
+ "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
21181
+ "requires": {}
21156
21182
  },
21157
21183
  "xdg-basedir": {
21158
21184
  "version": "4.0.0",
@@ -3,6 +3,19 @@
3
3
  align-items: center;
4
4
  padding: 2rem 0;
5
5
  width: 100%;
6
+
7
+ background-color: #17191a;
8
+ color: #F6F6F7;
9
+ }
10
+
11
+ .features code {
12
+ background-color: #424447;
13
+ border: 0.1rem solid rgba(0, 0, 0, 0.1);
14
+ border-radius: var(--ifm-code-border-radius);
15
+ font-family: var(--ifm-font-family-monospace);
16
+ font-size: var(--ifm-code-font-size);
17
+ padding: var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal);
18
+ vertical-align: middle;
6
19
  }
7
20
 
8
21
  .featureSvg {
@@ -14,8 +14,8 @@ const FeatureList: FeatureItem[] = [
14
14
  image: '/img/demo-supfile.png',
15
15
  description: (
16
16
  <>
17
- Wassup was designed to be easy to use but with maximum flexibilty. Configure
18
- size, position, content, and selection of the panes in the <code>Supfile</code>.
17
+ Wassup was designed to be easy to setup but give maximum flexibilty. Configure
18
+ size, position, content, and item selection of the panes in the <code>Supfile</code>.
19
19
  </>
20
20
  ),
21
21
  },
@@ -24,7 +24,7 @@ const FeatureList: FeatureItem[] = [
24
24
  image: '/img/wassup-screenshot.png',
25
25
  description: (
26
26
  <>
27
- Run `wassup` in the same directory as your <code>Supfile</code> to show the dashboard. Press the number
27
+ Run <code>wassup</code> in the same directory as your <code>Supfile</code> to show the dashboard. Press the number
28
28
  keys to interact with a specific pane. Highlight rows with <code>j</code> and <code>k</code> and press <code>Enter</code> to select.
29
29
  </>
30
30
  ),
@@ -5,15 +5,32 @@
5
5
  */
6
6
 
7
7
  /* You can override the default Infima variables here. */
8
+ /* #2b3137 */
8
9
  :root {
9
- --ifm-color-primary: #458588;
10
- --ifm-color-primary-dark: rgb(33, 175, 144);
11
- --ifm-color-primary-darker: rgb(31, 165, 136);
12
- --ifm-color-primary-darkest: rgb(26, 136, 112);
13
- --ifm-color-primary-light: rgb(70, 203, 174);
14
- --ifm-color-primary-lighter: rgb(102, 212, 189);
15
- --ifm-color-primary-lightest: rgb(146, 224, 208);
10
+ --ifm-color-primary: #1C1E21;
11
+ --ifm-color-primary-dark: #0F1114;
12
+ --ifm-color-primary-darker: #030508;
13
+ --ifm-color-primary-darkest: #030508;
14
+ --ifm-color-primary-light: #292B2E;
15
+ --ifm-color-primary-lighter: #36383B;
16
+ --ifm-color-primary-lightest: #424447;
16
17
  --ifm-code-font-size: 95%;
18
+
19
+ /* --ifm-menu-color-active: #458588;
20
+ --ifm-navbar-link-hover-color: #458588; */
21
+ /* --ifm-navbar-link-color: #458588; */
22
+ /* --ifm-link-color: #458588; */
23
+ }
24
+
25
+ html[data-theme='dark'] {
26
+ --ifm-color-primary: #F6F6F7;
27
+ --ifm-color-primary-dark: #E9E9EA;
28
+ --ifm-color-primary-darker: #DDDDDE;
29
+ --ifm-color-primary-darkest: #D0D0D1;
30
+ --ifm-color-primary-light: #F6F6F7;
31
+ --ifm-color-primary-lighter: #F6F6F7;
32
+ --ifm-color-primary-lightest: #F6F6F7;
33
+ /* any other colors you wish to overwrite */
17
34
  }
18
35
 
19
36
  .docusaurus-highlight-code-line {
@@ -24,5 +41,5 @@
24
41
  }
25
42
 
26
43
  html[data-theme='dark'] .docusaurus-highlight-code-line {
27
- background-color: rgba(0, 0, 0, 0.3);
44
+ background-color: rgba(109, 102, 102, 0.3);
28
45
  }
@@ -8,6 +8,8 @@
8
8
  text-align: center;
9
9
  position: relative;
10
10
  overflow: hidden;
11
+
12
+ background-color: #2b3137;
11
13
  }
12
14
 
13
15
  .heroTitle {
@@ -18,8 +20,33 @@
18
20
 
19
21
  }
20
22
 
23
+ .calloutAndLogo {
24
+ display: flex;
25
+ justify-content: center;
26
+ align-items: center;
27
+ margin-bottom: 20px;
28
+ }
29
+
30
+ .callout {
31
+ display: flex;
32
+ flex-direction: column;
33
+ }
34
+
35
+ .title {
36
+ font-size: 50px;
37
+ color: #FFFFFF;
38
+ padding-right: 20px;
39
+ text-align: left;
40
+ }
41
+
42
+ .callout {
43
+ color: #FFFFFF;
44
+ padding-right: 20px;
45
+ text-align: left;
46
+ }
47
+
21
48
  .heroLogo {
22
- max-width: 600px;
49
+ max-height: 200px;
23
50
  border-radius: 20px;
24
51
  }
25
52
 
@@ -29,6 +56,18 @@
29
56
  }
30
57
  }
31
58
 
59
+ .moreInfo {
60
+ background-color: rgb(32, 35, 42);
61
+ color: #F6F6F7;
62
+ text-align: center;
63
+ padding: 20px 0px;
64
+ font-size: 30px;
65
+ }
66
+
67
+ .moreInfo strong {
68
+ color: #458588;
69
+ }
70
+
32
71
  .buttons {
33
72
  display: flex;
34
73
  align-items: center;
@@ -11,12 +11,20 @@ function HomepageHeader() {
11
11
  return (
12
12
  <header className={clsx('hero hero--primary', styles.heroBanner)}>
13
13
  <div className="container">
14
- <img className={styles.heroLogo} src="/img/wassup-long.png" alt="Wassup - The scriptable terminal dashboard"/>
14
+ <div className={styles.calloutAndLogo}>
15
+ <div className={styles.callout}>
16
+ <h1 className={styles.title}>Wassup</h1>
17
+ <h2 className={styles.callout}>
18
+ Easily configure and script <br/> a personal terminal dashboard
19
+ </h2>
20
+ </div>
21
+ <img className={styles.heroLogo} src="/img/wassup.png" alt="Wassup logo"/>
22
+ </div>
15
23
  <div className={styles.buttons}>
16
24
  <Link
17
25
  className="button button--secondary button--lg"
18
26
  to="/docs/intro">
19
- Wassup Tutorial - 5min ⏱️
27
+ Getting Started - 5min ⏱️
20
28
  </Link>
21
29
  </div>
22
30
  </div>
@@ -24,6 +32,15 @@ function HomepageHeader() {
24
32
  );
25
33
  }
26
34
 
35
+ function HomepageMoreInfo() {
36
+ const {siteConfig} = useDocusaurusContext();
37
+ return (
38
+ <div className={styles.moreInfo}>
39
+ Script <strong>your own panes</strong> or use Wassup's <strong>built-in panes</strong>!
40
+ </div>
41
+ );
42
+ }
43
+
27
44
  export default function Home(): JSX.Element {
28
45
  const {siteConfig} = useDocusaurusContext();
29
46
  return (
@@ -31,6 +48,7 @@ export default function Home(): JSX.Element {
31
48
  title={`Hello from ${siteConfig.title}`}
32
49
  description="Description will go into a meta tag in <head />">
33
50
  <HomepageHeader />
51
+ <HomepageMoreInfo />
34
52
  <main>
35
53
  <HomepageFeatures />
36
54
  </main>
@@ -0,0 +1 @@
1
+ Stuff here eventually
@@ -10,16 +10,7 @@ add_pane do |pane|
10
10
  pane.interval = 60 * 5
11
11
  pane.show_refresh = true
12
12
 
13
- pane.content do |content|
14
- prs = Helpers::GitHub.pull_requests(org: 'fastlane', repo: 'fastlane')
15
- prs.each do |pr|
16
- display = Helpers::GitHub::Formatter.pr(pr)
17
- content.add_row(display, pr)
18
- end
19
- end
20
- pane.selection('enter', 'Open PR in browser') do |pr|
21
- `open #{pr['html_url']}`
22
- end
13
+ pane.type = Panes::GitHub::PullRequests.new(org: 'fastlane', repo: 'fastlane', show_username: true)
23
14
  end
24
15
 
25
16
  add_pane do |pane|
@@ -34,18 +25,7 @@ add_pane do |pane|
34
25
  pane.interval = 60 * 5
35
26
  pane.show_refresh = true
36
27
 
37
- pane.content do |content|
38
- # Uses GitHub's /search/issues API
39
- # Docs - https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests
40
- issues = Helpers::GitHub.issues(org: 'fastlane-community', q: 'is:pr is:open')
41
- issues.each do |issue|
42
- display = Helpers::GitHub::Formatter.pr(issue, show_repo: true)
43
- content.add_row(display, issue)
44
- end
45
- end
46
- pane.selection('enter', 'Open PR in browser') do |pr|
47
- `open #{pr['html_url']}`
48
- end
28
+ pane.type = Panes::GitHub::Search.new(org: 'fastlane-community', query: 'is:pr is:open', show_username: true)
49
29
  end
50
30
 
51
31
  add_pane do |pane|
@@ -57,21 +37,17 @@ add_pane do |pane|
57
37
  pane.highlight = true
58
38
  pane.title = "High Interaction Issues - fastlane/fastlane"
59
39
 
40
+ pane.alert_level = AlertLevel::HIGH
41
+
60
42
  pane.interval = 60 * 5
61
43
  pane.show_refresh = true
62
44
 
63
- pane.content do |content|
64
- # Uses GitHub's /search/issues API
65
- # Doc - https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests
66
- issues = Helpers::GitHub.issues(org: 'fastlane', repo: 'fastlane', q: 'is:issue is:open interactions:>10')
67
- issues.each do |issue|
68
- display = Helpers::GitHub::Formatter.issue(issue, show_interactions: true)
69
- content.add_row(display, issue)
70
- end
71
- end
72
- pane.selection('enter', 'Open issue in browser') do |pr|
73
- `open #{pr['html_url']}`
74
- end
45
+ pane.type = Panes::GitHub::Search.new(
46
+ org: 'fastlane',
47
+ repo: 'fastlane',
48
+ query: 'is:issue is:open interactions:>10',
49
+ show_interactions: true
50
+ )
75
51
  end
76
52
 
77
53
  add_pane do |pane|
@@ -86,16 +62,7 @@ add_pane do |pane|
86
62
  pane.interval = 60 * 5
87
63
  pane.show_refresh = true
88
64
 
89
- pane.content do |content|
90
- releases = Helpers::GitHub.releases(org: 'fastlane', repo: 'fastlane')
91
- releases.each do |release|
92
- display = Helpers::GitHub::Formatter.release(release)
93
- content.add_row(display, release)
94
- end
95
- end
96
- pane.selection('enter', 'Open release in browser') do |pr|
97
- `open #{pr['html_url']}`
98
- end
65
+ pane.type = Panes::GitHub::Releases.new(org: 'fastlane', repo: 'fastlane')
99
66
  end
100
67
 
101
68
  add_pane do |pane|
@@ -110,21 +77,7 @@ add_pane do |pane|
110
77
  pane.interval = 60 * 5
111
78
  pane.show_refresh = true
112
79
 
113
- pane.content do |content|
114
- workflows = Helpers::CircleCI.workflows(vcs: 'github', org: 'fastlane', repo: 'fastlane', limit_days: 14)
115
- workflows.each do |workflow|
116
- display = Helpers::CircleCI::Formatter.workflow(workflow)
117
- content.add_row(display, workflow)
118
- end
119
- end
120
- pane.selection('enter', 'Open workflow in browser') do |workflow|
121
- slug = workflow["project_slug"]
122
- pipeline_number = workflow["pipeline_number"]
123
- workflow_id = workflow["id"]
124
-
125
- url = "https://app.circleci.com/pipelines/#{slug}/#{pipeline_number}/workflows/#{workflow_id}"
126
- `open #{url}`
127
- end
80
+ pane.type = Panes::CircleCI::Workflows.new(vcs: 'github', org: 'fastlane', repo: 'fastlane')
128
81
  end
129
82
 
130
83
  add_pane do |pane|
@@ -139,26 +92,7 @@ add_pane do |pane|
139
92
  pane.interval = 60 * 5
140
93
  pane.show_refresh = true
141
94
 
142
- pane.content do |content|
143
- deploys = Helpers::Netlify.deploys(site_id: '91e8af7d-ea1c-4553-afb0-af7539bed063')
144
- deploys.each do |deploy|
145
- display = Helpers::Netlify::Formatter.deploy(deploy)
146
- content.add_row(display, deploy)
147
- end
148
- end
149
- pane.selection('enter', 'Open in Netlify') do |deploy|
150
- url = "#{deploy['admin_url']}/deploys/#{deploy['id']}"
151
- `open #{url}`
152
- end
153
- pane.selection('o', 'Open preview') do |deploy|
154
- if deploy['state'] == 'error'
155
- # show alert that isn't here yet
156
- elsif deploy['review_id'].nil?
157
- `open #{deploy['url']}`
158
- else
159
- `open #{deploy['deploy_ssl_url']}`
160
- end
161
- end
95
+ pane.type = Panes::Netlify::Deploys.new(site_id: '91e8af7d-ea1c-4553-afb0-af7539bed063')
162
96
  end
163
97
 
164
98
  add_pane do |pane|
@@ -173,23 +107,8 @@ add_pane do |pane|
173
107
  pane.interval = 60 * 5
174
108
  pane.show_refresh = true
175
109
 
176
- pane.content do |content|
177
- # Owned stories
178
- stories = Helpers::Shortcut.search_stories(query: "owner:joshholtz")
179
- stories.each do |story|
180
- display = Helpers::Shortcut::Formatter.story(story)
181
- content.add_row(display, story, page: "Owned Stories")
182
- end
183
-
184
- # Ready for review stories
185
- stories = Helpers::Shortcut.search_stories(query: "state:\"Ready For Review\" team:\"The\"")
186
- stories.each do |story|
187
- display = Helpers::Shortcut::Formatter.story(story)
188
- content.add_row(display, story, page: "Ready For Review")
189
- end
190
- end
191
- pane.selection('enter', 'Open in Shortcut') do |story|
192
- url = story['app_url']
193
- `open #{url}`
194
- end
110
+ pane.type = Panes::Shortcut::Stories.new(query_pages: {
111
+ "Owned Stories": "owner:joshholtz",
112
+ "Ready For Review": "state:\"Ready For Review\" team:\"The\""
113
+ })
195
114
  end
@@ -64,7 +64,7 @@ add_pane do |pane|
64
64
 
65
65
  pane.interval = 10
66
66
  pane.content do |content|
67
- raise "An error occured! Oh no!"
67
+ raise "No API Key Found"
68
68
  end
69
69
  end
70
70
 
data/lib/wassup/app.rb CHANGED
@@ -2,7 +2,7 @@ require 'curses'
2
2
 
3
3
  module Wassup
4
4
  class App
5
- def self.start(path:)
5
+ def self.start(path:, port:)
6
6
  Curses.init_screen
7
7
  Curses.start_color
8
8
  Curses.curs_set(0) # Invisible cursor
@@ -17,7 +17,7 @@ module Wassup
17
17
  #Curses.init_pair(Curses::COLOR_BLUE,Curses::COLOR_BLUE,Curses::COLOR_BLACK)
18
18
  #Curses.init_pair(Curses::COLOR_RED,Curses::COLOR_RED,Curses::COLOR_BLACK)
19
19
 
20
- app = App.new(path: path)
20
+ app = App.new(path: path, port: port)
21
21
  end
22
22
 
23
23
  def self.debug(path:)
@@ -70,6 +70,7 @@ module Wassup
70
70
  pane_builder.left,
71
71
  title: pane_builder.title,
72
72
  description: pane_builder.description,
73
+ alert_level: pane_builder.alert_level,
73
74
  highlight: pane_builder.highlight,
74
75
  focus_number: number,
75
76
  interval: pane_builder.interval,
@@ -77,6 +78,7 @@ module Wassup
77
78
  content_block: pane_builder.content_block,
78
79
  selection_blocks: pane_builder.selection_blocks,
79
80
  selection_blocks_description: pane_builder.selection_blocks_description,
81
+ port: self.port,
80
82
  debug: debug
81
83
  )
82
84
  pane.focus_handler = @focus_handler
@@ -84,9 +86,11 @@ module Wassup
84
86
  end
85
87
 
86
88
  attr_accessor :panes
89
+ attr_accessor :port
87
90
  attr_accessor :debug
88
91
 
89
- def initialize(path:, debug: false)
92
+ def initialize(path:, port: nil, debug: false)
93
+ @port = port
90
94
  @hidden_pane = nil
91
95
  @help_pane = nil
92
96
  @focused_pane = nil
@@ -86,11 +86,11 @@ module Wassup
86
86
  module Helpers
87
87
  module GitHub
88
88
  module Formatter
89
- def self.issue(issue, show_repo: false, show_interactions: false)
90
- self.pr(issue, show_repo: show_repo, show_interactions: show_interactions)
89
+ def self.issue(issue, show_repo: false, show_username: false, show_interactions: false)
90
+ self.pr(issue, show_repo: show_repo, show_username: show_username, show_interactions: show_interactions)
91
91
  end
92
92
 
93
- def self.pr(pr, show_repo: false, show_interactions: false)
93
+ def self.pr(pr, show_repo: false, show_username: false, show_interactions: false)
94
94
  number = pr["number"]
95
95
  title = pr["title"]
96
96
  created_at = pr["created_at"]
@@ -101,6 +101,11 @@ module Wassup
101
101
  repo_name = "[fg=gray]#{repo_url_parts.last} "
102
102
  end
103
103
 
104
+ username = ""
105
+ if show_username
106
+ username = "[fg=magenta]#{pr["user"]["login"]} "
107
+ end
108
+
104
109
  interactions = ""
105
110
  if show_interactions
106
111
  interaction_count = pr["comments"] + pr["reactions"]["total_count"]
@@ -113,7 +118,7 @@ module Wassup
113
118
  days = (Time.now - date).to_i / (24 * 60 * 60)
114
119
  days_formatted = '%3.3s' % days.to_s
115
120
 
116
- display = "[fg=yellow]#{number_formatted}[fg=cyan] #{days_formatted}d ago #{interactions}#{repo_name}[fg=white]#{title}"
121
+ display = "[fg=yellow]#{number_formatted}[fg=cyan] #{days_formatted}d ago #{interactions}#{repo_name}#{username}[fg=white]#{title}"
117
122
 
118
123
  return display
119
124
  end
data/lib/wassup/pane.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'curses'
2
2
 
3
+ require 'socket'
3
4
  require 'time'
4
5
 
5
6
  module Wassup
@@ -13,6 +14,8 @@ module Wassup
13
14
  attr_accessor :title
14
15
  attr_accessor :description
15
16
 
17
+ attr_accessor :alert_level
18
+
16
19
  attr_accessor :focused
17
20
  attr_accessor :focus_number
18
21
 
@@ -40,6 +43,8 @@ module Wassup
40
43
 
41
44
  attr_accessor :win_height, :win_width, :win_top, :win_left
42
45
 
46
+ attr_accessor :port
47
+
43
48
  class Content
44
49
  class Row
45
50
  attr_accessor :display
@@ -53,9 +58,11 @@ module Wassup
53
58
 
54
59
  attr_accessor :title
55
60
  attr_accessor :data
61
+ attr_accessor :alert_level
56
62
 
57
63
  def initialize(title = nil)
58
64
  @title = title
65
+ @alert_level = nil
59
66
  @data = []
60
67
  end
61
68
 
@@ -64,7 +71,9 @@ module Wassup
64
71
  end
65
72
  end
66
73
 
67
- def initialize(height, width, top, left, title: nil, description: nil, highlight: true, focus_number: nil, interval:, show_refresh:, content_block:, selection_blocks:, selection_blocks_description:, debug: false)
74
+ def initialize(height, width, top, left, title: nil, description: nil, alert_level: nil, highlight: true, focus_number: nil, interval:, show_refresh:, content_block:, selection_blocks:, selection_blocks_description:, port: nil, debug: false)
75
+
76
+ self.port = port
68
77
 
69
78
  if !debug
70
79
  self.win_height = Curses.lines * height
@@ -97,6 +106,8 @@ module Wassup
97
106
  self.title = title
98
107
  self.description = description
99
108
 
109
+ self.alert_level = alert_level
110
+
100
111
  self.interval = interval
101
112
  self.content_block = content_block
102
113
  self.selection_blocks = selection_blocks || {}
@@ -207,10 +218,9 @@ module Wassup
207
218
  if rtn.is_a?(Ope)
208
219
  self.caught_error = rtn.error
209
220
  content = Wassup::Pane::Content.new("Overview")
210
- content.add_row("[fg=red]Error during refersh[fg=white]")
211
- content.add_row("[fg=red]at #{Time.now}[fg=while]")
221
+ content.add_row("[fg=red]#{rtn.error.message}[fg=while]")
212
222
  content.add_row("")
213
- content.add_row("[fg=yellow]Will try again next interval[fg=white]")
223
+ content.add_row("[fg=gray]Error at #{Time.now}[fg=while]")
214
224
 
215
225
  content_directions = Wassup::Pane::Content.new("Directions")
216
226
  content_directions.add_row("1. Press 'c' to copy the stacktrace")
@@ -231,6 +241,8 @@ module Wassup
231
241
 
232
242
  self.update_box
233
243
  self.update_title
244
+
245
+ self.send_to_socket
234
246
  else
235
247
  # This shouldn't happen
236
248
  # TODO: also fix this
@@ -320,6 +332,31 @@ module Wassup
320
332
  self.last_refresh_char_at = Time.now
321
333
  end
322
334
  end
335
+
336
+ def send_to_socket
337
+ return if self.port.nil?
338
+ return if self.port.to_i == 0
339
+
340
+ data = {
341
+ title: self.title,
342
+ description: self.description,
343
+ alert_level: self.alert_level,
344
+ alert_count: self.alert_count
345
+ }
346
+
347
+ sock = TCPSocket.new('127.0.0.1', self.port)
348
+ sock.write(data.to_json)
349
+ sock.close
350
+ end
351
+
352
+ def alert_count
353
+ alert_count = 0
354
+ if self.contents
355
+ alert_count = self.contents.map { |c| c.data.size }.inject(0, :+)
356
+ end
357
+
358
+ return alert_count
359
+ end
323
360
 
324
361
  def update_title
325
362
  return unless self.should_box
@@ -331,9 +368,40 @@ module Wassup
331
368
  else
332
369
  full_title = "#{self.focus_number} - #{title}"
333
370
  end
371
+ full_title += " "
334
372
 
335
373
  self.win.setpos(0, 3)
336
374
  self.win.addstr(full_title)
375
+
376
+ self.win.setpos(0, 3 + full_title.size)
377
+ alert = ""
378
+ alert_count = self.alert_count
379
+ case self.alert_level
380
+ when AlertLevel::HIGH
381
+ self.win.attrset(Curses.color_pair(Wassup::Color::Pair::RED))
382
+ if alert_count == 1
383
+ alert += "(#{alert_count} HIGH ALERT)"
384
+ elsif alert_count > 0
385
+ alert += "(#{alert_count} HIGH ALERTS)"
386
+ end
387
+ when AlertLevel::MEDIUM
388
+ self.win.attrset(Curses.color_pair(Wassup::Color::Pair::YELLOW))
389
+ if alert_count == 1
390
+ alert += "(#{alert_count} MEDIUM ALERT)"
391
+ elsif alert_count > 0
392
+ alert += "(#{alert_count} MEDIUM ALERTS)"
393
+ end
394
+ when AlertLevel::LOW
395
+ self.win.attrset(Curses.color_pair(Wassup::Color::Pair::CYAN))
396
+ if alert_count == 1
397
+ alert += "(#{alert_count} LOW ALERT)"
398
+ elsif alert_count > 0
399
+ alert += "(#{alert_count} LOW ALERTS)"
400
+ end
401
+ end
402
+ self.win.addstr(alert)
403
+ self.subwin.attrset(Curses.color_pair(Wassup::Color::Pair::NORMAL))
404
+
337
405
  self.win.refresh
338
406
  end
339
407
 
@@ -1,5 +1,11 @@
1
1
 
2
2
  module Wassup
3
+ module AlertLevel
4
+ HIGH = "high"
5
+ MEDIUM = "medium"
6
+ LOW = "low"
7
+ end
8
+
3
9
  class PaneBuilder
4
10
  attr_accessor :height
5
11
  attr_accessor :width
@@ -11,6 +17,8 @@ module Wassup
11
17
  attr_accessor :title
12
18
  attr_accessor :description
13
19
 
20
+ attr_accessor :alert_level
21
+
14
22
  attr_accessor :show_refresh
15
23
 
16
24
  attr_accessor :interval
@@ -18,6 +26,8 @@ module Wassup
18
26
  attr_accessor :selection_blocks
19
27
  attr_accessor :selection_blocks_description
20
28
 
29
+ attr_accessor :type
30
+
21
31
  class ContentBuilder
22
32
  attr_accessor :contents
23
33
 
@@ -62,7 +72,7 @@ module Wassup
62
72
  end
63
73
  end
64
74
 
65
- def initialize()
75
+ def initialize
66
76
  @height = 1
67
77
  @weight = 1
68
78
  @top = 0
@@ -75,6 +85,10 @@ module Wassup
75
85
  @selection_blocks_description = {}
76
86
  end
77
87
 
88
+ def type=(type)
89
+ type.configure(self)
90
+ end
91
+
78
92
  def content(&block)
79
93
  self.content_block = block
80
94
  end
@@ -0,0 +1,35 @@
1
+ module Wassup
2
+ module Panes
3
+ module CircleCI
4
+ class Workflows
5
+ attr_accessor :vcs
6
+ attr_accessor :org
7
+ attr_accessor :repo
8
+
9
+ def initialize(vcs:, org:, repo:)
10
+ @vcs = vcs
11
+ @org = org
12
+ @repo = repo
13
+ end
14
+
15
+ def configure(pane)
16
+ pane.content do |content|
17
+ workflows = Helpers::CircleCI.workflows(vcs: vcs, org: org, repo: repo, limit_days: 14)
18
+ workflows.each do |workflow|
19
+ display = Helpers::CircleCI::Formatter.workflow(workflow)
20
+ content.add_row(display, workflow)
21
+ end
22
+ end
23
+ pane.selection('enter', 'Open workflow in browser') do |workflow|
24
+ slug = workflow["project_slug"]
25
+ pipeline_number = workflow["pipeline_number"]
26
+ workflow_id = workflow["id"]
27
+
28
+ url = "https://app.circleci.com/pipelines/#{slug}/#{pipeline_number}/workflows/#{workflow_id}"
29
+ `open #{url}`
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,92 @@
1
+ module Wassup
2
+ module Panes
3
+ module GitHub
4
+ class PullRequests
5
+ attr_accessor :org
6
+ attr_accessor :repo
7
+ attr_accessor :show_username
8
+ attr_accessor :show_interactions
9
+
10
+ def initialize(org:, repo:, show_username: false, show_interactions: false)
11
+ @org = org
12
+ @repo = repo
13
+ @show_username = show_username
14
+ @show_interactions = show_interactions
15
+ end
16
+
17
+ def configure(pane)
18
+ pane.content do |content|
19
+ prs = Helpers::GitHub.pull_requests(org: org, repo: repo)
20
+ prs.each do |pr|
21
+ display = Helpers::GitHub::Formatter.pr(pr, show_username: show_username, show_interactions: show_interactions)
22
+ content.add_row(display, pr)
23
+ end
24
+ end
25
+ pane.selection('enter', 'Open PR in browser') do |pr|
26
+ `open #{pr['html_url']}`
27
+ end
28
+ end
29
+ end
30
+
31
+ class Releases
32
+ attr_accessor :org
33
+ attr_accessor :repo
34
+
35
+ def initialize(org:, repo:)
36
+ @org = org
37
+ @repo = repo
38
+ end
39
+
40
+ def configure(pane)
41
+ pane.content do |content|
42
+ releases = Helpers::GitHub.releases(org: org, repo: repo)
43
+ releases.each do |release|
44
+ display = Helpers::GitHub::Formatter.release(release)
45
+ content.add_row(display, release)
46
+ end
47
+ end
48
+ pane.selection('enter', 'Open release in browser') do |pr|
49
+ `open #{pr['html_url']}`
50
+ end
51
+ end
52
+ end
53
+
54
+ class Search
55
+ attr_accessor :org
56
+ attr_accessor :repo
57
+ attr_accessor :query
58
+ attr_accessor :show_repo
59
+ attr_accessor :show_username
60
+ attr_accessor :show_interactions
61
+
62
+ def initialize(org:, repo: nil, query:, show_repo: true, show_username: false, show_interactions: false)
63
+ @org = org
64
+ @repo = repo
65
+ @query = query
66
+ @show_repo = show_repo
67
+ @show_username = show_username
68
+ @show_interactions = show_interactions
69
+ end
70
+
71
+ def configure(pane)
72
+ pane.content do |content|
73
+ # Uses GitHub's /search/issues API
74
+ # Docs - https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests
75
+ issues_or_prs = Helpers::GitHub.issues(org: org, repo: repo, q: query)
76
+ issues_or_prs.each do |issue_or_pr|
77
+ display = if issue_or_pr.has_key?('pull_request')
78
+ Helpers::GitHub::Formatter.pr(issue_or_pr, show_repo: show_repo, show_username: show_username, show_interactions: show_interactions)
79
+ else
80
+ Helpers::GitHub::Formatter.issue(issue_or_pr, show_repo: show_repo, show_username: show_username, show_interactions: show_interactions)
81
+ end
82
+ content.add_row(display, issue_or_pr)
83
+ end
84
+ end
85
+ pane.selection('enter', 'Open in browser') do |pr|
86
+ `open #{pr['html_url']}`
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,36 @@
1
+ module Wassup
2
+ module Panes
3
+ module Netlify
4
+ class Deploys
5
+ attr_accessor :site_id
6
+
7
+ def initialize(site_id:)
8
+ @site_id = site_id
9
+ end
10
+
11
+ def configure(pane)
12
+ pane.content do |content|
13
+ deploys = Helpers::Netlify.deploys(site_id: site_id)
14
+ deploys.each do |deploy|
15
+ display = Helpers::Netlify::Formatter.deploy(deploy)
16
+ content.add_row(display, deploy)
17
+ end
18
+ end
19
+ pane.selection('enter', 'Open in Netlify') do |deploy|
20
+ url = "#{deploy['admin_url']}/deploys/#{deploy['id']}"
21
+ `open #{url}`
22
+ end
23
+ pane.selection('o', 'Open preview') do |deploy|
24
+ if deploy['state'] == 'error'
25
+ # show alert that isn't here yet
26
+ elsif deploy['review_id'].nil?
27
+ `open #{deploy['url']}`
28
+ else
29
+ `open #{deploy['deploy_ssl_url']}`
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,30 @@
1
+ module Wassup
2
+ module Panes
3
+ module Shortcut
4
+ class Stories
5
+ attr_accessor :query_pages
6
+
7
+ def initialize(query: nil, query_pages: nil)
8
+ @query_pages = query_pages
9
+ @query_pages ||= { "": query } if query
10
+ end
11
+
12
+ def configure(pane)
13
+ pane.content do |content|
14
+ query_pages.each do |k,v|
15
+ stories = Helpers::Shortcut.search_stories(query: v)
16
+ stories.each do |story|
17
+ display = Helpers::Shortcut::Formatter.story(story)
18
+ content.add_row(display, story, page: k.to_s)
19
+ end
20
+ end
21
+ end
22
+ pane.selection('enter', 'Open in Shortcut') do |story|
23
+ url = story['app_url']
24
+ `open #{url}`
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,3 @@
1
1
  module Wassup
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.1"
3
3
  end
data/lib/wassup.rb CHANGED
@@ -9,6 +9,11 @@ require "wassup/helpers/github"
9
9
  require "wassup/helpers/netlify"
10
10
  require "wassup/helpers/shortcut"
11
11
 
12
+ require "wassup/panes/circleci"
13
+ require "wassup/panes/github"
14
+ require "wassup/panes/netlify"
15
+ require "wassup/panes/shortcut"
16
+
12
17
  module Wassup
13
18
  class Error < StandardError; end
14
19
  # Your code goes here...
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wassup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Holtz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-05 00:00:00.000000000 Z
11
+ date: 2023-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -77,6 +77,7 @@ files:
77
77
  - docs/src/pages/index.module.css
78
78
  - docs/src/pages/index.tsx
79
79
  - docs/src/pages/markdown-page.md
80
+ - docs/src/pages/showcase.md
80
81
  - docs/static/.nojekyll
81
82
  - docs/static/img/demo-supfile.png
82
83
  - docs/static/img/favicon.ico
@@ -108,6 +109,10 @@ files:
108
109
  - lib/wassup/helpers/shortcut.rb
109
110
  - lib/wassup/pane.rb
110
111
  - lib/wassup/pane_builder.rb
112
+ - lib/wassup/panes/circleci.rb
113
+ - lib/wassup/panes/github.rb
114
+ - lib/wassup/panes/netlify.rb
115
+ - lib/wassup/panes/shortcut.rb
111
116
  - lib/wassup/version.rb
112
117
  - wassup.gemspec
113
118
  homepage: https://github.com/joshdholtz/wassup
@@ -131,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
136
  - !ruby/object:Gem::Version
132
137
  version: '0'
133
138
  requirements: []
134
- rubygems_version: 3.2.3
139
+ rubygems_version: 3.2.33
135
140
  signing_key:
136
141
  specification_version: 4
137
142
  summary: A scriptable terminal dashboard