living_document 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5333d18700fb6f434f873c15fddd87f2e91fd811efe23125ae017022f84f35dc
4
+ data.tar.gz: 8c181f2f67c7dd4b9f08284c87a65d04e371c757362aa366518f1bbcdeec1b70
5
+ SHA512:
6
+ metadata.gz: 7bdd09efd21f2166bbb240ac8a7ac6899279c180e9a23202caea1114ef02f776bfe3a9dece7ecbbd1897e9b07522493bf813b41afa0ec68fc593841613d7a2a3
7
+ data.tar.gz: eebf8135e7cab06726572129aa3db97e89a3d7183ac6cf543b10b1ff3e3df685e2159fb404cb5610994d7ebdf1de16953096984d92030c78fbc54af3eb2ee9c4
@@ -0,0 +1,12 @@
1
+ ---
2
+ version: 2
3
+ updates:
4
+ - package-ecosystem: bundler
5
+ directory: "/"
6
+ schedule:
7
+ interval: daily
8
+ time: "04:04"
9
+ timezone: America/Chicago
10
+ open-pull-requests-limit: 20
11
+ allow:
12
+ - dependency-type: all
@@ -0,0 +1,33 @@
1
+ name: Run RuboCop and RSpec
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - '*'
7
+ push:
8
+ branches:
9
+ - main
10
+
11
+ jobs:
12
+ build:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: ruby/setup-ruby@v1
17
+ with:
18
+ bundler-cache: true
19
+ - name: Lint with RuboCop
20
+ run: bin/rubocop --format clang
21
+ - name: Run RSpec tests
22
+ run: bin/rspec --format progress --force-color
23
+ - name: Ensure alpha version
24
+ run: grep alpha $(find . -type f -name version.rb)
25
+ - name: Ensure no git diff
26
+ run: git diff --exit-code && git diff-index --quiet --cached HEAD
27
+ - name: Ensure "## Unreleased" is in CHANGELOG.md
28
+ run: grep "^## Unreleased" CHANGELOG.md
29
+ - name: Upload Code Coverage
30
+ uses: codecov/codecov-action@v4
31
+ with:
32
+ directory: tmp/simple_cov
33
+ token: ${{ secrets.CODECOV_TOKEN }}
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
@@ -0,0 +1,3 @@
1
+ ---
2
+ git: true
3
+ rubygems: true
data/.rubocop.yml ADDED
@@ -0,0 +1,4 @@
1
+ inherit_gem:
2
+ runger_style:
3
+ - rulesets/default.yml # gem 'rubocop'
4
+ - rulesets/performance.yml # gem 'rubocop-performance'
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.4.1
@@ -0,0 +1 @@
1
+ expected-num-github-checks: 3
data/CHANGELOG.md ADDED
@@ -0,0 +1,80 @@
1
+ ## v1.0.0 (2025-01-29)
2
+ - **BREAKING:** Remove web server functionality.
3
+ - **BREAKING:** Freeze time with `timecop` when executing code.
4
+ - **BREAKING:** Make target file customizable (and require a target argument for the CLI).
5
+ - Release via RubyGems.
6
+
7
+ ## v0.8.0 (2024-12-10)
8
+ - Remove upper bounds on versions for all dependencies.
9
+
10
+ ## v0.7.0 (2024-06-28)
11
+ - Enforce only major and minor parts of required Ruby version (loosening the required Ruby version from 3.3.3 to 3.3.0)
12
+
13
+ ## v0.6.0 (2024-06-15)
14
+ - Renamed primary branch from `master` to `main`
15
+
16
+ ## v0.5.4 (2023-05-30)
17
+ ### Changed
18
+ - Update dependencies
19
+
20
+ ## v0.5.3 (2023-05-30)
21
+ ### Changed
22
+ - Move from Memoist to MemoWise
23
+
24
+ ## v0.5.2 (2021-02-13)
25
+ ### Fixed
26
+ - Actually fix "uninitialized constant StringIO" error when running `livdoc` executable
27
+
28
+ ## v0.5.1 (2021-02-13)
29
+ ### Fixed
30
+ - Fix "uninitialized constant StringIO" error when running `livdoc` executable
31
+
32
+ ## v0.5.0 (2021-02-06)
33
+ ### Added
34
+ - Support logging multiple printed outputs
35
+ - Automatically monkeypatch `puts` to capture output
36
+
37
+ ## v0.4.0 (2021-02-04)
38
+ ### Added
39
+ - Render markdown preview next to web-based editor
40
+
41
+ ## v0.3.0 (2021-02-04)
42
+ ### Added
43
+ - Add support for evaluating Ruby code blocks within Markdown documents
44
+
45
+ ## v0.2.2 (2021-02-03)
46
+ ### Added
47
+ - Add ability to toggle the "Frontmatter" section in the web editor
48
+
49
+ ### Internal
50
+ - Set up RSpec testing
51
+ - Add some tests for `CodeEvaluator`
52
+ - Add test coverage reporting (via `codecov` and `simplecov`)
53
+
54
+ ## v0.2.1 (2021-02-03)
55
+ ### Fixed
56
+ - Run `livdocweb` with Ruby (not bash)
57
+
58
+ ## v0.2.0 (2021-02-03)
59
+ ### Added
60
+ - Add web-based editor
61
+
62
+ ## v0.1.4 (2021-01-26)
63
+ ### Dependencies
64
+ - Bump `release_assistant` to `0.1.1.alpha`
65
+
66
+ ## v0.1.3 (2021-01-26)
67
+ ### Internal
68
+ - Move CI from Travis to GitHub Actions
69
+ - Use `release_assistant` gem to manage the release process
70
+
71
+ ## v0.1.2 (2021-01-07)
72
+ ### Internal
73
+ - Added `rubocop-rake` gem
74
+
75
+ ## v0.1.1 (2020-07-02)
76
+ ### Internal
77
+ - Source Rubocop rules/config from `runger_style` gem
78
+
79
+ ## v0.1.0 (2020-06-20)
80
+ - Initial release of `living_document`!
data/Gemfile ADDED
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ ruby file: '.ruby-version'
4
+
5
+ source 'https://rubygems.org'
6
+
7
+ # Specify your gem's dependencies in living_document.gemspec
8
+ gemspec
9
+
10
+ group :development, :test do
11
+ gem 'amazing_print'
12
+ # Remove if/when byebug brings in this dependency for us.
13
+ gem 'irb'
14
+ gem 'pry'
15
+ # Go back to upstream if/when https://github.com/deivid-rodriguez/pry-byebug/pull/ 428 is merged.
16
+ gem 'pry-byebug', github: 'davidrunger/pry-byebug'
17
+ gem 'rake'
18
+ # Remove if/when byebug brings in this dependency for us.
19
+ gem 'reline'
20
+ gem 'rubocop', require: false
21
+ gem 'rubocop-performance', require: false
22
+ gem 'rubocop-rake', require: false
23
+ gem 'runger_style', require: false
24
+ end
25
+
26
+ group :development do
27
+ gem 'runger_release_assistant', require: false
28
+ end
29
+
30
+ group :test do
31
+ gem 'rspec'
32
+ gem 'simplecov-cobertura', require: false
33
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,271 @@
1
+ GIT
2
+ remote: https://github.com/davidrunger/pry-byebug.git
3
+ revision: f6f73023ba081630ddee32ae4399fb31706f074f
4
+ specs:
5
+ pry-byebug (3.10.1)
6
+ byebug (>= 11.0)
7
+ pry (>= 0.13)
8
+
9
+ PATH
10
+ remote: .
11
+ specs:
12
+ living_document (1.0.0)
13
+ activesupport (>= 6)
14
+ listen (>= 3.2)
15
+ memo_wise (>= 1.7)
16
+ timecop (>= 0.9.10)
17
+
18
+ GEM
19
+ remote: https://rubygems.org/
20
+ specs:
21
+ activesupport (8.0.1)
22
+ base64
23
+ benchmark (>= 0.3)
24
+ bigdecimal
25
+ concurrent-ruby (~> 1.0, >= 1.3.1)
26
+ connection_pool (>= 2.2.5)
27
+ drb
28
+ i18n (>= 1.6, < 2)
29
+ logger (>= 1.4.2)
30
+ minitest (>= 5.1)
31
+ securerandom (>= 0.3)
32
+ tzinfo (~> 2.0, >= 2.0.5)
33
+ uri (>= 0.13.1)
34
+ amazing_print (1.7.2)
35
+ ast (2.4.2)
36
+ base64 (0.2.0)
37
+ benchmark (0.4.0)
38
+ bigdecimal (3.1.9)
39
+ byebug (11.1.3)
40
+ coderay (1.1.3)
41
+ concurrent-ruby (1.3.5)
42
+ connection_pool (2.5.0)
43
+ date (3.4.1)
44
+ diff-lcs (1.5.1)
45
+ docile (1.4.1)
46
+ drb (2.2.1)
47
+ ffi (1.17.1)
48
+ ffi (1.17.1-aarch64-linux-gnu)
49
+ ffi (1.17.1-aarch64-linux-musl)
50
+ ffi (1.17.1-arm-linux-gnu)
51
+ ffi (1.17.1-arm-linux-musl)
52
+ ffi (1.17.1-arm64-darwin)
53
+ ffi (1.17.1-x86-linux-gnu)
54
+ ffi (1.17.1-x86-linux-musl)
55
+ ffi (1.17.1-x86_64-darwin)
56
+ ffi (1.17.1-x86_64-linux-gnu)
57
+ ffi (1.17.1-x86_64-linux-musl)
58
+ i18n (1.14.7)
59
+ concurrent-ruby (~> 1.0)
60
+ io-console (0.8.0)
61
+ irb (1.15.1)
62
+ pp (>= 0.6.0)
63
+ rdoc (>= 4.0.0)
64
+ reline (>= 0.4.2)
65
+ json (2.9.1)
66
+ language_server-protocol (3.17.0.4)
67
+ listen (3.9.0)
68
+ rb-fsevent (~> 0.10, >= 0.10.3)
69
+ rb-inotify (~> 0.9, >= 0.9.10)
70
+ logger (1.6.5)
71
+ memo_wise (1.10.0)
72
+ method_source (1.1.0)
73
+ minitest (5.25.4)
74
+ parallel (1.26.3)
75
+ parser (3.3.7.0)
76
+ ast (~> 2.4.1)
77
+ racc
78
+ pp (0.6.2)
79
+ prettyprint
80
+ prettyprint (0.2.0)
81
+ prism (1.3.0)
82
+ pry (0.15.2)
83
+ coderay (~> 1.1)
84
+ method_source (~> 1.0)
85
+ psych (5.2.3)
86
+ date
87
+ stringio
88
+ racc (1.8.1)
89
+ rainbow (3.1.1)
90
+ rake (13.2.1)
91
+ rb-fsevent (0.11.2)
92
+ rb-inotify (0.11.1)
93
+ ffi (~> 1.0)
94
+ rdoc (6.11.0)
95
+ psych (>= 4.0.0)
96
+ regexp_parser (2.10.0)
97
+ reline (0.6.0)
98
+ io-console (~> 0.5)
99
+ rexml (3.4.0)
100
+ rspec (3.13.0)
101
+ rspec-core (~> 3.13.0)
102
+ rspec-expectations (~> 3.13.0)
103
+ rspec-mocks (~> 3.13.0)
104
+ rspec-core (3.13.2)
105
+ rspec-support (~> 3.13.0)
106
+ rspec-expectations (3.13.3)
107
+ diff-lcs (>= 1.2.0, < 2.0)
108
+ rspec-support (~> 3.13.0)
109
+ rspec-mocks (3.13.2)
110
+ diff-lcs (>= 1.2.0, < 2.0)
111
+ rspec-support (~> 3.13.0)
112
+ rspec-support (3.13.2)
113
+ rubocop (1.71.0)
114
+ json (~> 2.3)
115
+ language_server-protocol (>= 3.17.0)
116
+ parallel (~> 1.10)
117
+ parser (>= 3.3.0.2)
118
+ rainbow (>= 2.2.2, < 4.0)
119
+ regexp_parser (>= 2.9.3, < 3.0)
120
+ rubocop-ast (>= 1.36.2, < 2.0)
121
+ ruby-progressbar (~> 1.7)
122
+ unicode-display_width (>= 2.4.0, < 4.0)
123
+ rubocop-ast (1.38.0)
124
+ parser (>= 3.3.1.0)
125
+ rubocop-performance (1.23.1)
126
+ rubocop (>= 1.48.1, < 2.0)
127
+ rubocop-ast (>= 1.31.1, < 2.0)
128
+ rubocop-rake (0.6.0)
129
+ rubocop (~> 1.0)
130
+ ruby-progressbar (1.13.0)
131
+ runger_release_assistant (0.14.0)
132
+ activesupport (>= 6)
133
+ memo_wise (>= 1.7)
134
+ rainbow (>= 3.0)
135
+ slop (~> 4.8)
136
+ runger_style (4.2.2)
137
+ prism (>= 0.24.0)
138
+ rubocop (>= 1.68.0)
139
+ securerandom (0.4.1)
140
+ simplecov (0.22.0)
141
+ docile (~> 1.1)
142
+ simplecov-html (~> 0.11)
143
+ simplecov_json_formatter (~> 0.1)
144
+ simplecov-cobertura (2.1.0)
145
+ rexml
146
+ simplecov (~> 0.19)
147
+ simplecov-html (0.13.1)
148
+ simplecov_json_formatter (0.1.4)
149
+ slop (4.10.1)
150
+ stringio (3.1.2)
151
+ timecop (0.9.10)
152
+ tzinfo (2.0.6)
153
+ concurrent-ruby (~> 1.0)
154
+ unicode-display_width (3.1.4)
155
+ unicode-emoji (~> 4.0, >= 4.0.4)
156
+ unicode-emoji (4.0.4)
157
+ uri (1.0.2)
158
+
159
+ PLATFORMS
160
+ aarch64-linux-gnu
161
+ aarch64-linux-musl
162
+ arm-linux-gnu
163
+ arm-linux-musl
164
+ arm64-darwin
165
+ ruby
166
+ x86-linux-gnu
167
+ x86-linux-musl
168
+ x86_64-darwin
169
+ x86_64-linux-gnu
170
+ x86_64-linux-musl
171
+
172
+ DEPENDENCIES
173
+ amazing_print
174
+ irb
175
+ living_document!
176
+ pry
177
+ pry-byebug!
178
+ rake
179
+ reline
180
+ rspec
181
+ rubocop
182
+ rubocop-performance
183
+ rubocop-rake
184
+ runger_release_assistant
185
+ runger_style
186
+ simplecov-cobertura
187
+
188
+ CHECKSUMS
189
+ activesupport (8.0.1) sha256=fd5bc74641c24ac3541055c2879789198ff42adee3e39c2933289ba008912e37
190
+ amazing_print (1.7.2) sha256=c89a1dfe4f8508c1e780871d51b8786efd100f625201f6e1d18a0d4dedaac702
191
+ ast (2.4.2) sha256=1e280232e6a33754cde542bc5ef85520b74db2aac73ec14acef453784447cc12
192
+ base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507
193
+ benchmark (0.4.0) sha256=0f12f8c495545e3710c3e4f0480f63f06b4c842cc94cec7f33a956f5180e874a
194
+ bigdecimal (3.1.9) sha256=2ffc742031521ad69c2dfc815a98e426a230a3d22aeac1995826a75dabfad8cc
195
+ byebug (11.1.3) sha256=2485944d2bb21283c593d562f9ae1019bf80002143cc3a255aaffd4e9cf4a35b
196
+ coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b
197
+ concurrent-ruby (1.3.5) sha256=813b3e37aca6df2a21a3b9f1d497f8cbab24a2b94cab325bffe65ee0f6cbebc6
198
+ connection_pool (2.5.0) sha256=233b92f8d38e038c1349ccea65dd3772727d669d6d2e71f9897c8bf5cd53ebfc
199
+ date (3.4.1) sha256=bf268e14ef7158009bfeaec40b5fa3c7271906e88b196d958a89d4b408abe64f
200
+ diff-lcs (1.5.1) sha256=273223dfb40685548436d32b4733aa67351769c7dea621da7d9dd4813e63ddfe
201
+ docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
202
+ drb (2.2.1) sha256=e9d472bf785f558b96b25358bae115646da0dbfd45107ad858b0bc0d935cb340
203
+ ffi (1.17.1) sha256=26f6b0dbd1101e6ffc09d3ca640b2a21840cc52731ad8a7ded9fb89e5fb0fc39
204
+ ffi (1.17.1-aarch64-linux-gnu) sha256=c5d22cb545a3a691d46060f1343c461d1a8d38c3fd71b96b4cbbe6906bf1fd38
205
+ ffi (1.17.1-aarch64-linux-musl) sha256=88b9d6ae905d21142df27c94bb300042c1aae41b67291885f600eaad16326b1d
206
+ ffi (1.17.1-arm-linux-gnu) sha256=fe14f5ece94082f3b0e651a09008113281f2764e7ea95f522b64e2fe32e11504
207
+ ffi (1.17.1-arm-linux-musl) sha256=df14927ca7bd9095148a7d1938bb762bbf189d190cf25d9547395ec7acc198a0
208
+ ffi (1.17.1-arm64-darwin) sha256=a8e04f79d375742c54ee7f9fff4b4022b87200a4ec0eb082128d3b6559e67b4d
209
+ ffi (1.17.1-x86-linux-gnu) sha256=01411c78cb3cff3c88cf67b2a7b24534e9b1638253d88581fef44c2083f6a174
210
+ ffi (1.17.1-x86-linux-musl) sha256=02bcc7bbcff71e021ef05f43469f7c5074ab3422e415b287001bd890c9cbb1c6
211
+ ffi (1.17.1-x86_64-darwin) sha256=0036199c290462dd7f03bc22933644c1685b7834a21788062bd5df48c72aa7a6
212
+ ffi (1.17.1-x86_64-linux-gnu) sha256=8c0ade2a5d19f3672bccfe3b58e016ae5f159e3e2e741c856db87fcf07c903d0
213
+ ffi (1.17.1-x86_64-linux-musl) sha256=3a343086820c96d6fbea4a5ef807fb69105b2b8174678f103b3db210c3f78401
214
+ i18n (1.14.7) sha256=ceba573f8138ff2c0915427f1fc5bdf4aa3ab8ae88c8ce255eb3ecf0a11a5d0f
215
+ io-console (0.8.0) sha256=cd6a9facbc69871d69b2cb8b926fc6ea7ef06f06e505e81a64f14a470fddefa2
216
+ irb (1.15.1) sha256=d9bca745ac4207a8b728a52b98b766ca909b86ff1a504bcde3d6f8c84faae890
217
+ json (2.9.1) sha256=d2bdef4644052fad91c1785d48263756fe32fcac08b96a20bb15840e96550d11
218
+ language_server-protocol (3.17.0.4) sha256=c484626478664fd13482d8180947c50a8590484b1258b99b7aedb3b69df89669
219
+ listen (3.9.0) sha256=db9e4424e0e5834480385197c139cb6b0ae0ef28cc13310cfd1ca78377d59c67
220
+ living_document (1.0.0)
221
+ logger (1.6.5) sha256=c3cfe56d01656490ddd103d38b8993d73d86296adebc5f58cefc9ec03741e56b
222
+ memo_wise (1.10.0) sha256=ae40ff8e7799697ff5d59d739b8766f76be22eba69c7c8468edb42ab83c94c3f
223
+ method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
224
+ minitest (5.25.4) sha256=9cf2cae25ac4dfc90c988ebc3b917f53c054978b673273da1bd20bcb0778f947
225
+ parallel (1.26.3) sha256=d86babb7a2b814be9f4b81587bf0b6ce2da7d45969fab24d8ae4bf2bb4d4c7ef
226
+ parser (3.3.7.0) sha256=7449011771e3e7881297859b849de26a6f4fccd515bece9520a87e7d2116119b
227
+ pp (0.6.2) sha256=947ec3120c6f92195f8ee8aa25a7b2c5297bb106d83b41baa02983686577b6ff
228
+ prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
229
+ prism (1.3.0) sha256=b11620829831b1cb7e6c9b46c81ff8a6e36ccb3f888f164485eb7351f386273a
230
+ pry (0.15.2) sha256=12d54b8640d3fa29c9211dd4ffb08f3fd8bf7a4fd9b5a73ce5b59c8709385b6b
231
+ pry-byebug (3.10.1)
232
+ psych (5.2.3) sha256=84a54bb952d14604fea22d99938348814678782f58b12648fcdfa4d2fce859ee
233
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
234
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
235
+ rake (13.2.1) sha256=46cb38dae65d7d74b6020a4ac9d48afed8eb8149c040eccf0523bec91907059d
236
+ rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe
237
+ rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e
238
+ rdoc (6.11.0) sha256=bec66fb9b019be64f7ba7d2cd2aecb283a3a01fef23a95b33e2349c6d1aa0040
239
+ regexp_parser (2.10.0) sha256=cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61
240
+ reline (0.6.0) sha256=57620375dcbe56ec09bac7192bfb7460c716bbf0054dc94345ecaa5438e539d2
241
+ rexml (3.4.0) sha256=efbea1efba7fa151158e0ee1e643525834da2d8eb4cf744aa68f6480bc9804b2
242
+ rspec (3.13.0) sha256=d490914ac1d5a5a64a0e1400c1d54ddd2a501324d703b8cfe83f458337bab993
243
+ rspec-core (3.13.2) sha256=94fbda6e4738e478f1c7532b7cc241272fcdc8b9eac03a97338b1122e4573300
244
+ rspec-expectations (3.13.3) sha256=0e6b5af59b900147698ea0ff80456c4f2e69cac4394fbd392fbd1ca561f66c58
245
+ rspec-mocks (3.13.2) sha256=2327335def0e1665325a9b617e3af9ae20272741d80ac550336309a7c59abdef
246
+ rspec-support (3.13.2) sha256=cea3a2463fd9b84b9dcc9685efd80ea701aa8f7b3decb3b3ce795ed67737dbec
247
+ rubocop (1.71.0) sha256=e19679efd447346ac476122313d3788ae23c38214790bcf660e984c747608bf0
248
+ rubocop-ast (1.38.0) sha256=4fdf6792fe443a9a18acb12dbc8225d0d64cd1654e41fedb30e79c18edbb26ae
249
+ rubocop-performance (1.23.1) sha256=f22f86a795f5e6a6180aac2c6fc172534b173a068d6ed3396d6460523e051b82
250
+ rubocop-rake (0.6.0) sha256=56b6f22189af4b33d4f4e490a555c09f1281b02f4d48c3a61f6e8fe5f401d8db
251
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
252
+ runger_release_assistant (0.14.0) sha256=7abc5eb1e0f63d8d611691bc21698d2b3b8f148a5f47cacd8dd32c21d16ee9be
253
+ runger_style (4.2.2) sha256=23bb4c2b8875d79113f72179a7e4ad96bd5ecde8d7a54bd18f4e60c2ab65dd64
254
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
255
+ simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
256
+ simplecov-cobertura (2.1.0) sha256=2c6532e34df2e38a379d72cef9a05c3b16c64ce90566beebc6887801c4ad3f02
257
+ simplecov-html (0.13.1) sha256=5dab0b7ee612e60e9887ad57693832fdf4695b4c0c859eaea5f95c18791ef10b
258
+ simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
259
+ slop (4.10.1) sha256=844322b5ffcf17ed4815fdb173b04a20dd82b4fd93e3744c88c8fafea696d9c7
260
+ stringio (3.1.2) sha256=204f1828f85cdb39d57cac4abc6dc44b04505a223f131587f2e20ae3729ba131
261
+ timecop (0.9.10) sha256=12ba45ce57cdcf6b1043cb6cdffa6381fd89ce10d369c28a7f6f04dc1b0cd8eb
262
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
263
+ unicode-display_width (3.1.4) sha256=8caf2af1c0f2f07ec89ef9e18c7d88c2790e217c482bfc78aaa65eadd5415ac1
264
+ unicode-emoji (4.0.4) sha256=2c2c4ef7f353e5809497126285a50b23056cc6e61b64433764a35eff6c36532a
265
+ uri (1.0.2) sha256=b303504ceb7e5905771fa7fa14b649652fa949df18b5880d69cfb12494791e27
266
+
267
+ RUBY VERSION
268
+ ruby 3.4.1p0
269
+
270
+ BUNDLED WITH
271
+ 2.6.2
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 David Runger
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
13
+ all 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
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,180 @@
1
+ [![codecov](https://codecov.io/gh/davidrunger/living_document/branch/main/graph/badge.svg)](https://codecov.io/gh/davidrunger/living_document)
2
+
3
+ # LivingDocument
4
+
5
+ LivingDocument evaluates Ruby statements inline in your code editor, which can be particularly useful when writing examples of Ruby code for documentation purposes.
6
+
7
+ For example, if you write this in your editor...
8
+
9
+ ```rb
10
+ (1..10).select(&:even?)
11
+ ###
12
+ ```
13
+
14
+ ... then, when you save the file, it will be updated by LivingDocument to this...
15
+
16
+ ```rb
17
+ (1..10).select(&:even?)
18
+ # => [2, 4, 6, 8, 10]
19
+ ```
20
+
21
+ Additionally, any subsequent edits, when saved, will also be reflected. For example, if you change `even?` to `odd?` in the above example (and save the file), then LivingDocument will update the output shown in the `# =>` line, producing:
22
+
23
+ ```rb
24
+ (1..10).select(&:odd?)
25
+ # => [1, 3, 5, 7, 9]
26
+ ```
27
+
28
+ In other words, the special markers `###` and `# =>` tell LivingDocument to evaluate the line of code immediately above and insert the evaluated result at the position of the marker whenever the file is saved.
29
+
30
+ ## Table of Contents
31
+
32
+ <!--ts-->
33
+ * [LivingDocument](#livingdocument)
34
+ * [Table of Contents](#table-of-contents)
35
+ * [Installation](#installation)
36
+ * [Usage](#usage)
37
+ * [Markdown support](#markdown-support)
38
+ * [Time is frozen](#time-is-frozen)
39
+ * [Development](#development)
40
+ * [For maintainers](#for-maintainers)
41
+ * [License](#license)
42
+
43
+ <!-- Created by https://github.com/ekalinin/github-markdown-toc -->
44
+ <!-- Added by: david, at: Wed Jan 29 07:45:21 PM CST 2025 -->
45
+
46
+ <!--te-->
47
+
48
+ ## Installation
49
+
50
+ ```
51
+ $ gem install living_document
52
+ ```
53
+
54
+ Or, if you would like to add it to a `Gemfile`:
55
+
56
+ ```rb
57
+ gem 'living_document'
58
+ ```
59
+
60
+ ## Usage
61
+
62
+ Put the following content into a file. For this example, we'll call it `ruby.rb`, but you can use any file path that you like.
63
+
64
+ ```rb
65
+ 1 + 2
66
+ ###
67
+
68
+ 5 / 0
69
+ ###
70
+
71
+ puts('This is one great string!')
72
+ ###
73
+ ```
74
+
75
+ Then run `livdoc <path-to-your-file>` on your command line. In this example, that is:
76
+
77
+ ```
78
+ $ livdoc ruby.rb
79
+ ```
80
+
81
+ Then, go back to the file in your editor and save it. The file's content should be transformed to this:
82
+
83
+ ```rb
84
+ 1 + 2
85
+ # => 3
86
+
87
+ 5 / 0
88
+ # => raises ZeroDivisionError
89
+
90
+ puts('This is one great string!')
91
+ # => prints "This is one great string!"
92
+ ```
93
+
94
+ Then, edit the file and save it again. You'll see that the `# => ` comments are automatically and immediately updated to reflect your edits.
95
+
96
+ ## Markdown support
97
+
98
+ LivingDocument can also handle Markdown code, which is especially convenient when developing
99
+ documentation with examples.
100
+
101
+ To use this functionality, simply provide a markdown document as the target file for `livdoc`, e.g.:
102
+
103
+ ```
104
+ $ livdoc README.md
105
+ ```
106
+
107
+ **NOTE:** Only code blocks that begin with `` ```rb `` or `` ```ruby `` will be evaluated.
108
+
109
+ For example, LivingDocument will turn this...
110
+
111
+ ~~~markdown
112
+ This is how you do addition in Ruby:
113
+
114
+ ```rb
115
+ 2 + 3
116
+ ###
117
+ ```
118
+
119
+ This is how you do exponentiation in Ruby:
120
+
121
+ ```ruby
122
+ 2**4
123
+ ###
124
+ ```
125
+ ~~~
126
+
127
+ ...into this...
128
+
129
+ ~~~markdown
130
+ This is how you do addition in Ruby:
131
+
132
+ ```rb
133
+ 2 + 3
134
+ # => 5
135
+ ```
136
+
137
+ This is how you do exponentiation in Ruby:
138
+
139
+ ```ruby
140
+ 2**4
141
+ # => 16
142
+ ```
143
+ ~~~
144
+
145
+ ## Time is frozen
146
+
147
+ NOTE: Time is frozen (using [`timecop`](https://github.com/travisjeffery/timecop)) when your code is executed. This could cause unexpected results if your code depends the `Time` being different when different lines of code execute.
148
+
149
+ To illustrate, note that `time_1` and `time_2` below are the same (which they wouldn't be, if run in a normal Ruby program).
150
+
151
+ ```rb
152
+ time_1 = Time.now.iso8601(6)
153
+ # => "2025-01-29T18:54:23.134962-06:00"
154
+
155
+ time_2 = Time.now.iso8601(6)
156
+ # => "2025-01-29T18:54:23.134962-06:00"
157
+
158
+ time_2 > time_1
159
+ # => false
160
+ ```
161
+
162
+ ## Development
163
+
164
+ To install this gem onto your local machine from a development copy of the code, run `bundle exec
165
+ rake install`.
166
+
167
+ ## For maintainers
168
+
169
+ To release a new version, run `bin/release` with an appropriate `--type` option, e.g.:
170
+
171
+ ```
172
+ bin/release --type minor
173
+ ```
174
+
175
+ (This uses the [`runger_release_assistant`](https://github.com/davidrunger/runger_release_assistant) gem.)
176
+
177
+ ## License
178
+
179
+ The gem is available as open source under the terms of the [MIT
180
+ License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
data/bin/_guard-core ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application '_guard-core' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require 'pathname'
12
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
13
+
14
+ bundle_binstub = File.expand_path('bundle', __dir__)
15
+
16
+ if File.file?(bundle_binstub)
17
+ if File.read(bundle_binstub, 300).include?('This file was generated by Bundler')
18
+ load(bundle_binstub)
19
+ else
20
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
21
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
22
+ end
23
+ end
24
+
25
+ require 'rubygems'
26
+ require 'bundler/setup'
27
+
28
+ load Gem.bin_path('guard', '_guard-core')
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'living_document'
6
+ require 'irb'
7
+ IRB.start(__FILE__)
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail # exit on any error, don't allow undefined variables, pipes don't swallow errors
4
+
5
+ lint gitleaks
6
+
7
+ background-and-notify lint newlines
8
+ background-and-notify lint rubocop
9
+ background-and-notify lint shellcheck
data/bin/guard ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'guard' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require 'pathname'
12
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
13
+
14
+ bundle_binstub = File.expand_path('bundle', __dir__)
15
+
16
+ if File.file?(bundle_binstub)
17
+ if File.read(bundle_binstub, 300).include?('This file was generated by Bundler')
18
+ load(bundle_binstub)
19
+ else
20
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
21
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
22
+ end
23
+ end
24
+
25
+ require 'rubygems'
26
+ require 'bundler/setup'
27
+
28
+ load Gem.bin_path('guard', 'guard')
data/bin/release ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'release' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require 'pathname'
12
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
13
+
14
+ bundle_binstub = File.expand_path('bundle', __dir__)
15
+
16
+ if File.file?(bundle_binstub)
17
+ if File.read(bundle_binstub, 300).include?('This file was generated by Bundler')
18
+ load(bundle_binstub)
19
+ else
20
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
21
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
22
+ end
23
+ end
24
+
25
+ require 'rubygems'
26
+ require 'bundler/setup'
27
+
28
+ load Gem.bin_path('release_assistant', 'release')
data/bin/rspec ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rspec' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require 'pathname'
12
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
13
+
14
+ bundle_binstub = File.expand_path('bundle', __dir__)
15
+
16
+ if File.file?(bundle_binstub)
17
+ if File.read(bundle_binstub, 300).include?('This file was generated by Bundler')
18
+ load(bundle_binstub)
19
+ else
20
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
21
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
22
+ end
23
+ end
24
+
25
+ require 'rubygems'
26
+ require 'bundler/setup'
27
+
28
+ load Gem.bin_path('rspec-core', 'rspec')
data/bin/rubocop ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rubocop' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require 'pathname'
12
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
13
+
14
+ bundle_binstub = File.expand_path('bundle', __dir__)
15
+
16
+ if File.file?(bundle_binstub)
17
+ if File.read(bundle_binstub, 300).include?('This file was generated by Bundler')
18
+ load(bundle_binstub)
19
+ else
20
+ abort(<<~ERROR)
21
+ Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.
23
+ ERROR
24
+ end
25
+ end
26
+
27
+ require 'rubygems'
28
+ require 'bundler/setup'
29
+
30
+ load Gem.bin_path('rubocop', 'rubocop')
data/exe/livdoc ADDED
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # frozen_string_literal: true
4
+
5
+ require 'listen'
6
+
7
+ require_relative '../lib/living_document.rb'
8
+
9
+ # rubocop:disable Style/TopLevelMethodDefinition
10
+ def evaluate_code_and_update_source_file(file_path)
11
+ puts('Running code...')
12
+ code_in_file = File.read(file_path)
13
+ code_to_write =
14
+ LivingDocument::DocumentEvaluator.new(
15
+ document: code_in_file,
16
+ ).evaluated_document
17
+
18
+ $printed_objects_last_run = []
19
+ puts("Writing file! #{Time.now}")
20
+ File.write(file_path, code_to_write)
21
+ end
22
+ # rubocop:enable Style/TopLevelMethodDefinition
23
+
24
+ file_path = ARGV[0]
25
+
26
+ if file_path.nil?
27
+ puts('You must provide a file path argument, e.g. `livdoc personal/ruby.rb`.')
28
+ exit(1)
29
+ end
30
+
31
+ last_file_update = Time.now
32
+ listener =
33
+ Listen.to(Dir.pwd, only: /\A#{Regexp.escape(file_path)}\z/) do |_modified, _added, _removed|
34
+ # Don't enter infinitely recursive loop, since the code below triggers file updates.
35
+ # After file has been updated, wait at least 0.5 seconds before listener processes again.
36
+ next if (Time.now - last_file_update) < 0.5
37
+
38
+ evaluate_code_and_update_source_file(file_path)
39
+
40
+ last_file_update = Time.now
41
+ end
42
+
43
+ listener.start
44
+ system('clear')
45
+ evaluate_code_and_update_source_file(file_path)
46
+ puts('Waiting for file changes...')
47
+
48
+ at_exit do
49
+ print('Stopping listener ... ')
50
+ listener.stop
51
+ puts('done.')
52
+ end
53
+
54
+ sleep
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ class LivingDocument::CodeEvaluator
4
+ prepend MemoWise
5
+
6
+ def initialize(code:)
7
+ @code = code.gsub(/^=begin\b.*?^=end\n/m, '')
8
+
9
+ @known_erroring_segment_indexes = []
10
+ @random_seed = rand(1_000_000_000)
11
+
12
+ $printed_output_last_run = ''
13
+ end
14
+
15
+ def evaluated_code
16
+ Timecop.freeze do
17
+ printed_code_segments.each_with_index do |printed_code_segment, index|
18
+ $printed_output = ''
19
+ set_up_capturing_stdout
20
+
21
+ result =
22
+ begin
23
+ # we need to namespace any constants that would otherwise leak and persist globally
24
+ new_namespace.instance_eval(code_to_eval(index)).inspect.squish
25
+ rescue => error
26
+ # Comment these lines back in for debugging:
27
+ # puts("ERROR: #{error.class}:#{error.message}")
28
+ # puts(error.backtrace)
29
+ @known_erroring_segment_indexes << index
30
+ "raises #{error.class} (#{error.message})"
31
+ end
32
+
33
+ if newly_printed_output.present?
34
+ result = result_for_printed_output
35
+ elsif result.include?('\"')
36
+ result = "'#{result.gsub('\"', '"')[1...-1]}'"
37
+ end
38
+ remember_printed_objects
39
+
40
+ swap_in_evaluated_code(printed_code_segment, result)
41
+ end
42
+ end
43
+
44
+ restore_original_stdout
45
+
46
+ @code
47
+ end
48
+
49
+ private
50
+
51
+ def result_for_printed_output
52
+ if newly_printed_output[0..-2].include?("\n")
53
+ %(prints:\n#{commented_output(newly_printed_output)})
54
+ else
55
+ %(prints "#{newly_printed_output.rstrip}")
56
+ end
57
+ end
58
+
59
+ def commented_output(printed_output)
60
+ <<~COMMENTED_OUTPUT.rstrip
61
+ =begin
62
+ #{printed_output.delete_suffix("\n")}
63
+ =end
64
+ COMMENTED_OUTPUT
65
+ end
66
+
67
+ def set_up_capturing_stdout
68
+ @original_stdout = $stdout
69
+ $stdout = StringIO.new
70
+ end
71
+
72
+ def restore_original_stdout
73
+ $stdout = @original_stdout
74
+ end
75
+
76
+ def code_segments_to_eval(current_index)
77
+ printed_code_segments_to_eval(current_index)
78
+ end
79
+
80
+ def code_to_eval(current_index)
81
+ code_segments_to_eval(current_index).join('')
82
+ end
83
+
84
+ def indexes_to_eval(current_index)
85
+ (0..current_index).to_a.reject { @known_erroring_segment_indexes.include?(_1) }
86
+ end
87
+
88
+ def new_namespace
89
+ random_seed = @random_seed
90
+ Module.new.tap do |new_module|
91
+ new_module.instance_eval do
92
+ srand(random_seed)
93
+ end
94
+ end
95
+ end
96
+
97
+ def newly_printed_output
98
+ $printed_output = $stdout.string.dup
99
+ $printed_output.delete_prefix($printed_output_last_run)
100
+ end
101
+
102
+ memo_wise \
103
+ def printed_code_segments
104
+ @code.scan(/(?:(?!###|# =>).)*(?:###|# =>)[^\n]*\s*/mi)
105
+ end
106
+
107
+ def printed_code_segments_to_eval(current_index)
108
+ printed_code_segments.values_at(*indexes_to_eval(current_index))
109
+ end
110
+
111
+ def remember_printed_objects
112
+ $printed_output_last_run = $printed_output
113
+ end
114
+
115
+ def swap_in_evaluated_code(printed_code_segment, result)
116
+ @code[printed_code_segment] = printed_code_segment.sub(/(?:# =>|###)[^\n]*$/, "# => #{result}")
117
+ end
118
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ class LivingDocument::DocumentEvaluator
4
+ def initialize(document:)
5
+ @document = document.dup
6
+ end
7
+
8
+ def evaluated_document
9
+ if markdown?
10
+ markdown_codeblocks.each do |markdown_codeblock|
11
+ opening, *ruby_code_lines, closing = markdown_codeblock.split("\n")
12
+ ruby_code = ruby_code_lines.join("\n")
13
+ evaluated_ruby_code =
14
+ LivingDocument::CodeEvaluator.new(
15
+ code: ruby_code,
16
+ ).evaluated_code
17
+ @document[markdown_codeblock] =
18
+ <<~EVALUATED_CODEBLOCK.rstrip
19
+ #{opening}
20
+ #{evaluated_ruby_code}
21
+ #{closing}
22
+ EVALUATED_CODEBLOCK
23
+ end
24
+ @document
25
+ else
26
+ LivingDocument::CodeEvaluator.new(
27
+ code: @document,
28
+ ).evaluated_code
29
+ end
30
+ end
31
+
32
+ def markdown?
33
+ !markdown_codeblocks.empty?
34
+ end
35
+
36
+ private
37
+
38
+ def markdown_codeblocks
39
+ @document.scan(/```(?:ruby|rb)\n(?:(?!```\n).)*```/mi)
40
+ end
41
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LivingDocument
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/all'
4
+ require 'memo_wise'
5
+ require 'stringio'
6
+ require 'timecop'
7
+
8
+ module LivingDocument ; end
9
+
10
+ Dir["#{File.dirname(__FILE__)}/living_document/**/*.rb"].each { |file| require file }
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/living_document/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'living_document'
7
+ spec.version = LivingDocument::VERSION
8
+ spec.authors = ['David Runger']
9
+ spec.email = ['davidjrunger@gmail.com']
10
+
11
+ spec.summary = 'Evaluate Ruby code live while editing a file!'
12
+ spec.description = 'Evaluate Ruby code live while editing a file!'
13
+ spec.homepage = 'https://github.com/davidrunger/living_document'
14
+ spec.license = 'MIT'
15
+
16
+ required_ruby_version = File.read('.ruby-version').rstrip.sub(/\A(\d+\.\d+)\.\d+\z/, '\1.0')
17
+ spec.required_ruby_version = ">= #{required_ruby_version}"
18
+
19
+ spec.metadata['rubygems_mfa_required'] = 'true'
20
+ spec.metadata['homepage_uri'] = spec.homepage
21
+ spec.metadata['source_code_uri'] = 'https://github.com/davidrunger/living_document'
22
+ spec.metadata['changelog_uri'] = 'https://github.com/davidrunger/living_document/blob/main/CHANGELOG.md'
23
+
24
+ # Specify which files should be added to the gem when it is released.
25
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
26
+ spec.files =
27
+ Dir.chdir(File.expand_path(__dir__)) do
28
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
+ end
30
+ spec.bindir = 'exe'
31
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
+
33
+ spec.add_dependency('activesupport', '>= 6')
34
+ spec.add_dependency('listen', '>= 3.2')
35
+ spec.add_dependency('memo_wise', '>= 1.7')
36
+ spec.add_dependency('timecop', '>= 0.9.10')
37
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: living_document
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - David Runger
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 2025-01-30 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activesupport
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '6'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '6'
26
+ - !ruby/object:Gem::Dependency
27
+ name: listen
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '3.2'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '3.2'
40
+ - !ruby/object:Gem::Dependency
41
+ name: memo_wise
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '1.7'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '1.7'
54
+ - !ruby/object:Gem::Dependency
55
+ name: timecop
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.9.10
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 0.9.10
68
+ description: Evaluate Ruby code live while editing a file!
69
+ email:
70
+ - davidjrunger@gmail.com
71
+ executables:
72
+ - livdoc
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".github/dependabot.yml"
77
+ - ".github/workflows/ruby.yml"
78
+ - ".gitignore"
79
+ - ".release_assistant.yml"
80
+ - ".rubocop.yml"
81
+ - ".ruby-version"
82
+ - ".runger-config.yml"
83
+ - CHANGELOG.md
84
+ - Gemfile
85
+ - Gemfile.lock
86
+ - LICENSE.txt
87
+ - README.md
88
+ - Rakefile
89
+ - bin/_guard-core
90
+ - bin/console
91
+ - bin/githooks/pre-push
92
+ - bin/guard
93
+ - bin/release
94
+ - bin/rspec
95
+ - bin/rubocop
96
+ - exe/livdoc
97
+ - lib/living_document.rb
98
+ - lib/living_document/code_evaluator.rb
99
+ - lib/living_document/document_evaluator.rb
100
+ - lib/living_document/version.rb
101
+ - living_document.gemspec
102
+ homepage: https://github.com/davidrunger/living_document
103
+ licenses:
104
+ - MIT
105
+ metadata:
106
+ rubygems_mfa_required: 'true'
107
+ homepage_uri: https://github.com/davidrunger/living_document
108
+ source_code_uri: https://github.com/davidrunger/living_document
109
+ changelog_uri: https://github.com/davidrunger/living_document/blob/main/CHANGELOG.md
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 3.4.0
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubygems_version: 3.6.2
125
+ specification_version: 4
126
+ summary: Evaluate Ruby code live while editing a file!
127
+ test_files: []