rbcli 0.1.10 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/CODE_OF_CONDUCT.md +1 -1
  4. data/Gemfile.lock +12 -12
  5. data/LICENSE.txt +674 -21
  6. data/README.md +80 -443
  7. data/bin/console +19 -0
  8. data/bin/setup +20 -0
  9. data/docs/404.html +639 -0
  10. data/docs/advanced/automatic_updates/index.html +791 -0
  11. data/docs/advanced/command_types/index.html +946 -0
  12. data/docs/advanced/distributed_state_locking/index.html +777 -0
  13. data/docs/advanced/hooks/index.html +836 -0
  14. data/docs/advanced/state_storage/index.html +957 -0
  15. data/docs/advanced/user_config_files/index.html +818 -0
  16. data/docs/assets/fonts/font-awesome.css +4 -0
  17. data/docs/assets/fonts/material-icons.css +13 -0
  18. data/docs/assets/fonts/specimen/FontAwesome.ttf +0 -0
  19. data/docs/assets/fonts/specimen/FontAwesome.woff +0 -0
  20. data/docs/assets/fonts/specimen/FontAwesome.woff2 +0 -0
  21. data/docs/assets/fonts/specimen/MaterialIcons-Regular.ttf +0 -0
  22. data/docs/assets/fonts/specimen/MaterialIcons-Regular.woff +0 -0
  23. data/docs/assets/fonts/specimen/MaterialIcons-Regular.woff2 +0 -0
  24. data/docs/assets/images/favicon.png +0 -0
  25. data/docs/assets/images/icons/bitbucket.1b09e088.svg +20 -0
  26. data/docs/assets/images/icons/github.f0b8504a.svg +18 -0
  27. data/docs/assets/images/icons/gitlab.6dd19c00.svg +38 -0
  28. data/docs/assets/javascripts/application.a59e2a89.js +1 -0
  29. data/docs/assets/javascripts/lunr/lunr.da.js +1 -0
  30. data/docs/assets/javascripts/lunr/lunr.de.js +1 -0
  31. data/docs/assets/javascripts/lunr/lunr.du.js +1 -0
  32. data/docs/assets/javascripts/lunr/lunr.es.js +1 -0
  33. data/docs/assets/javascripts/lunr/lunr.fi.js +1 -0
  34. data/docs/assets/javascripts/lunr/lunr.fr.js +1 -0
  35. data/docs/assets/javascripts/lunr/lunr.hu.js +1 -0
  36. data/docs/assets/javascripts/lunr/lunr.it.js +1 -0
  37. data/docs/assets/javascripts/lunr/lunr.jp.js +1 -0
  38. data/docs/assets/javascripts/lunr/lunr.multi.js +1 -0
  39. data/docs/assets/javascripts/lunr/lunr.no.js +1 -0
  40. data/docs/assets/javascripts/lunr/lunr.pt.js +1 -0
  41. data/docs/assets/javascripts/lunr/lunr.ro.js +1 -0
  42. data/docs/assets/javascripts/lunr/lunr.ru.js +1 -0
  43. data/docs/assets/javascripts/lunr/lunr.stemmer.support.js +1 -0
  44. data/docs/assets/javascripts/lunr/lunr.sv.js +1 -0
  45. data/docs/assets/javascripts/lunr/lunr.tr.js +1 -0
  46. data/docs/assets/javascripts/lunr/tinyseg.js +1 -0
  47. data/docs/assets/javascripts/modernizr.1aa3b519.js +1 -0
  48. data/docs/assets/stylesheets/application-palette.6079476c.css +2 -0
  49. data/docs/assets/stylesheets/application.ba0fd1a6.css +2 -0
  50. data/docs/development/code_of_conduct/index.html +883 -0
  51. data/docs/development/contributing/index.html +744 -0
  52. data/docs/development/license/index.html +715 -0
  53. data/docs/imported/changelog/index.html +853 -0
  54. data/docs/imported/quick_reference/index.html +1057 -0
  55. data/docs/index.html +732 -0
  56. data/docs/search/search_index.json +569 -0
  57. data/docs/sitemap.xml +93 -0
  58. data/docs/tutorial/10-getting_started/index.html +806 -0
  59. data/docs/tutorial/20-project_layout/index.html +972 -0
  60. data/docs/tutorial/30-your_first_command/index.html +906 -0
  61. data/docs/tutorial/40-options_parameters_and_arguments/index.html +1049 -0
  62. data/docs/tutorial/50-publishing/index.html +838 -0
  63. data/docs/whoami/index.html +709 -0
  64. data/docs-src/docs/advanced/automatic_updates.md +42 -0
  65. data/docs-src/docs/advanced/command_types.md +144 -0
  66. data/docs-src/docs/advanced/distributed_state_locking.md +33 -0
  67. data/docs-src/docs/advanced/hooks.md +65 -0
  68. data/docs-src/docs/advanced/logging.md +35 -0
  69. data/docs-src/docs/advanced/state_storage.md +117 -0
  70. data/docs-src/docs/advanced/user_config_files.md +47 -0
  71. data/docs-src/docs/development/code_of_conduct.md +74 -0
  72. data/docs-src/docs/development/contributing.md +49 -0
  73. data/docs-src/docs/development/license.md +10 -0
  74. data/docs-src/docs/imported/changelog.md +31 -0
  75. data/docs-src/docs/imported/quick_reference.md +150 -0
  76. data/docs-src/docs/index.md +38 -0
  77. data/docs-src/docs/tutorial/10-getting_started.md +41 -0
  78. data/docs-src/docs/tutorial/20-project_layout.md +115 -0
  79. data/docs-src/docs/tutorial/30-your_first_command.md +126 -0
  80. data/docs-src/docs/tutorial/40-options_parameters_and_arguments.md +251 -0
  81. data/docs-src/docs/tutorial/50-publishing.md +47 -0
  82. data/docs-src/docs/whoami.md +28 -0
  83. data/docs-src/makesite.sh +14 -0
  84. data/docs-src/mkdocs.yml +76 -0
  85. data/docs-src/runsite.sh +3 -0
  86. data/exe/rbcli +76 -5
  87. data/lib/rbcli/autoupdate/autoupdate.rb +24 -4
  88. data/lib/rbcli/autoupdate/gem_updater.rb +23 -2
  89. data/lib/rbcli/autoupdate/github_updater.rb +22 -1
  90. data/lib/rbcli/configuration/config.rb +22 -1
  91. data/lib/rbcli/configuration/configurate.rb +24 -2
  92. data/lib/rbcli/engine/command.rb +26 -6
  93. data/lib/rbcli/engine/load_project.rb +29 -3
  94. data/lib/rbcli/engine/parser.rb +25 -4
  95. data/lib/rbcli/logging/logging.rb +21 -0
  96. data/lib/rbcli/scriptwrapping/scriptwrapper.rb +30 -11
  97. data/lib/rbcli/stateful_systems/configuratestorage.rb +20 -0
  98. data/lib/rbcli/stateful_systems/state_storage.rb +20 -0
  99. data/lib/rbcli/stateful_systems/storagetypes/localstate.rb +20 -0
  100. data/lib/rbcli/stateful_systems/storagetypes/remote_state_connectors/dynamodb.rb +20 -0
  101. data/lib/rbcli/stateful_systems/storagetypes/remotestate_dynamodb.rb +20 -0
  102. data/lib/rbcli/util/hash_deep_symbolize.rb +43 -22
  103. data/lib/rbcli/util/string_colorize.rb +20 -0
  104. data/lib/rbcli/version.rb +21 -1
  105. data/lib/rbcli-tool/generators.rb +20 -0
  106. data/lib/rbcli-tool/mdless_fix.rb +20 -0
  107. data/lib/rbcli-tool/project.rb +27 -2
  108. data/lib/rbcli-tool/util.rb +20 -0
  109. data/lib/rbcli-tool.rb +20 -0
  110. data/lib/rbcli.rb +20 -0
  111. data/lib-sh/lib-rbcli.sh +19 -0
  112. data/rbcli.gemspec +22 -3
  113. data/skeletons/project/CODE_OF_CONDUCT.md +1 -1
  114. data/skeletons/project/README.md +17 -2
  115. data/skeletons/project/application/commands/command.erb +10 -8
  116. data/skeletons/project/application/commands/script.erb +3 -1
  117. data/skeletons/project/application/commands/scripts/script.sh +2 -2
  118. data/skeletons/project/application/options.rb +12 -3
  119. data/skeletons/project/config/autoupdate.rb +5 -2
  120. data/skeletons/project/config/storage.rb +7 -6
  121. data/skeletons/project/config/userspace.rb +6 -1
  122. data/skeletons/project/exe/executable +1 -1
  123. data/skeletons/project/lib/.keep +0 -0
  124. data/skeletons/project/untitled.gemspec +4 -4
  125. data/skeletons/project/{default_user_configs → userconf}/user_defaults.yml +0 -0
  126. metadata +85 -9
  127. data/examples/defaults.yml +0 -4
  128. data/examples/myscript.sh +0 -23
  129. data/examples/mytool +0 -95
