dockerun 0.3.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -11
  3. data/Rakefile +0 -2
  4. data/Rakefile.bak +8 -0
  5. data/dockerspec.sample +104 -0
  6. data/{dockerun.gemspec → dockerun.gemspec.bak} +20 -22
  7. data/exe/dockerun +8 -115
  8. data/lib/dockerun/cli/command.rb +133 -0
  9. data/lib/dockerun/cli/command_factory.rb +313 -0
  10. data/lib/dockerun/cli/command_result.rb +67 -0
  11. data/lib/dockerun/cli/delete_container.rb +55 -0
  12. data/lib/dockerun/cli/delete_image.rb +99 -0
  13. data/lib/dockerun/cli/run.rb +39 -0
  14. data/lib/dockerun/cli/user_info.rb +39 -0
  15. data/lib/dockerun/cli_engine.rb +104 -0
  16. data/lib/dockerun/config.rb +40 -70
  17. data/lib/dockerun/context/rubygems.rb +142 -0
  18. data/lib/dockerun/dfile.rb +204 -0
  19. data/lib/dockerun/docker_cli.rb +124 -0
  20. data/lib/dockerun/dsl.rb +291 -0
  21. data/lib/dockerun/version.rb +1 -1
  22. data/lib/dockerun.rb +31 -24
  23. data/sig/dockerun.rbs +4 -0
  24. metadata +62 -73
  25. data/.release_history.yml +0 -56
  26. data/Dockerfile.dockerun +0 -38
  27. data/Gemfile +0 -15
  28. data/Gemfile.lock +0 -94
  29. data/bin/console +0 -15
  30. data/bin/setup +0 -8
  31. data/lib/dockerun/bundler_helper.rb +0 -25
  32. data/lib/dockerun/cli_prompt.rb +0 -18
  33. data/lib/dockerun/command/dockerun.rb +0 -30
  34. data/lib/dockerun/command/init.rb +0 -79
  35. data/lib/dockerun/command/remove_container.rb +0 -99
  36. data/lib/dockerun/command/reset_image.rb +0 -107
  37. data/lib/dockerun/command/run.rb +0 -221
  38. data/lib/dockerun/command/run_new_container.rb +0 -94
  39. data/lib/dockerun/command/run_new_image.rb +0 -89
  40. data/lib/dockerun/command/stop_container.rb +0 -90
  41. data/lib/dockerun/docker_command_factory_helper.rb +0 -19
  42. data/lib/dockerun/docker_container_helper.rb +0 -204
  43. data/lib/dockerun/docker_image_helper.rb +0 -381
  44. data/lib/dockerun/template/general_template_writer.rb +0 -14
  45. data/lib/dockerun/template/jruby_template_writer.rb +0 -24
  46. data/lib/dockerun/template/template_engine.rb +0 -27
  47. data/lib/dockerun/template/template_writer.rb +0 -102
  48. data/lib/dockerun/user_info.rb +0 -37
  49. data/template/Dockerfile_general.erb +0 -41
  50. data/template/setup_ruby_devenv.rb.erb +0 -22
