invisible_ink 0.1.0 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 07c86e1e6ef511722eedcaa46277efa7967337e9261fc69c5bbf3038029fef88
4
- data.tar.gz: 857ee8d11d96e89b1e27bd605c790d7a425934a0d3bed5b655890b5f81d3f7b3
3
+ metadata.gz: 8bd2253b21ddd6d79d6b1e604bcb55779c9293edad45856b09378dbecff481b0
4
+ data.tar.gz: b7e00aa59ddcba71d5e21752f2218db99cb8e93f2ec6832996c79300898675b1
5
5
  SHA512:
6
- metadata.gz: a6ffcca4b895c8976506e457bf08d2616006a96656cb3fdfd01ad027f1e6a9d5866bda71af84675bd821234b5fe2466b402dbdebe6f9943d28547750147e8db6
7
- data.tar.gz: 99edfecf2b9b5abde8c16c75552a5147786029ae41076cf66e2b704ee9d2098a088bf3d14a4f11735b3ad05b7fa50ca39c168d252fbfcc106b86c672aa18a839
6
+ metadata.gz: f11b44a64326320264eeb2f6b5114acddcf46b53fe4a97edf0fd5dea35f38c91d05fe016f788e83e5e8258bcbc84b056f9839b1bfbd1b2eb027f32aebca4f477
7
+ data.tar.gz: a794693278351dbd89c280c0c6013f2f11e4d1e6cc78d96911b4a128e1cc498221aefd357b71f8f20f6002df16677bb73d3a2b019f9e75521ec44bedc0fb4f75
data/.docs/demo.gif ADDED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,4 +1,6 @@
1
- ## [Unreleased]
1
+ ## [0.2.0 - 2023-03-19]
2
+
3
+ - Proof of concept
2
4
 
3
5
  ## [0.1.0] - 2023-03-14
4
6
 
data/Gemfile CHANGED
@@ -4,6 +4,7 @@ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
+ gem "activesupport", "~> 7.0"
7
8
  gem "rake", "~> 13.0"
8
9
  gem "rspec", "~> 3.0"
9
10
  gem "standard", "~> 1.3"
data/Gemfile.lock CHANGED
@@ -1,15 +1,25 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- invisible_ink (0.1.0)
4
+ invisible_ink (0.2.0)
5
+ activesupport (~> 7.0)
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
8
9
  specs:
10
+ activesupport (7.0.4.3)
11
+ concurrent-ruby (~> 1.0, >= 1.0.2)
12
+ i18n (>= 1.6, < 2)
13
+ minitest (>= 5.1)
14
+ tzinfo (~> 2.0)
9
15
  ast (2.4.2)
16
+ concurrent-ruby (1.2.2)
10
17
  diff-lcs (1.5.0)
18
+ i18n (1.12.0)
19
+ concurrent-ruby (~> 1.0)
11
20
  json (2.6.3)
12
21
  language_server-protocol (3.17.0.3)
22
+ minitest (5.18.0)
13
23
  parallel (1.22.1)
14
24
  parser (3.2.1.1)
15
25
  ast (~> 2.4.1)
@@ -50,6 +60,8 @@ GEM
50
60
  language_server-protocol (~> 3.17.0.2)
51
61
  rubocop (= 1.44.1)
52
62
  rubocop-performance (= 1.15.2)
63
+ tzinfo (2.0.6)
64
+ concurrent-ruby (~> 1.0)
53
65
  unicode-display_width (2.4.2)
54
66
 
55
67
  PLATFORMS
@@ -57,6 +69,7 @@ PLATFORMS
57
69
  x86_64-linux
58
70
 
59
71
  DEPENDENCIES
72
+ activesupport (~> 7.0)
60
73
  invisible_ink!
61
74
  rake (~> 13.0)
62
75
  rspec (~> 3.0)
data/README.md CHANGED
@@ -1,9 +1,13 @@
1
- # đŸĒ„ Invisible Ink
1
+ # 🔏 Invisible Ink
2
2
 
3
3
  Encrypt text files in your open source projects so that they can be committed to
4
4
  your repository without exposing sensitive information.
5
5
 
6
- ## Installation
6
+ ## 📸 Demo
7
+
8
+ ![A demo showing how to use the Gem](.docs/demo.gif)
9
+
10
+ ## ✅ Installation
7
11
 
8
12
  Install the gem and add to the application's Gemfile by executing:
9
13
 
@@ -13,11 +17,29 @@ If bundler is not being used to manage dependencies, install the gem by executin
13
17
 
14
18
  $ gem install invisible_ink
15
19
 
16
- ## Usage
17
20
 
18
- TODO: Write usage instructions here
21
+ ## â„šī¸ Usage
22
+
23
+ Once installed in your project's `Gemfile`, run `bundle exec invisible_ink
24
+ --setup` to create an encryption key saved to `invisible_ink.key`. This will
25
+ also update your `.gitignore` file to ensure the key is not saved to version
26
+ control.
27
+
28
+ Alternatively, you can set `ENV["INVISIBLE_INK_KEY"]` to the value of a 32
29
+ character hash.
30
+
31
+ ### âŒ¨ī¸ Commands
32
+
33
+ ```text
34
+ Usage: invisible_ink COMMAND [options]
35
+ -w, --write FILE Encrypt a file using an encryption key and open it in the specified $EDITOR
36
+ -r, --read FILE Decrypt and display the content of an encrypted file
37
+ -s, --setup Generate an encryption key, save it to a file, and add it to .gitignore
38
+ -h, --help Display help message
39
+ -v, --version Display Gem version
40
+ ```
19
41
 
20
- ## Development
42
+ ## 🔨 Development
21
43
 
22
44
  After checking out the repo, run `bin/setup` to install dependencies. Then, run
23
45
  `rake spec` to run the tests. You can also run `bin/console` for an interactive
@@ -29,7 +51,7 @@ release a new version, update the version number in `version.rb`, and then run
29
51
  git commits and the created tag, and push the `.gem` file to
30
52
  [rubygems.org](https://rubygems.org).
31
53
 
32
- ## Contributing
54
+ ## 🙏 Contributing
33
55
 
34
56
  Bug reports and pull requests are welcome on GitHub at
35
57
  https://github.com/stevepolitodesign/invisible_ink. This project is intended to be a
@@ -37,12 +59,12 @@ safe, welcoming space for collaboration, and contributors are expected to adhere
37
59
  to the [code of
38
60
  conduct](https://github.com/stevepolitodesign/invisible_ink/blob/main/CODE_OF_CONDUCT.md).
39
61
 
40
- ## License
62
+ ## 📜 License
41
63
 
42
64
  The gem is available as open source under the terms of the [MIT
43
65
  License](https://opensource.org/licenses/MIT).
44
66
 
45
- ## Code of Conduct
67
+ ## â¤ī¸ Code of Conduct
46
68
 
47
69
  Everyone interacting in the InvisibleInk project's codebases, issue trackers,
48
70
  chat rooms and mailing lists is expected to follow the [code of
data/exe/invisible_ink ADDED
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "../lib/invisible_ink"
3
+ require "optparse"
4
+
5
+ options = {}
6
+
7
+ begin
8
+ OptionParser.new do |opts|
9
+ opts.banner = "Usage: invisible_ink COMMAND [options]"
10
+
11
+ opts.on("-w", "--write FILE", String, "Encrypt a file using an encryption key and open it in the specified $EDITOR") do |file|
12
+ options[:command] = "write"
13
+ options[:file] = file
14
+ end
15
+
16
+ opts.on("-r", "--read FILE", String, "Decrypt and display the content of an encrypted file") do |file|
17
+ options[:command] = "read"
18
+ options[:file] = file
19
+ end
20
+
21
+ opts.on("-s", "--setup", "Generate an encryption key, save it to a file, and add it to .gitignore") do
22
+ options[:command] = "setup"
23
+ end
24
+
25
+ opts.on("-h", "--help", "Display help message") do
26
+ puts opts
27
+ exit
28
+ end
29
+
30
+ opts.on("-v", "--version", "Display Gem version") do
31
+ puts InvisibleInk::VERSION
32
+ exit
33
+ end
34
+ end.parse!
35
+ rescue OptionParser::MissingArgument => e
36
+ puts "ERROR: #{e.message}. The #{e.args.first} command requires a file argument."
37
+ puts ""
38
+ puts "EXAMPLE: invisible_ink #{e.args.first} path/to/file.txt"
39
+ exit 1
40
+ end
41
+
42
+ if options[:command].nil?
43
+ puts "Invalid command. Run 'invisible_ink --help' for a list of available commands."
44
+ exit 1
45
+ end
46
+
47
+ def build_encrypted_file(file_path)
48
+ ActiveSupport::EncryptedFile.new(
49
+ content_path: file_path,
50
+ key_path: "invisible_ink.key",
51
+ env_key: "INVISIBLE_INK_KEY",
52
+ raise_if_missing_key: true
53
+ )
54
+ end
55
+
56
+ def handle_missing_key_error(error)
57
+ puts "ERROR: #{error}"
58
+ puts ""
59
+ puts "Did you run 'invisible_ink setup'?"
60
+ end
61
+
62
+ case options[:command]
63
+ when "write"
64
+ file_path = options[:file]
65
+ if ENV["EDITOR"].to_s.empty?
66
+ puts "No $EDITOR to open file in. Assign one like this:"
67
+ puts ""
68
+ puts %(EDITOR="mate --wait" exe/invisible_ink write #{file_path})
69
+ puts ""
70
+ puts "For editors that fork and exit immediately, it's important to pass a wait flag;"
71
+ puts "otherwise, the file will be saved immediately with no chance to edit."
72
+ exit 1
73
+ end
74
+ begin
75
+ dir_path = File.dirname(file_path)
76
+ FileUtils.mkdir_p(dir_path)
77
+
78
+ encrypted_file = build_encrypted_file(file_path)
79
+ encrypted_file.write(nil) unless File.exist?(file_path)
80
+
81
+ encrypted_file.change do |tmp_path|
82
+ system(*Shellwords.split(ENV["EDITOR"]), tmp_path.to_s)
83
+ rescue Interrupt
84
+ puts "File not saved"
85
+ end
86
+ rescue ActiveSupport::EncryptedFile::MissingKeyError => error
87
+ handle_missing_key_error(error)
88
+ exit 1
89
+ end
90
+ when "read"
91
+ begin
92
+ encrypted_file = build_encrypted_file(options[:file])
93
+ puts encrypted_file.read
94
+ rescue ActiveSupport::EncryptedFile::MissingKeyError => error
95
+ handle_missing_key_error(error)
96
+ exit 1
97
+ end
98
+ when "setup"
99
+ if File.exist?("invisible_ink.key")
100
+ puts "ERROR: invisible_ink.key already exists"
101
+ exit 1
102
+ else
103
+ ignore_key = if File.exist?(".gitignore") && !File.read(".gitignore").empty?
104
+ "\ninvisible_ink.key"
105
+ else
106
+ "invisible_ink.key"
107
+ end
108
+ File.open(".gitignore", "a") { |file| file.puts(ignore_key) }
109
+ key = ActiveSupport::EncryptedFile.generate_key
110
+ File.write("invisible_ink.key", key)
111
+ puts "invisible_ink.key generated"
112
+ end
113
+ end
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ["lib"]
31
31
 
32
32
  # Uncomment to register a new dependency of your gem
33
- # spec.add_dependency "example-gem", "~> 1.0"
33
+ spec.add_dependency "activesupport", "~> 7.0"
34
34
 
35
35
  # For more information and examples about making a new gem, check out our
36
36
  # guide at: https://bundler.io/guides/creating_gem.html
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module InvisibleInk
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/invisible_ink.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "invisible_ink/version"
4
+ require "active_support/encrypted_file"
5
+ require "securerandom"
6
+ require "shellwords"
4
7
 
5
8
  module InvisibleInk
6
9
  class Error < StandardError; end
metadata CHANGED
@@ -1,23 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: invisible_ink
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Polito
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-14 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2023-03-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '7.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '7.0'
13
27
  description: Encrypt text files in your open source projects so that they can be committed
14
28
  to your repository without exposing sensitive information.
15
29
  email:
16
30
  - stevepolito@hey.com
17
- executables: []
31
+ executables:
32
+ - invisible_ink
18
33
  extensions: []
19
34
  extra_rdoc_files: []
20
35
  files:
36
+ - ".docs/demo.gif"
21
37
  - ".rspec"
22
38
  - ".standard.yml"
23
39
  - CHANGELOG.md
@@ -27,6 +43,7 @@ files:
27
43
  - LICENSE.txt
28
44
  - README.md
29
45
  - Rakefile
46
+ - exe/invisible_ink
30
47
  - invisible_ink.gemspec
31
48
  - lib/invisible_ink.rb
32
49
  - lib/invisible_ink/version.rb