circule 0.1.0 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +86 -6
- data/Gemfile +4 -0
- data/Gemfile.lock +7 -1
- data/README.md +40 -7
- data/circule-demo.mp4 +0 -0
- data/circule.gemspec +4 -4
- data/exe/circule +6 -4
- data/lib/circule/gui.rb +28 -22
- data/lib/circule/version.rb +1 -1
- data/lib/circule.rb +1 -0
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d43165d03d518eb31001ab176b1200778d528a8586fb984b63946bd728c79051
|
4
|
+
data.tar.gz: 5a9fc83e8949085d4fcf756bef38d298d8272bfb59eeb602295a68b04fa41e61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34c059aea8a7919bd2c2316b518f5eeb47c4884cc06082f4defed64e736b1263aa4bf8c5dcde9d3956b1f2e2e433d258d7b3b75c59c330c22959e2cc2bbfc0da
|
7
|
+
data.tar.gz: d48266b32c4b2e876de388a1c5485e4f671159f958e2e1b6023c9b3468714e58b0b6c59d06fb813114fcb05c5d9d9480f103b836a2f53b2770c79e2b23e96ef5
|
data/.rubocop.yml
CHANGED
@@ -1,13 +1,93 @@
|
|
1
1
|
AllCops:
|
2
|
-
|
2
|
+
NewCops: enable
|
3
|
+
TargetRubyVersion: 2.7
|
4
|
+
|
5
|
+
Layout/ExtraSpacing:
|
6
|
+
Enabled: false
|
7
|
+
|
8
|
+
Layout/FirstHashElementIndentation:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
Layout/HashAlignment:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
Layout/LeadingCommentSpace:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Layout/LineLength:
|
18
|
+
Max: 160
|
19
|
+
|
20
|
+
Layout/MultilineMethodCallBraceLayout:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
Layout/MultilineMethodCallIndentation:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
Layout/SpaceAroundOperators:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
Layout/SpaceBeforeFirstArg:
|
30
|
+
Enabled: false
|
31
|
+
|
32
|
+
Layout/SpaceBeforeSemicolon:
|
33
|
+
Enabled: false
|
34
|
+
|
35
|
+
Layout/SpaceInsideArrayLiteralBrackets:
|
36
|
+
Enabled: false
|
37
|
+
|
38
|
+
Lint/AmbiguousOperator:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Lint/AmbiguousOperatorPrecedence:
|
42
|
+
Enabled: false
|
43
|
+
|
44
|
+
Lint/EmptyWhen:
|
45
|
+
Enabled: false
|
46
|
+
|
47
|
+
Lint/Void:
|
48
|
+
Enabled: false
|
49
|
+
|
50
|
+
Metrics/AbcSize:
|
51
|
+
Enabled: false
|
52
|
+
|
53
|
+
Metrics/BlockLength:
|
54
|
+
Enabled: false
|
55
|
+
|
56
|
+
Metrics/MethodLength:
|
57
|
+
Enabled: false
|
58
|
+
|
59
|
+
Naming/MethodParameterName:
|
60
|
+
Enabled: false
|
61
|
+
|
62
|
+
Metrics/ParameterLists:
|
63
|
+
Enabled: false
|
64
|
+
|
65
|
+
Naming/MemoizedInstanceVariableName:
|
66
|
+
Enabled: false
|
67
|
+
EnforcedStyleForLeadingUnderscores: required
|
68
|
+
|
69
|
+
Style/BlockDelimiters:
|
70
|
+
EnforcedStyle: semantic
|
71
|
+
BracesRequiredMethods: [button, command, entry, frame, label, spinbox]
|
72
|
+
|
73
|
+
Style/ClassAndModuleChildren:
|
74
|
+
EnforcedStyle: compact
|
75
|
+
|
76
|
+
Style/RescueModifier:
|
77
|
+
Enabled: false
|
78
|
+
|
79
|
+
Style/Semicolon:
|
80
|
+
AllowAsExpressionSeparator: true
|
3
81
|
|
4
82
|
Style/StringLiterals:
|
5
|
-
|
6
|
-
EnforcedStyle: double_quotes
|
83
|
+
EnforcedStyle: single_quotes
|
7
84
|
|
8
85
|
Style/StringLiteralsInInterpolation:
|
9
|
-
Enabled: true
|
10
86
|
EnforcedStyle: double_quotes
|
11
87
|
|
12
|
-
|
13
|
-
|
88
|
+
Style/TrailingCommaInArguments:
|
89
|
+
Enabled: false
|
90
|
+
EnforcedStyleForMultiline: consistent_comma
|
91
|
+
|
92
|
+
Style/TrailingCommaInHashLiteral:
|
93
|
+
EnforcedStyleForMultiline: consistent_comma
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
circule (0.1.
|
4
|
+
circule (0.1.4)
|
5
5
|
chunky_png
|
6
6
|
|
7
7
|
GEM
|
@@ -28,6 +28,10 @@ GEM
|
|
28
28
|
unicode-display_width (>= 1.4.0, < 3.0)
|
29
29
|
rubocop-ast (1.12.0)
|
30
30
|
parser (>= 3.0.1.1)
|
31
|
+
rubocop-minitest (0.15.2)
|
32
|
+
rubocop (>= 0.90, < 2.0)
|
33
|
+
rubocop-rake (0.6.0)
|
34
|
+
rubocop (~> 1.0)
|
31
35
|
ruby-progressbar (1.11.0)
|
32
36
|
unicode-display_width (2.1.0)
|
33
37
|
|
@@ -39,6 +43,8 @@ DEPENDENCIES
|
|
39
43
|
minitest (~> 5.0)
|
40
44
|
rake (~> 13.0)
|
41
45
|
rubocop (~> 1.7)
|
46
|
+
rubocop-minitest
|
47
|
+
rubocop-rake
|
42
48
|
|
43
49
|
BUNDLED WITH
|
44
50
|
2.2.27
|
data/README.md
CHANGED
@@ -1,11 +1,18 @@
|
|
1
1
|
# Circule
|
2
2
|
|
3
|
-
|
4
|
-
need to be able to package up your Ruby library into a gem. Put your
|
5
|
-
Ruby code in the file `lib/circule`. To experiment with that code, run
|
6
|
-
`bin/console` for an interactive prompt.
|
3
|
+
Generate an icon of overlapping circles derived from a hash.
|
7
4
|
|
8
|
-
|
5
|
+
1. Slice the hash into 16-bit slices starting at bit `bn`, stepping `s`
|
6
|
+
bits at a time, ending after bit `bn`.
|
7
|
+
|
8
|
+
2. From each slice define a circle such that bits 0 through 4 is the `x`
|
9
|
+
coordinate of the center, bits 5 through 9 is the `y` coordinate of
|
10
|
+
the center, and bits 10 through 15 is the radius of the circle.
|
11
|
+
|
12
|
+
3. Each pixel in the output will be colored based on the number of
|
13
|
+
circles that point is inside.
|
14
|
+
|
15
|
+
The [demo video](circule-demo.mp4) shows how the final image is composed.
|
9
16
|
|
10
17
|
## Installation
|
11
18
|
|
@@ -25,7 +32,33 @@ Or install it yourself as:
|
|
25
32
|
|
26
33
|
## Usage
|
27
34
|
|
28
|
-
|
35
|
+
### CLI Options
|
36
|
+
|
37
|
+
| Short Option | Long Option | Description |
|
38
|
+
|--------------|---------------|----------------------------------|
|
39
|
+
| -h HEXSTRING | --hex | Use this hash |
|
40
|
+
| -b INTEGER | --btc-block | Use hash from this bitcoin block |
|
41
|
+
| -0 INTEGER | --bit0 | Starting bit |
|
42
|
+
| -s INTEGER | --step | Step bit |
|
43
|
+
| -n INTEGER | --bitn | Starting bit |
|
44
|
+
| -c INTEGER | --canvas | Canvas size |
|
45
|
+
| -x INTEGER | --ox | Offset x |
|
46
|
+
| -y INTEGER | --oy | Offset y |
|
47
|
+
| -z INTEGER | --zoom | Zoom in GUI |
|
48
|
+
| -f FILENAME | --file | Use hash from file |
|
49
|
+
| -s FILENAME | --save | Save image to file |
|
50
|
+
| -g | --gui | Run GUI (requires glimmer & tk) |
|
51
|
+
| -i | --interactive | Run GUI with pry |
|
52
|
+
|
53
|
+
### CLI Example(s)
|
54
|
+
|
55
|
+
The icon for this project on GitLab:
|
56
|
+
```
|
57
|
+
$ echo -n circule | sha256sum
|
58
|
+
4b9ae43c4e15486ce131f733eff14547764623d27aa5d1d9aff45b67528f0b60 -
|
59
|
+
|
60
|
+
$ circule -h 4b9ae43c4e15486ce131f733eff14547764623d27aa5d1d9aff45b67528f0b60 -s /tmp/circule.png
|
61
|
+
```
|
29
62
|
|
30
63
|
## Development
|
31
64
|
|
@@ -41,7 +74,7 @@ push the `.gem` file to [rubygems.org](https://rubygems.org).
|
|
41
74
|
|
42
75
|
## Contributing
|
43
76
|
|
44
|
-
Bug reports and pull requests are welcome on
|
77
|
+
Bug reports and pull requests are welcome on GitLab at
|
45
78
|
https://gitlab.com/fjc/circule.
|
46
79
|
|
47
80
|
## License
|
data/circule-demo.mp4
ADDED
Binary file
|
data/circule.gemspec
CHANGED
@@ -8,20 +8,20 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ['Frank J. Cameron']
|
9
9
|
spec.email = ['fjc@fastmail.net']
|
10
10
|
|
11
|
-
spec.summary = ''
|
11
|
+
spec.summary = 'Generate an icon of overlapping circles derived from a hash.'
|
12
12
|
spec.homepage = 'https://gitlab.com/fjc/circule'
|
13
13
|
spec.license = 'MIT'
|
14
|
-
spec.required_ruby_version = '>= 2.
|
14
|
+
spec.required_ruby_version = '>= 2.7.0'
|
15
15
|
|
16
16
|
spec.metadata['homepage_uri'] = spec.homepage
|
17
17
|
|
18
18
|
# Specify which files should be added to the gem when it is released.
|
19
19
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
-
spec.files = Dir.chdir(File.expand_path(__dir__))
|
20
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) {
|
21
21
|
`git ls-files -z`.split("\x0").reject do |f|
|
22
22
|
(f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
23
23
|
end
|
24
|
-
|
24
|
+
}
|
25
25
|
|
26
26
|
spec.bindir = 'exe'
|
27
27
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
data/exe/circule
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'circule'
|
4
5
|
require 'optparse'
|
5
6
|
|
6
7
|
options = {}
|
7
8
|
OptionParser.new do |opts|
|
8
|
-
opts.banner = ''
|
9
|
+
opts.banner = 'Generate an icon of overlapping circles derived from a hash.'
|
9
10
|
|
10
11
|
opts.on('-h HEXSTRING', '--hex', 'Use this hash') do |h|
|
11
12
|
options[:hex] = h
|
@@ -71,7 +72,7 @@ if options[:gui]
|
|
71
72
|
gui.canvas = options[:canvas] if options[:canvas]
|
72
73
|
gui.ox = options[:ox] if options[:ox]
|
73
74
|
gui.oy = options[:oy] if options[:oy]
|
74
|
-
gui.
|
75
|
+
gui.scale = options[:zoom] if options[:zoom]
|
75
76
|
|
76
77
|
gui.open options[:file] if options[:file]
|
77
78
|
|
@@ -83,6 +84,7 @@ if options[:gui]
|
|
83
84
|
|
84
85
|
if options[:interactive]
|
85
86
|
require 'pry'
|
87
|
+
require 'trace_eval' rescue nil
|
86
88
|
Thread.new do gui.pry ensure `reset` end
|
87
89
|
end
|
88
90
|
|
@@ -92,7 +94,7 @@ else
|
|
92
94
|
when nil
|
93
95
|
when '-'
|
94
96
|
require 'digest'
|
95
|
-
options[:hex] = Digest::SHA256.hexdigest
|
97
|
+
options[:hex] = Digest::SHA256.hexdigest $stdin.read
|
96
98
|
else
|
97
99
|
require 'digest'
|
98
100
|
options[:hex] = Digest::SHA256.hexdigest File.read(options[:file])
|
@@ -113,7 +115,7 @@ else
|
|
113
115
|
case options[:save]
|
114
116
|
when nil
|
115
117
|
when '-'
|
116
|
-
circule.image.write
|
118
|
+
circule.image.write $stdout
|
117
119
|
else
|
118
120
|
circule.image.save options[:save]
|
119
121
|
end
|
data/lib/circule/gui.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative '../circule'
|
2
4
|
|
3
5
|
require 'digest'
|
@@ -10,6 +12,7 @@ rescue LoadError
|
|
10
12
|
warn "Could not find gem 'glimmer-dsl-tk' in locally installed gems."
|
11
13
|
end
|
12
14
|
|
15
|
+
# Glimmer Tk GUI for Circule
|
13
16
|
class Circule::GUI
|
14
17
|
include Glimmer
|
15
18
|
|
@@ -57,7 +60,8 @@ class Circule::GUI
|
|
57
60
|
|
58
61
|
width = image.width * @scale.to_i
|
59
62
|
height = image.height * @scale.to_i
|
60
|
-
|
63
|
+
|
64
|
+
image.resize(width, height).save(tfile.path)
|
61
65
|
|
62
66
|
@image_label.image = tfile.path
|
63
67
|
end
|
@@ -66,31 +70,33 @@ class Circule::GUI
|
|
66
70
|
@root ||= root {
|
67
71
|
title 'Circule GUI'
|
68
72
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
label { text '
|
75
|
-
spinbox { from
|
76
|
-
label { text '
|
77
|
-
spinbox { from
|
78
|
-
label { text '
|
79
|
-
spinbox { from
|
80
|
-
label { text '
|
81
|
-
spinbox { from
|
82
|
-
label { text '
|
83
|
-
spinbox { from -96; to 96; text <=> [self, :
|
84
|
-
label { text '
|
85
|
-
spinbox { from
|
73
|
+
scrollbar_frame {
|
74
|
+
xscrollbar false
|
75
|
+
|
76
|
+
entry { text <=> [self, :hex] ; grid row: 1, column: 1, column_span: 2, column_weight: 1 }
|
77
|
+
|
78
|
+
label { text 'bit0:' ; grid row: 2, column: 1, column_span: 1, column_weight: 0 }
|
79
|
+
spinbox { from 0; to 255; text <=> [self, :bit0] ; grid row: 2, column: 2, column_span: 1, column_weight: 1 }
|
80
|
+
label { text 'step:' ; grid row: 3, column: 1, column_span: 1, column_weight: 0 }
|
81
|
+
spinbox { from 4; to 64; text <=> [self, :step] ; grid row: 3, column: 2, column_span: 1, column_weight: 1 }
|
82
|
+
label { text 'bitn:' ; grid row: 4, column: 1, column_span: 1, column_weight: 0 }
|
83
|
+
spinbox { from 0; to 255; text <=> [self, :bitn] ; grid row: 4, column: 2, column_span: 1, column_weight: 1 }
|
84
|
+
label { text 'canvas:' ; grid row: 5, column: 1, column_span: 1, column_weight: 0 }
|
85
|
+
spinbox { from 24; to 96; text <=> [self, :canvas] ; grid row: 5, column: 2, column_span: 1, column_weight: 1 }
|
86
|
+
label { text 'ox:' ; grid row: 6, column: 1, column_span: 1, column_weight: 0 }
|
87
|
+
spinbox { from -96; to 96; text <=> [self, :ox] ; grid row: 6, column: 2, column_span: 1, column_weight: 1 }
|
88
|
+
label { text 'oy:' ; grid row: 7, column: 1, column_span: 1, column_weight: 0 }
|
89
|
+
spinbox { from -96; to 96; text <=> [self, :oy] ; grid row: 7, column: 2, column_span: 1, column_weight: 1 }
|
90
|
+
label { text 'scale:' ; grid row: 8, column: 1, column_span: 1, column_weight: 0 }
|
91
|
+
spinbox { from 1; to 24; text <=> [self, :scale] ; grid row: 8, column: 2, column_span: 1, column_weight: 1 }
|
86
92
|
|
87
93
|
frame {
|
88
|
-
@image_label = label { anchor 'center' }
|
94
|
+
@image_label = label { anchor 'center' } ; grid row: 9, column: 1, column_span: 2, column_weight: 1
|
89
95
|
}
|
90
96
|
|
91
|
-
button { text 'Open'; command { open } }
|
92
|
-
button { text 'Save'; command { save } }
|
93
|
-
button { text 'Exit'; command { exit(0) } }
|
97
|
+
button { text 'Open'; command { open } ; grid row: 10, column: 1, column_span: 2, column_weight: 1 }
|
98
|
+
button { text 'Save'; command { save } ; grid row: 11, column: 1, column_span: 2, column_weight: 1 }
|
99
|
+
button { text 'Exit'; command { exit(0) } ; grid row: 12, column: 1, column_span: 2, column_weight: 1 }
|
94
100
|
}
|
95
101
|
}
|
96
102
|
end
|
data/lib/circule/version.rb
CHANGED
data/lib/circule.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: circule
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frank J. Cameron
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chunky_png
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
description:
|
27
|
+
description:
|
28
28
|
email:
|
29
29
|
- fjc@fastmail.net
|
30
30
|
executables:
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- Rakefile
|
42
42
|
- bin/console
|
43
43
|
- bin/setup
|
44
|
+
- circule-demo.mp4
|
44
45
|
- circule.gemspec
|
45
46
|
- exe/circule
|
46
47
|
- lib/circule.rb
|
@@ -51,7 +52,7 @@ licenses:
|
|
51
52
|
- MIT
|
52
53
|
metadata:
|
53
54
|
homepage_uri: https://gitlab.com/fjc/circule
|
54
|
-
post_install_message:
|
55
|
+
post_install_message:
|
55
56
|
rdoc_options: []
|
56
57
|
require_paths:
|
57
58
|
- lib
|
@@ -59,15 +60,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
59
60
|
requirements:
|
60
61
|
- - ">="
|
61
62
|
- !ruby/object:Gem::Version
|
62
|
-
version: 2.
|
63
|
+
version: 2.7.0
|
63
64
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
65
|
requirements:
|
65
66
|
- - ">="
|
66
67
|
- !ruby/object:Gem::Version
|
67
68
|
version: '0'
|
68
69
|
requirements: []
|
69
|
-
rubygems_version: 3.
|
70
|
-
signing_key:
|
70
|
+
rubygems_version: 3.2.5
|
71
|
+
signing_key:
|
71
72
|
specification_version: 4
|
72
|
-
summary:
|
73
|
+
summary: Generate an icon of overlapping circles derived from a hash.
|
73
74
|
test_files: []
|