@@ -0,0 +1,291 @@
1
+
2
+ require_relative 'config'
3
+ require_relative 'dfile'
4
+ require_relative 'docker_cli'
5
+
6
+ require_relative 'cli/command_factory'
7
+
8
+ module Dockerun
9
+ module DSL
10
+ include TR::CondUtils
11
+
12
+ def config(&block)
13
+ _config.instance_eval(&block)
14
+ end
15
+
16
+ def set_dry_run_mode(bool = true, prompt = false)
17
+ _config.dry_run(bool, prompt)
18
+ end
19
+
20
+ # Main DSL for dockerfile related configurations
21
+ def from(base_image, &block)
22
+ _dfile.base_image = base_image
23
+ _dfile.instance_eval(&block)
24
+ end
25
+
26
+ # Additional dockerfile configurations for example
27
+ # if user did not specify the image name, better generate
28
+ # by system so that it can be traced for subsequent functions
29
+ # later such as delete image
30
+ def dockerfile_patch(&block)
31
+ _file.instance_eval(&block)
32
+ end
33
+
34
+ # Main DSL for docker cli
35
+ def up(&block)
36
+ _docker_cli.instance_eval(&block)
37
+ end
38
+
39
+ # Trigger point to start the ball rolling!
40
+ def go
41
+
42
+ # Link context with Dockerfile and docker cli
43
+ if not_empty?(_config.active_context)
44
+ self.listener do |ops, *val|
45
+ _config.active_context.call(ops, *val)
46
+ end
47
+
48
+ _dfile.listener do |ops, *val|
49
+ _config.active_context.call(ops, *val)
50
+ end
51
+
52
+ _docker_cli.listener do |ops, *val|
53
+ _config.active_context.call(ops, *val)
54
+ end
55
+ end
56
+
57
+ # give chance to context to verify the integrity of the
58
+ # workspace before proceed
59
+ trigger_listener(:dsl_before_go, self)
60
+
61
+ # check if image exist?
62
+ if not image_exist?
63
+ logger.debug "Image doesn't exist... proceed to build the image"
64
+ # if not exist, build the image giving the name
65
+ st, res = build_image
66
+ if st
67
+ trigger_listener(:dsl_image_built, self)
68
+ #puts " Image '#{image_name}' built successfully"
69
+ else
70
+ trigger_listener(:dsl_image_building_failed, self)
71
+ raise Error, " Image '#{image_name}' failed to be built. Error was : #{res.err_lines.join("\n")}"
72
+ end
73
+ else
74
+ logger.debug "Image exist... skipped image building..."
75
+ end
76
+
77
+ # check if container exist?
78
+ if container_exist?
79
+ trigger_listener(:dsl_before_start_container, self)
80
+ logger.debug "Container exist... Starting container..."
81
+ # container exist, start the container
82
+ start_container
83
+
84
+ trigger_listener(:dsl_before_attach_container, self)
85
+ logger.debug "Container started... attaching container..."
86
+ # attach to container
87
+ attach_container
88
+ trigger_listener(:dsl_after_attach_container, self)
89
+ else
90
+ trigger_listener(:dsl_before_run_container, self)
91
+ logger.debug "Container does not exist. Creating new container..."
92
+ # Container does not exist, run the container
93
+ run_container
94
+ end
95
+
96
+ end
97
+
98
+
99
+ def image_name
100
+ if _dfile.is_image_name_given?
101
+ _dfile.image_name
102
+ else
103
+ _dfile.generated_image_name
104
+ end
105
+ end
106
+
107
+ def container_name
108
+ if _docker_cli.is_container_name_given?
109
+ _docker_cli.container_name
110
+ else
111
+ _docker_cli.generated_container_name
112
+ end
113
+ end
114
+
115
+
116
+ def listener(&block)
117
+ @listener = block
118
+ end
119
+
120
+
121
+ private
122
+ def _config
123
+ if @_config.nil?
124
+ @_config = Config.new
125
+ end
126
+ @_config
127
+ end
128
+
129
+ def _dfile
130
+ if @_dfile.nil?
131
+ @_dfile = Dfile.new(_config)
132
+ end
133
+ @_dfile
134
+ end
135
+
136
+ def _docker_cli
137
+ if @_docker_cli.nil?
138
+ @_docker_cli = DockerCli.new(_config, _dfile)
139
+ end
140
+ @_docker_cli
141
+ end
142
+
143
+ def docker_cf
144
+ if @_docker_cf.nil?
145
+ @_docker_cf = Dockerun::Cli::CommandFactory.new
146
+ end
147
+ @_docker_cf
148
+ end
149
+
150
+ def trigger_listener(evt, *args, &block)
151
+ if not @listener.nil?
152
+ @listener.call(evt, *args, &block)
153
+ end
154
+ end
155
+
156
+ # flag to bridge between script and eval mode
157
+ def mark_go_done
158
+ @_go_done = true
159
+ end
160
+ def is_go_done?
161
+ @_go_done.nil? ? false : @_go_done
162
+ end
163
+ # end flag
164
+
165
+ def image_exist?
166
+ fact = docker_cf.find_image(image_name)
167
+ if _config.is_dry_run?
168
+ dry_run_puts "Find Image : #{fact.to_s}"
169
+ dry_run_puts "Find Image : Returning false to allow image build"
170
+ false
171
+ else
172
+ res = docker_cf.find_image(image_name).run
173
+ res.success? and not_empty?(res.output_lines)
174
+ end
175
+ end
176
+
177
+ def build_image
178
+ dfile = _dfile.generate
179
+ dfileName = "Dockerfile-#{SecureRandom.hex(4)}"
180
+ File.open(dfileName,"w") do |f|
181
+ f.write dfile
182
+ end
183
+
184
+ fact = docker_cf.build_image(image_name, dockerfile: dfileName)
185
+ if _config.is_dry_run?
186
+ dry_run_puts "Build Image : #{fact.to_s}"
187
+ dry_run_puts "Build Image : Returning true to proceed to next phase."
188
+ dry_run_puts "Generated dockerfile '#{dfileName}' shall be remained in project directory."
189
+ [true, nil]
190
+ else
191
+ res = fact.run
192
+ if res.success?
193
+ FileUtils.rm(dFileName) if not _dfile.keep_dockerfile?
194
+ [true, res]
195
+ else
196
+ [false, res]
197
+ end
198
+ end
199
+ end
200
+
201
+
202
+ def container_exist?
203
+ if _docker_cli.keep_container?
204
+ fact = docker_cf.find_from_all_container(container_name)
205
+ if _config.is_dry_run?
206
+ dry_run_puts "Is container exist? : #{fact.to_s}"
207
+ dry_run_puts "Returning false to allow container build"
208
+ false
209
+ else
210
+ res = fact.run
211
+ res.success? and not_empty?(res.output_lines)
212
+ end
213
+ else
214
+ remove_container
215
+ false
216
+ end
217
+ end
218
+
219
+ def remove_container
220
+ fact = docker_cf.find_from_all_container(container_name)
221
+ res = fact.run
222
+ if res.success?
223
+ res.output_lines.each do |ci|
224
+ docker_cf.stop_container(ci).run
225
+ r = docker_cf.delete_container(ci).run
226
+ logger.debug "Delete container : #{r.success?} / #{r.success? ? r.output_lines.join("\n") : r.err_lines.join("\n")}"
227
+ end
228
+ else
229
+ logger.debug "Failed to find all container by name '#{container_name}'"
230
+ end
231
+ end
232
+
233
+ def start_container
234
+ fact = docker_cf.find_running_container(container_name)
235
+ fact2 = docker_cf.start_container(container_name)
236
+
237
+ if _config.is_dry_run?
238
+ dry_run_puts "Find running container : #{fact.to_s}"
239
+ dry_run_puts "Start container : #{fact2.to_s}"
240
+ [true, nil]
241
+ else
242
+ res = fact.run
243
+ if res.success? and not_empty?(res.output_lines)
244
+ # already running so ignore
245
+ [true, res]
246
+ else
247
+ res2 = fact2.run
248
+ [res2.success?, res2]
249
+ end
250
+ end
251
+ end
252
+
253
+ def attach_container
254
+ fact = docker_cf.attach_container(container_name)
255
+ if _config.is_dry_run?
256
+ dry_run_puts "Attach container : #{fact.to_s}"
257
+ else
258
+ fact.run
259
+ end
260
+ #docker_cf.attach_container(container_name).run
261
+ end
262
+
263
+ def run_container
264
+
265
+ params = { interactive: _docker_cli.is_interactive?, tty: _docker_cli.is_interactive?, del: !_docker_cli.keep_container?, container_name: container_name, match_user: _config.set_current_user?, command: _docker_cli.command_to_be_run, mounts: _docker_cli.mounts }
266
+
267
+ params[:ports] = {} if params[:ports].nil?
268
+ params[:ports].merge!(_docker_cli.expose_ports) if _docker_cli.has_exposed_ports?
269
+
270
+ params = _docker_cli.trigger_listener(:docker_cli_construct_command, params)
271
+
272
+ fact = docker_cf.create_container_from_image(image_name, params)
273
+ if _config.is_dry_run?
274
+ dry_run_puts "Run container : #{fact.to_s}"
275
+ else
276
+ fact.run
277
+ end
278
+ end
279
+
280
+
281
+ def dry_run_puts(msg)
282
+ puts "[DryRun] #{msg}" if _config.is_dry_run_prompt?
283
+ end
284
+
285
+
286
+ def logger
287
+ Dockerun.logger(:dockerun_dsl)
288
+ end
289
+
290
+ end
291
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dockerun
4
- VERSION = "0.3.5"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/dockerun.rb CHANGED
@@ -3,41 +3,48 @@
3
3
  require 'toolrack'