@@ -0,0 +1,777 @@
1
+
2
+
3
+
4
+
5
+ <!DOCTYPE html>
6
+ <html lang="en" class="no-js">
7
+ <head>
8
+
9
+ <meta charset="utf-8">
10
+ <meta name="viewport" content="width=device-width,initial-scale=1">
11
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
12
+
13
+ <meta name="description" content="Description">
14
+
15
+
16
+
17
+ <meta name="author" content="Andrew Khoury">
18
+
19
+
20
+ <meta name="lang:clipboard.copy" content="Copy to clipboard">
21
+
22
+ <meta name="lang:clipboard.copied" content="Copied to clipboard">
23
+
24
+ <meta name="lang:search.language" content="en">
25
+
26
+ <meta name="lang:search.pipeline.stopwords" content="True">
27
+
28
+ <meta name="lang:search.pipeline.trimmer" content="True">
29
+
30
+ <meta name="lang:search.result.none" content="No matching documents">
31
+
32
+ <meta name="lang:search.result.one" content="1 matching document">
33
+
34
+ <meta name="lang:search.result.other" content="# matching documents">
35
+
36
+ <meta name="lang:search.tokenizer" content="[\s\-]+">
37
+
38
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
39
+ <meta name="generator" content="mkdocs-0.17.5, mkdocs-material-2.9.2">
40
+
41
+
42
+
43
+ <title>Distributed State Locking - RBCli Documentation</title>
44
+
45
+
46
+
47
+ <link rel="stylesheet" href="../../assets/stylesheets/application.ba0fd1a6.css">
48
+
49
+
50
+
51
+
52
+ <script src="../../assets/javascripts/modernizr.1aa3b519.js"></script>
53
+
54
+
55
+ <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
56
+
57
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
58
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
59
+
60
+
61
+ <link rel="stylesheet" href="../../assets/fonts/material-icons.css">
62
+
63
+
64
+ </head>
65
+
66
+ <body dir="ltr">
67
+
68
+ <svg class="md-svg">
69
+ <defs>
70
+
71
+
72
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448"
73
+ viewBox="0 0 416 448" id="__github">
74
+ <path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19-18.125
75
+ 8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19 18.125-8.5
76
+ 18.125 8.5 10.75 19 3.125 20.5zM320 304q0 10-3.125 20.5t-10.75
77
+ 19-18.125 8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19
78
+ 18.125-8.5 18.125 8.5 10.75 19 3.125 20.5zM360
79
+ 304q0-30-17.25-51t-46.75-21q-10.25 0-48.75 5.25-17.75 2.75-39.25
80
+ 2.75t-39.25-2.75q-38-5.25-48.75-5.25-29.5 0-46.75 21t-17.25 51q0 22 8
81
+ 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0
82
+ 37.25-1.75t35-7.375 30.5-15 20.25-25.75 8-38.375zM416 260q0 51.75-15.25
83
+ 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5-41.75
84
+ 1.125q-19.5 0-35.5-0.75t-36.875-3.125-38.125-7.5-34.25-12.875-30.25-20.25-21.5-28.75q-15.5-30.75-15.5-82.75
85
+ 0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25
86
+ 30.875q36.75-8.75 77.25-8.75 37 0 70 8 26.25-20.5
87
+ 46.75-30.25t47.25-9.75q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34
88
+ 99.5z" />
89
+ </svg>
90
+
91
+ </defs>
92
+ </svg>
93
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
94
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
95
+ <label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
96
+
97
+ <a href="#distributed-locking-and-state-sharing" tabindex="1" class="md-skip">
98
+ Skip to content
99
+ </a>
100
+
101
+
102
+ <header class="md-header" data-md-component="header">
103
+ <nav class="md-header-nav md-grid">
104
+ <div class="md-flex">
105
+ <div class="md-flex__cell md-flex__cell--shrink">
106
+ <a href="../.." title="RBCli Documentation" class="md-header-nav__button md-logo">
107
+
108
+ <i class="md-icon">devices</i>
109
+
110
+ </a>
111
+ </div>
112
+ <div class="md-flex__cell md-flex__cell--shrink">
113
+ <label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
114
+ </div>
115
+ <div class="md-flex__cell md-flex__cell--stretch">
116
+ <div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
117
+
118
+
119
+ <span class="md-header-nav__topic">
120
+ RBCli Documentation
121
+ </span>
122
+ <span class="md-header-nav__topic">
123
+ Distributed State Locking
124
+ </span>
125
+
126
+
127
+ </div>
128
+ </div>
129
+ <div class="md-flex__cell md-flex__cell--shrink">
130
+
131
+
132
+ <label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
133
+
134
+ <div class="md-search" data-md-component="search" role="dialog">
135
+ <label class="md-search__overlay" for="__search"></label>
136
+ <div class="md-search__inner" role="search">
137
+ <form class="md-search__form" name="search">
138
+ <input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
139
+ <label class="md-icon md-search__icon" for="__search"></label>
140
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
141
+ &#xE5CD;
142
+ </button>
143
+ </form>
144
+ <div class="md-search__output">
145
+ <div class="md-search__scrollwrap" data-md-scrollfix>
146
+ <div class="md-search-result" data-md-component="result">
147
+ <div class="md-search-result__meta">
148
+ Type to start searching
149
+ </div>
150
+ <ol class="md-search-result__list"></ol>
151
+ </div>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ </div>
156
+
157
+
158
+ </div>
159
+
160
+ <div class="md-flex__cell md-flex__cell--shrink">
161
+ <div class="md-header-nav__source">
162
+
163
+
164
+
165
+
166
+
167
+
168
+ <a href="https://github.com/akhoury6/rbcli/" title="Go to repository" class="md-source" data-md-source="github">
169
+
170
+ <div class="md-source__icon">
171
+ <svg viewBox="0 0 24 24" width="24" height="24">
172
+ <use xlink:href="#__github" width="24" height="24"></use>
173
+ </svg>
174
+ </div>
175
+
176
+ <div class="md-source__repository">
177
+ GitHub
178
+ </div>
179
+ </a>
180
+
181
+ </div>
182
+ </div>
183
+
184
+ </div>
185
+ </nav>
186
+ </header>
187
+
188
+ <div class="md-container">
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+ <nav class="md-tabs md-tabs--active" data-md-component="tabs">
198
+ <div class="md-tabs__inner md-grid">
199
+ <ul class="md-tabs__list">
200
+
201
+
202
+ <li class="md-tabs__item">
203
+
204
+ <a href="../.." title="Home" class="md-tabs__link">
205
+ Home
206
+ </a>
207
+
208
+ </li>
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+ <li class="md-tabs__item">
217
+
218
+ <a href="../../tutorial/10-getting_started/" title="Tutorial" class="md-tabs__link">
219
+ Tutorial
220
+ </a>
221
+
222
+ </li>
223
+
224
+
225
+
226
+
227
+
228
+
229
+ <li class="md-tabs__item">
230
+
231
+ <a href="../command_types/" title="Advanced Features" class="md-tabs__link md-tabs__link--active">
232
+ Advanced Features
233
+ </a>
234
+
235
+ </li>
236
+
237
+
238
+
239
+
240
+
241
+
242
+ <li class="md-tabs__item">
243
+
244
+ <a href="../../development/contributing/" title="Development" class="md-tabs__link">
245
+ Development
246
+ </a>
247
+
248
+ </li>
249
+
250
+
251
+
252
+
253
+
254
+ </ul>
255
+ </div>
256
+ </nav>
257
+
258
+ <main class="md-main">
259
+ <div class="md-main__inner md-grid" data-md-component="container">
260
+
261
+
262
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
263
+ <div class="md-sidebar__scrollwrap">
264
+ <div class="md-sidebar__inner">
265
+ <nav class="md-nav md-nav--primary" data-md-level="0">
266
+ <label class="md-nav__title md-nav__title--site" for="__drawer">
267
+ <span class="md-nav__button md-logo">
268
+
269
+ <i class="md-icon">devices</i>
270
+
271
+ </span>
272
+ RBCli Documentation
273
+ </label>
274
+
275
+ <div class="md-nav__source">
276
+
277
+
278
+
279
+
280
+
281
+
282
+ <a href="https://github.com/akhoury6/rbcli/" title="Go to repository" class="md-source" data-md-source="github">
283
+
284
+ <div class="md-source__icon">
285
+ <svg viewBox="0 0 24 24" width="24" height="24">
286
+ <use xlink:href="#__github" width="24" height="24"></use>
287
+ </svg>
288
+ </div>
289
+
290
+ <div class="md-source__repository">
291
+ GitHub
292
+ </div>
293
+ </a>
294
+
295
+ </div>
296
+
297
+ <ul class="md-nav__list" data-md-scrollfix>
298
+
299
+
300
+
301
+
302
+
303
+
304
+ <li class="md-nav__item">
305
+ <a href="../.." title="Home" class="md-nav__link">
306
+ Home
307
+ </a>
308
+ </li>
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+ <li class="md-nav__item">
317
+ <a href="../../imported/quick_reference/" title="Quick Reference" class="md-nav__link">
318
+ Quick Reference
319
+ </a>
320
+ </li>
321
+
322
+
323
+
324
+
325
+
326
+
327
+
328
+ <li class="md-nav__item md-nav__item--nested">
329
+
330
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
331
+
332
+ <label class="md-nav__link" for="nav-3">
333
+ Tutorial
334
+ </label>
335
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
336
+ <label class="md-nav__title" for="nav-3">
337
+ Tutorial
338
+ </label>
339
+ <ul class="md-nav__list" data-md-scrollfix>
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+ <li class="md-nav__item">
348
+ <a href="../../tutorial/10-getting_started/" title="Getting Started" class="md-nav__link">
349
+ Getting Started
350
+ </a>
351
+ </li>
352
+
353
+
354
+
355
+
356
+
357
+
358
+
359
+ <li class="md-nav__item">
360
+ <a href="../../tutorial/20-project_layout/" title="The Project Layout" class="md-nav__link">
361
+ The Project Layout
362
+ </a>
363
+ </li>
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+ <li class="md-nav__item">
372
+ <a href="../../tutorial/30-your_first_command/" title="Your First Command" class="md-nav__link">
373
+ Your First Command
374
+ </a>
375
+ </li>
376
+
377
+
378
+
379
+
380
+
381
+
382
+
383
+ <li class="md-nav__item">
384
+ <a href="../../tutorial/40-options_parameters_and_arguments/" title="Options, Parameters, and Arguments" class="md-nav__link">
385
+ Options, Parameters, and Arguments
386
+ </a>
387
+ </li>
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+ <li class="md-nav__item">
396
+ <a href="../../tutorial/50-publishing/" title="Publishing and Distribution" class="md-nav__link">
397
+ Publishing and Distribution
398
+ </a>
399
+ </li>
400
+
401
+
402
+ </ul>
403
+ </nav>
404
+ </li>
405
+
406
+
407
+
408
+
409
+
410
+
411
+
412
+
413
+
414
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
415
+
416
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4" checked>
417
+
418
+ <label class="md-nav__link" for="nav-4">
419
+ Advanced Features
420
+ </label>
421
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
422
+ <label class="md-nav__title" for="nav-4">
423
+ Advanced Features
424
+ </label>
425
+ <ul class="md-nav__list" data-md-scrollfix>
426
+
427
+
428
+
429
+
430
+
431
+
432
+
433
+ <li class="md-nav__item">
434
+ <a href="../command_types/" title="Command Types" class="md-nav__link">
435
+ Command Types
436
+ </a>
437
+ </li>
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+ <li class="md-nav__item">
446
+ <a href="../user_config_files/" title="User Config Files" class="md-nav__link">
447
+ User Config Files
448
+ </a>
449
+ </li>
450
+
451
+
452
+
453
+
454
+
455
+
456
+
457
+ <li class="md-nav__item">
458
+ <a href="../hooks/" title="Hooks" class="md-nav__link">
459
+ Hooks
460
+ </a>
461
+ </li>
462
+
463
+
464
+
465
+
466
+
467
+
468
+
469
+ <li class="md-nav__item">
470
+ <a href="../automatic_updates/" title="Automatic Updates" class="md-nav__link">
471
+ Automatic Updates
472
+ </a>
473
+ </li>
474
+
475
+
476
+
477
+
478
+
479
+
480
+
481
+ <li class="md-nav__item">
482
+ <a href="../state_storage/" title="State Storage" class="md-nav__link">
483
+ State Storage
484
+ </a>
485
+ </li>
486
+
487
+
488
+
489
+
490
+
491
+
492
+
493
+
494
+
495
+ <li class="md-nav__item md-nav__item--active">
496
+
497
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
498
+
499
+
500
+
501
+
502
+ <label class="md-nav__link md-nav__link--active" for="__toc">
503
+ Distributed State Locking
504
+ </label>
505
+
506
+ <a href="./" title="Distributed State Locking" class="md-nav__link md-nav__link--active">
507
+ Distributed State Locking
508
+ </a>
509
+
510
+
511
+ <nav class="md-nav md-nav--secondary">
512
+
513
+
514
+
515
+
516
+
517
+ <label class="md-nav__title" for="__toc">Table of contents</label>
518
+ <ul class="md-nav__list" data-md-scrollfix>
519
+
520
+ <li class="md-nav__item">
521
+ <a href="#manual-locking" title="Manual Locking" class="md-nav__link">
522
+ Manual Locking
523
+ </a>
524
+
525
+ </li>
526
+
527
+
528
+
529
+
530
+
531
+ </ul>
532
+
533
+ </nav>
534
+
535
+ </li>
536
+
537
+
538
+ </ul>
539
+ </nav>
540
+ </li>
541
+
542
+
543
+
544
+
545
+
546
+
547
+
548
+ <li class="md-nav__item md-nav__item--nested">
549
+
550
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
551
+
552
+ <label class="md-nav__link" for="nav-5">
553
+ Development
554
+ </label>
555
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
556
+ <label class="md-nav__title" for="nav-5">
557
+ Development
558
+ </label>
559
+ <ul class="md-nav__list" data-md-scrollfix>
560
+
561
+
562
+
563
+
564
+
565
+
566
+
567
+ <li class="md-nav__item">
568
+ <a href="../../development/contributing/" title="Contribution Guide" class="md-nav__link">
569
+ Contribution Guide
570
+ </a>
571
+ </li>
572
+
573
+
574
+
575
+
576
+
577
+
578
+
579
+ <li class="md-nav__item">
580
+ <a href="../../development/license/" title="License Info" class="md-nav__link">
581
+ License Info
582
+ </a>
583
+ </li>
584
+
585
+
586
+
587
+
588
+
589
+
590
+
591
+ <li class="md-nav__item">
592
+ <a href="../../development/code_of_conduct/" title="Code of Conduct" class="md-nav__link">
593
+ Code of Conduct
594
+ </a>
595
+ </li>
596
+
597
+
598
+
599
+
600
+
601
+
602
+
603
+ <li class="md-nav__item">
604
+ <a href="../../imported/changelog/" title="Changelog" class="md-nav__link">
605
+ Changelog
606
+ </a>
607
+ </li>
608
+
609
+
610
+ </ul>
611
+ </nav>
612
+ </li>
613
+
614
+
615
+
616
+
617
+
618
+
619
+
620
+ <li class="md-nav__item">
621
+ <a href="../../whoami/" title="$ whoami" class="md-nav__link">
622
+ $ whoami
623
+ </a>
624
+ </li>
625
+
626
+
627
+ </ul>
628
+ </nav>
629
+ </div>
630
+ </div>
631
+ </div>
632
+
633
+
634
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
635
+ <div class="md-sidebar__scrollwrap">
636
+ <div class="md-sidebar__inner">
637
+
638
+ <nav class="md-nav md-nav--secondary">
639
+
640
+
641
+
642
+
643
+
644
+ <label class="md-nav__title" for="__toc">Table of contents</label>
645
+ <ul class="md-nav__list" data-md-scrollfix>
646
+
647
+ <li class="md-nav__item">
648
+ <a href="#manual-locking" title="Manual Locking" class="md-nav__link">
649
+ Manual Locking
650
+ </a>
651
+
652
+ </li>
653
+
654
+
655
+
656
+
657
+
658
+ </ul>
659
+
660
+ </nav>
661
+ </div>
662
+ </div>
663
+ </div>
664
+
665
+
666
+ <div class="md-content">
667
+ <article class="md-content__inner md-typeset">
668
+
669
+
670
+
671
+ <h1 id="distributed-locking-and-state-sharing">Distributed Locking and State Sharing</h1>
672
+ <p>Distributed Locking allows a <a href="../state_storage/">Remote State</a> to be shared among multiple users of the application to make writes appear atomic between sessions. To use it, simply set the <code>locking:</code> parameter to <code>true</code> when enabling remote state.</p>
673
+ <p>This is how locking works:</p>
674
+ <ol>
675
+ <li>The application attempts to acquire a lock on the remote state when you first access it</li>
676
+ <li>If the backend is locked by a different application, wait and try again</li>
677
+ <li>If it succeeds, the lock is held and refreshed periodically</li>
678
+ <li>When the application exits, the lock is released</li>
679
+ <li>If the application does not refresh its lock, or fails to release it when it exits, the lock will automatically expire within 60 seconds</li>
680
+ <li>If another application steals the lock (unlikely but possible), and the application tries to save data, a <code>StandardError</code> will be thrown</li>
681
+ <li>You can manually attempt to lock/unlock by calling <code>Rbcli.remote_state.lock</code> or <code>Rbcli.remote_state.unlock</code>, respectively. </li>
682
+ </ol>
683
+ <h2 id="manual-locking">Manual Locking</h2>
684
+ <p>Remember: all state in Rbcli is lazy-loaded. Therefore, RBCli wll only attempt to lock the data when you first try to access it. If you need to make sure that the data is locked before executing a block of code, use:</p>
685
+ <pre><code class="ruby">Rbcli.remote_state.refresh
686
+ </code></pre>
687
+
688
+ <p>to force the lock and retrieve the latest data. You can force an unlock by calling:</p>
689
+ <pre><code class="ruby">Rbcli.remote_state.disconnect
690
+ </code></pre>
691
+
692
+ <p>Even if you do not want to store any data, you can leverage manual locking to control access to a different shared resource, such as a stateful API. For example, if you write a cloud deployment toolkit, you can ensure that only one user is attempting to modify a deployment at any given time.</p>
693
+
694
+
695
+
696
+
697
+
698
+
699
+
700
+
701
+
702
+ </article>
703
+ </div>
704
+ </div>
705
+ </main>
706
+
707
+
708
+ <footer class="md-footer">
709
+
710
+ <div class="md-footer-nav">
711
+ <nav class="md-footer-nav__inner md-grid">
712
+
713
+ <a href="../state_storage/" title="State Storage" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
714
+ <div class="md-flex__cell md-flex__cell--shrink">
715
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
716
+ </div>
717
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
718
+ <span class="md-flex__ellipsis">
719
+ <span class="md-footer-nav__direction">
720
+ Previous
721
+ </span>
722
+ State Storage
723
+ </span>
724
+ </div>
725
+ </a>
726
+
727
+
728
+ <a href="../../development/contributing/" title="Contribution Guide" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
729
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
730
+ <span class="md-flex__ellipsis">
731
+ <span class="md-footer-nav__direction">
732
+ Next
733
+ </span>
734
+ Contribution Guide
735
+ </span>
736
+ </div>
737
+ <div class="md-flex__cell md-flex__cell--shrink">
738
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
739
+ </div>
740
+ </a>
741
+
742
+ </nav>
743
+ </div>
744
+
745
+ <div class="md-footer-meta md-typeset">
746
+ <div class="md-footer-meta__inner md-grid">
747
+ <div class="md-footer-copyright">
748
+
749
+ <div class="md-footer-copyright__highlight">
750
+ Copyright © 2018 Andrew Khoury
751
+ </div>
752
+
753
+ powered by
754
+ <a href="https://www.mkdocs.org">MkDocs</a>
755
+ and
756
+ <a href="https://squidfunk.github.io/mkdocs-material/">
757
+ Material for MkDocs</a>
758
+ </div>
759
+
760
+
761
+
762
+ </div>
763
+ </div>
764
+ </footer>
765
+
766
+ </div>
767
+
768
+ <script src="../../assets/javascripts/application.a59e2a89.js"></script>
769
+
770
+ <script>app.initialize({version:"0.17.5",url:{base:"../.."}})</script>
771
+
772
+
773
+
774
+
775
+
776
+ </body>
777
+ </html>