arkana 1.4.0 → 1.6.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 +4 -4
- data/lib/arkana/config_parser.rb +1 -0
- data/lib/arkana/helpers/swift_template_helper.rb +7 -7
- data/lib/arkana/models/arguments.rb +6 -0
- data/lib/arkana/models/config.rb +10 -0
- data/lib/arkana/models/template_arguments.rb +2 -0
- data/lib/arkana/models/type.rb +10 -6
- data/lib/arkana/templates/arkana.swift.erb +7 -0
- data/lib/arkana/templates/arkana_tests.swift.erb +42 -0
- data/lib/arkana/version.rb +1 -1
- data/lib/arkana.rb +6 -5
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f589f9e9d3ccd550915af3bb90a46717e385e5e7691d1a92a69da3352f187eb
|
4
|
+
data.tar.gz: 4871dcda8ae09e6c39d2d94ec0bad3798cdb6b9dec6a1b50e4b7fc6e97231980
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dbf5f95c13a18d75f82c0598818e0e4b580e10cdbdf9a10c283c6151a7c1b94b21cd740f849dcf70351ace776a50741c320d22871ab1bda086a29136e715c52
|
7
|
+
data.tar.gz: 42ac12f877d80cc5f6e858db44fb78106e260fd1775e43bd7e3c82b8bea1206acb9ab174c4e00249d57c2990b0225593ea81bf7790a2b661171025a2f6c2b92e
|
data/lib/arkana/config_parser.rb
CHANGED
@@ -12,6 +12,7 @@ module ConfigParser
|
|
12
12
|
def self.parse(arguments)
|
13
13
|
yaml = YAML.load_file(arguments.config_filepath)
|
14
14
|
config = Config.new(yaml)
|
15
|
+
config.include_environments(arguments.include_environments)
|
15
16
|
config.current_flavor = arguments.flavor
|
16
17
|
config.dotenv_filepath = arguments.dotenv_filepath
|
17
18
|
UI.warn("Dotenv file was specified but couldn't be found at '#{config.dotenv_filepath}'") if config.dotenv_filepath && !File.exist?(config.dotenv_filepath)
|
@@ -4,18 +4,18 @@
|
|
4
4
|
module SwiftTemplateHelper
|
5
5
|
def self.swift_type(type)
|
6
6
|
case type
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
when :string then "String"
|
8
|
+
when :boolean then "Bool"
|
9
|
+
when :integer then "Int"
|
10
|
+
else raise "Unknown variable type '#{type}' received.'"
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.protocol_getter(declaration_strategy)
|
15
15
|
case declaration_strategy
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
when "lazy var" then "mutating get"
|
17
|
+
when "var", "let" then "get"
|
18
|
+
else raise "Unknown declaration strategy '#{declaration_strategy}' received.'"
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -10,12 +10,15 @@ class Arguments
|
|
10
10
|
attr_reader :dotenv_filepath
|
11
11
|
# @returns [string]
|
12
12
|
attr_reader :flavor
|
13
|
+
# @returns [Array<string>]
|
14
|
+
attr_reader :include_environments
|
13
15
|
|
14
16
|
def initialize
|
15
17
|
# Default values
|
16
18
|
@config_filepath = ".arkana.yml"
|
17
19
|
@dotenv_filepath = ".env" if File.exist?(".env")
|
18
20
|
@flavor = nil
|
21
|
+
@include_environments = nil
|
19
22
|
|
20
23
|
OptionParser.new do |opt|
|
21
24
|
opt.on("-c", "--config-filepath /path/to/your/.arkana.yml", "Path to your config file. Defaults to '.arkana.yml'") do |o|
|
@@ -27,6 +30,9 @@ class Arguments
|
|
27
30
|
opt.on("-f", "--flavor FrostedFlakes", "Flavors are useful, for instance, when generating secrets for white-label projects. See the README for more information") do |o|
|
28
31
|
@flavor = o
|
29
32
|
end
|
33
|
+
opt.on("-i", "--include-environments debug,release", "Optionally pass the environments that you want Arkana to generate secrets for. Useful if you only want to build a certain environment, e.g. just Debug in local machines, while only building Staging and Release in CI. Separate the keys using a comma, without spaces. When ommitted, Arkana generate secrets for all environments.") do |o|
|
34
|
+
@include_environments = o.split(",")
|
35
|
+
end
|
30
36
|
end.parse!
|
31
37
|
end
|
32
38
|
end
|
data/lib/arkana/models/config.rb
CHANGED
@@ -24,6 +24,8 @@ class Config
|
|
24
24
|
attr_reader :should_generate_unit_tests
|
25
25
|
# @returns [string]
|
26
26
|
attr_reader :package_manager
|
27
|
+
# @returns [boolean]
|
28
|
+
attr_reader :should_cocoapods_cross_import_modules
|
27
29
|
|
28
30
|
# @returns [string]
|
29
31
|
attr_accessor :current_flavor
|
@@ -45,6 +47,8 @@ class Config
|
|
45
47
|
@should_generate_unit_tests = yaml["should_generate_unit_tests"]
|
46
48
|
@should_generate_unit_tests = true if @should_generate_unit_tests.nil?
|
47
49
|
@package_manager = yaml["package_manager"] || "spm"
|
50
|
+
@should_cocoapods_cross_import_modules = yaml["should_cocoapods_cross_import_modules"]
|
51
|
+
@should_cocoapods_cross_import_modules = true if @should_cocoapods_cross_import_modules.nil?
|
48
52
|
end
|
49
53
|
# rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
50
54
|
|
@@ -59,4 +63,10 @@ class Config
|
|
59
63
|
def all_keys
|
60
64
|
global_secrets + environment_keys
|
61
65
|
end
|
66
|
+
|
67
|
+
def include_environments(environments)
|
68
|
+
return unless environments
|
69
|
+
|
70
|
+
@environments = @environments.select { |e| environments.map(&:downcase).include?(e.downcase) }
|
71
|
+
end
|
62
72
|
end
|
@@ -24,6 +24,8 @@ class TemplateArguments
|
|
24
24
|
@swift_declaration_strategy = config.swift_declaration_strategy
|
25
25
|
# Whether unit tests should be generated.
|
26
26
|
@should_generate_unit_tests = config.should_generate_unit_tests
|
27
|
+
# Whether cocoapods modules should cross import.
|
28
|
+
@should_cocoapods_cross_import_modules = config.should_cocoapods_cross_import_modules
|
27
29
|
end
|
28
30
|
|
29
31
|
def environment_protocol_secrets(environment)
|
data/lib/arkana/models/type.rb
CHANGED
@@ -8,12 +8,16 @@ module Type
|
|
8
8
|
|
9
9
|
def self.new(string_value:)
|
10
10
|
case string_value
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
when "true", "false"
|
12
|
+
BOOLEAN
|
13
|
+
when /^\d+$/
|
14
|
+
# Handles cases like "0001" which should be interpreted as strings
|
15
|
+
return STRING if string_value.to_i.to_s != string_value
|
16
|
+
# Handle int overflow
|
17
|
+
return STRING if string_value.to_i > (2**31) - 1
|
18
|
+
INTEGER
|
19
|
+
else
|
20
|
+
STRING
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
@@ -5,7 +5,14 @@
|
|
5
5
|
// Automatically generated by Arkana (https://github.com/rogerluan/arkana)
|
6
6
|
|
7
7
|
import Foundation
|
8
|
+
<% if !@should_cocoapods_cross_import_modules %>
|
9
|
+
#if COCOAPODS
|
10
|
+
#else
|
11
|
+
<% end %>
|
8
12
|
import <%= @import_name %>Interfaces
|
13
|
+
<% if !@should_cocoapods_cross_import_modules %>
|
14
|
+
#endif
|
15
|
+
<% end %>
|
9
16
|
|
10
17
|
public enum <%= @namespace %> {
|
11
18
|
@inline(__always)
|
@@ -86,6 +86,46 @@ final class <%= @namespace %>Tests: XCTestCase {
|
|
86
86
|
XCTAssertEqual(<%= @namespace %>.decode(encoded: encoded, cipher: salt), 42)
|
87
87
|
}
|
88
88
|
|
89
|
+
func test_decodeIntValueWithLeadingZeroes_shouldDecodeAsString() {
|
90
|
+
<% int_with_leading_zeroes_key = "0001" %>
|
91
|
+
<% secret = generate_test_secret(key: int_with_leading_zeroes_key) %>
|
92
|
+
let encoded: [UInt8] = [
|
93
|
+
<%= secret.encoded_value %>
|
94
|
+
|
95
|
+
]
|
96
|
+
XCTAssertEqual(<%= @namespace %>.decode(encoded: encoded, cipher: salt), "0001")
|
97
|
+
}
|
98
|
+
|
99
|
+
func test_decodeMassiveIntValue_shouldDecodeAsString() {
|
100
|
+
<% int_with_massive_number_key = "92233720368547758079223372036854775807" %>
|
101
|
+
<% secret = generate_test_secret(key: int_with_massive_number_key) %>
|
102
|
+
let encoded: [UInt8] = [
|
103
|
+
<%= secret.encoded_value %>
|
104
|
+
|
105
|
+
]
|
106
|
+
XCTAssertEqual(<%= @namespace %>.decode(encoded: encoded, cipher: salt), "92233720368547758079223372036854775807")
|
107
|
+
}
|
108
|
+
|
109
|
+
func test_decodeNegativeIntValue_shouldDecodeAsString() {
|
110
|
+
<% negative_int_key = "-42" %>
|
111
|
+
<% secret = generate_test_secret(key: negative_int_key) %>
|
112
|
+
let encoded: [UInt8] = [
|
113
|
+
<%= secret.encoded_value %>
|
114
|
+
|
115
|
+
]
|
116
|
+
XCTAssertEqual(<%= @namespace %>.decode(encoded: encoded, cipher: salt), "-42")
|
117
|
+
}
|
118
|
+
|
119
|
+
func test_decodeFloatingPointValue_shouldDecodeAsString() {
|
120
|
+
<% float_key = "3.14" %>
|
121
|
+
<% secret = generate_test_secret(key: float_key) %>
|
122
|
+
let encoded: [UInt8] = [
|
123
|
+
<%= secret.encoded_value %>
|
124
|
+
|
125
|
+
]
|
126
|
+
XCTAssertEqual(<%= @namespace %>.decode(encoded: encoded, cipher: salt), "3.14")
|
127
|
+
}
|
128
|
+
|
89
129
|
func test_encodeAndDecodeValueWithDollarSign_shouldDecode() {
|
90
130
|
<% dollar_sign_key = "real_$lim_shady" %>
|
91
131
|
<% secret = generate_test_secret(key: dollar_sign_key) %>
|
@@ -95,6 +135,7 @@ final class <%= @namespace %>Tests: XCTestCase {
|
|
95
135
|
]
|
96
136
|
XCTAssertEqual(<%= @namespace %>.decode(encoded: encoded, cipher: salt), "real_$lim_shady")
|
97
137
|
}
|
138
|
+
<% if ENV["ARKANA_RUNNING_CI_INTEGRATION_TESTS"] %>
|
98
139
|
|
99
140
|
func test_decodeEnvVarFromDotfile_withDollarSign__andEscaped_andNoQuotes_shouldDecode() {
|
100
141
|
XCTAssertEqual(globalSecrets.secretWithDollarSignEscapedAndAndNoQuotesKey, "real_$lim_shady")
|
@@ -119,4 +160,5 @@ final class <%= @namespace %>Tests: XCTestCase {
|
|
119
160
|
func test_decodeEnvVarFromDotfile_withWeirdCharacters_shouldDecode() {
|
120
161
|
XCTAssertEqual(globalSecrets.secretWithWeirdCharactersKey, "` ~ ! @ # % ^ & * ( ) _ - + = { [ } } | : ; ' < , > . ? /")
|
121
162
|
}
|
163
|
+
<% end %>
|
122
164
|
}
|
data/lib/arkana/version.rb
CHANGED
data/lib/arkana.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require_relative "arkana/config_parser"
|
4
4
|
require_relative "arkana/encoder"
|
5
5
|
require_relative "arkana/helpers/dotenv_helper"
|
6
|
+
require_relative "arkana/helpers/ui"
|
6
7
|
require_relative "arkana/models/template_arguments"
|
7
8
|
require_relative "arkana/salt_generator"
|
8
9
|
require_relative "arkana/swift_code_generator"
|
@@ -30,11 +31,11 @@ module Arkana
|
|
30
31
|
)
|
31
32
|
rescue StandardError => e
|
32
33
|
# TODO: Improve this by creating an Env/Debug helper
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
UI.warn("Something went wrong when parsing and encoding your secrets.")
|
35
|
+
UI.warn("Current Flavor: #{config.current_flavor}")
|
36
|
+
UI.warn("Dotenv Filepath: #{config.dotenv_filepath}")
|
37
|
+
UI.warn("Config Filepath: #{arguments.config_filepath}")
|
38
|
+
UI.crash(e.message)
|
38
39
|
end
|
39
40
|
template_arguments = TemplateArguments.new(
|
40
41
|
environment_secrets: environment_secrets,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arkana
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roger Oba
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dotenv
|
@@ -105,14 +105,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
105
105
|
requirements:
|
106
106
|
- - ">="
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
-
version: 2.
|
108
|
+
version: '2.7'
|
109
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
110
|
requirements:
|
111
111
|
- - ">="
|
112
112
|
- !ruby/object:Gem::Version
|
113
113
|
version: '0'
|
114
114
|
requirements: []
|
115
|
-
rubygems_version: 3.
|
115
|
+
rubygems_version: 3.4.10
|
116
116
|
signing_key:
|
117
117
|
specification_version: 4
|
118
118
|
summary: Store your keys and secrets away from your source code. Designed for Android
|