4
4
  require 'teLogger'
5
5
 
6
- require 'colorize'
7
- require 'tty/prompt'
6
+ require 'tty/command'
7
+ require 'tty/which'
8
8
 
9
9
  require_relative "dockerun/version"
10
+ require_relative 'dockerun/dsl'
10
11
 
11
- require_relative 'dockerun/command/dockerun'
12
- require_relative 'dockerun/command/init'
13
- require_relative 'dockerun/command/run'
14
- require_relative 'dockerun/command/reset_image'
15
- require_relative 'dockerun/command/run_new_container'
16
- require_relative 'dockerun/command/remove_container'
17
- require_relative 'dockerun/command/run_new_image'
18
- require_relative 'dockerun/command/stop_container'
19
-
20
- require_relative 'dockerun/template/template_writer'
21
- require_relative 'dockerun/template/template_engine'
12
+ require_relative 'dockerun/cli_engine'
22
13
 
23
14
  module Dockerun
15
+ include TR::CondUtils
16
+
24
17
  class Error < StandardError; end
25
18
  # Your code goes here...
26
19
 
27
- def self.udebug(msg)
28
- logger.tdebug(:dockerun, msg) if is_user_debug_on?
29
- end
30
-
31
- def self.logger
20
+ def self.logger(tag = nil, &block)
32
21
  if @_logger.nil?
