dockerun 0.3.6 → 0.4.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 (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 +39 -86
  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 -226
  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 -213
  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.6"
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.6
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