33
- @_logger = TeLogger::Tlogger.new
22
+ drLogout = ENV["DR_LOGOUT"]
23
+ if is_empty?(drLogout)
24
+ @_logger = TeLogger::Tlogger.new('dockerun.log',5, 5*1024*1024)
25
+ else
26
+ @_logger = TeLogger::Tlogger.new(drLogout, 5, 5*1024*1024)
27
+ end
34
28
  end
35
- @_logger
36
- end
37
29
 
38
- def self.is_user_debug_on?
39
- val = ENV["DOCKERUN_DEBUG"]
40
- (not val.nil? and val == "true")
30
+ if block
31
+ if not_empty?(tag)
32
+ @_logger.with_tag(tag, &block)
33
+ else
34
+ @_logger.with_tag(@_logger.tag, &block)
35
+ end
36
+ else
37
+ if is_empty?(tag)
38
+ @_logger.tag = :dockerun
39
+ @_logger
40
+ else
41
+ # no block but tag is given? hmm
42
+ @_logger.tag = tag
43
+ @_logger
44
+ end
45
+ end
41
46
  end
42
47
 
48
+
49
+
43
50
  end
data/sig/dockerun.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Dockerun
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata CHANGED
@@ -1,169 +1,158 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dockerun
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
- - Ian
7
+ - Chris
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-26 00:00:00.000000000 Z
11
+ date: 2023-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: toolrack
14
+ name: teLogger
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '0.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '0.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: teLogger
28
+ name: toolrack
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '0.23'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '0.23'
41
41
  - !ruby/object:Gem::Dependency
42
- name: tty-command
42
+ name: tty-prompt
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '0.23'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '0.23'
55
55
  - !ruby/object:Gem::Dependency
56
- name: tty-option
56
+ name: tty-command
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '0.10'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '0.10'
69
69
  - !ruby/object:Gem::Dependency
70
- name: colorize
70
+ name: tty-which
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '0.5'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '0.5'
83
83
  - !ruby/object:Gem::Dependency
84
- name: docker-cli
84
+ name: pastel
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.3.1
89
+ version: '0.8'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.3.1
96
+ version: '0.8'
97
97
  - !ruby/object:Gem::Dependency
98
- name: devops_assist
98
+ name: colorize
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
103
+ version: '1.1'
104
+ type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0'
110
+ version: '1.1'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: release-gem
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: '0.3'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: '0.3'
125
125
  description: ''
126
126
  email:
127
- - cameronian0@protonmail.com
127
+ - chris@antrapol.com
128
128
  executables:
129
129
  - dockerun
130
130
  extensions: []
131
131
  extra_rdoc_files: []
132
132
  files:
133
- - ".release_history.yml"
134
133
  - ".rspec"
135
- - Dockerfile.dockerun
136
- - Gemfile
137
- - Gemfile.lock
138
134
  - README.md
139
135
  - Rakefile
140
- - bin/console
141
- - bin/setup
142
- - dockerun.gemspec
136
+ - Rakefile.bak
137
+ - dockerspec.sample
138
+ - dockerun.gemspec.bak
143
139
  - exe/dockerun
144
140
  - lib/dockerun.rb
145
- - lib/dockerun/bundler_helper.rb
146
- - lib/dockerun/cli_prompt.rb
147
- - lib/dockerun/command/dockerun.rb
148
- - lib/dockerun/command/init.rb
149
- - lib/dockerun/command/remove_container.rb
150
- - lib/dockerun/command/reset_image.rb
151
- - lib/dockerun/command/run.rb
152
- - lib/dockerun/command/run_new_container.rb
153
- - lib/dockerun/command/run_new_image.rb
154
- - lib/dockerun/command/stop_container.rb
141
+ - lib/dockerun/cli/command.rb
142
+ - lib/dockerun/cli/command_factory.rb
143
+ - lib/dockerun/cli/command_result.rb
144
+ - lib/dockerun/cli/delete_container.rb
145
+ - lib/dockerun/cli/delete_image.rb
146
+ - lib/dockerun/cli/run.rb
147
+ - lib/dockerun/cli/user_info.rb
148
+ - lib/dockerun/cli_engine.rb
155
149
  - lib/dockerun/config.rb
156
- - lib/dockerun/docker_command_factory_helper.rb
157
- - lib/dockerun/docker_container_helper.rb
158
- - lib/dockerun/docker_image_helper.rb
159
- - lib/dockerun/template/general_template_writer.rb
160
- - lib/dockerun/template/jruby_template_writer.rb
161
- - lib/dockerun/template/template_engine.rb
162
- - lib/dockerun/template/template_writer.rb
163
- - lib/dockerun/user_info.rb
150
+ - lib/dockerun/context/rubygems.rb
151
+ - lib/dockerun/dfile.rb
152
+ - lib/dockerun/docker_cli.rb
153
+ - lib/dockerun/dsl.rb
164
154
  - lib/dockerun/version.rb
165
- - template/Dockerfile_general.erb
166
- - template/setup_ruby_devenv.rb.erb
155
+ - sig/dockerun.rbs
167
156
  homepage: ''
168
157
  licenses: []
169
158
  metadata: {}
@@ -175,14 +164,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
175
164
  requirements:
176
165
  - - ">="
177
166
  - !ruby/object:Gem::Version
178
- version: 2.4.0
167
+ version: 2.6.0
179
168
  required_rubygems_version: !ruby/object:Gem::Requirement
180
169
  requirements:
181
170
  - - ">="
182
171
  - !ruby/object:Gem::Version
183
172
  version: '0'
184
173
  requirements: []
185
- rubygems_version: 3.4.10
174
+ rubygems_version: 3.4.6
186
175
  signing_key:
187
176
  specification_version: 4
188
177
  summary: ''
data/.release_history.yml DELETED
@@ -1,56 +0,0 @@
1
- ---
2
- dockerun:
3
- - :version: 0.1.0
4
- :timestamp: 1670316183.6472232
5
- - :version: 0.1.1
6
- :timestamp: 1670316312.4779773
7
- - :version: 0.1.2
8
- :timestamp: 1670322141.4019918
9
- - :version: 0.1.3
10
- :timestamp: 1670322571.6620317
11
- - :version: 0.1.4
12
- :timestamp: 1670322830.4816852
13
- - :version: 0.1.5
14
- :timestamp: 1670421296.0570104
15
- - :version: 0.1.6
16
- :timestamp: 1670421483.0685005
17
- - :version: 0.1.7
18
- :timestamp: 1670557200.7343419
19
- - :version: 0.1.8
20
- :timestamp: 1670557489.8592377
21
- - :version: 0.1.9
22
- :timestamp: 1670557778.5624037
23
- - :version: 0.1.10
24
- :timestamp: 1670579289.0579133
25
- - :version: 0.1.11
26
- :timestamp: 1670640649.1748028
27
- - :version: 0.1.12
28
- :timestamp: 1670640902.591357
29
- - :version: 0.1.13
30
- :timestamp: 1670649972.645625
31
- - :version: 0.1.14
32
- :timestamp: 1670677180.3442845
33
- - :version: 0.1.15_mac
34
- :timestamp: 1679552032.751968
35
- - :version: 0.1.15
36
- :timestamp: 1679980468.4161575
37
- - :version: 0.1.16
38
- :timestamp: 1680096788.8148112
39
- - :version: 0.1.17
40
- :timestamp: 1680413747.3876462
41
- - :version: 0.1.18
42
- :timestamp: 1680413850.243007
43
- - :version: 0.2.0
44
- :timestamp: 1680589830.9123309
45
- - :version: 0.2.1
46
- :timestamp: 1680590987.4122827
47
- - :version: 0.2.2
48
- :timestamp: 1680591256.174102
49
- - :version: 0.3.0
50
- :timestamp: 1680596019.8479326
51
- - :version: 0.3.1
52
- :timestamp: 1680596515.6388657
53
- - :version: 0.3.3
54
- :timestamp: 1680598096.8177018
55
- - :version: 0.3.4
56
- :timestamp: 1680600334.3304904