opdotenv 1.0.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 +7 -0
- data/CHANGELOG.md +15 -0
- data/LICENSE.md +23 -0
- data/README.md +333 -0
- data/bin/opdotenv +44 -0
- data/lib/opdotenv/anyway_loader.rb +125 -0
- data/lib/opdotenv/client_factory.rb +17 -0
- data/lib/opdotenv/connect_api_client.rb +290 -0
- data/lib/opdotenv/exporter.rb +59 -0
- data/lib/opdotenv/format_inferrer.rb +22 -0
- data/lib/opdotenv/loader.rb +72 -0
- data/lib/opdotenv/op_client.rb +94 -0
- data/lib/opdotenv/parsers/dotenv_parser.rb +28 -0
- data/lib/opdotenv/parsers/json_parser.rb +28 -0
- data/lib/opdotenv/parsers/yaml_parser.rb +15 -0
- data/lib/opdotenv/railtie.rb +55 -0
- data/lib/opdotenv/source_parser.rb +71 -0
- data/lib/opdotenv/version.rb +3 -0
- data/lib/opdotenv.rb +19 -0
- metadata +224 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module Opdotenv
|
|
2
|
+
# Parser for simplified source strings
|
|
3
|
+
# Infers field_name and field_type from the path pattern
|
|
4
|
+
module SourceParser
|
|
5
|
+
NOTES_PLAIN_FIELD = "notesPlain"
|
|
6
|
+
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
# Parse a source string or hash into normalized format
|
|
10
|
+
#
|
|
11
|
+
# @param source [String, Hash] Source string (e.g., "op://Vault/Item") or hash for backward compatibility
|
|
12
|
+
# @return [Hash] Normalized source with :path, :field_name, and :field_type keys
|
|
13
|
+
def parse(source)
|
|
14
|
+
# Handle hash format for backward compatibility
|
|
15
|
+
return normalize_hash(source) if source.is_a?(Hash)
|
|
16
|
+
|
|
17
|
+
# Handle string format
|
|
18
|
+
raise ArgumentError, "Source must start with 'op://'" unless source.to_s.start_with?("op://")
|
|
19
|
+
|
|
20
|
+
path = source.to_s
|
|
21
|
+
_, item = parse_op_path(path)
|
|
22
|
+
|
|
23
|
+
# Extract item name and potential field name
|
|
24
|
+
# Handle paths like "op://Vault/Item" or "op://Vault/Item Name/field"
|
|
25
|
+
item_parts = item.split("/")
|
|
26
|
+
item_name = item_parts.first
|
|
27
|
+
field_name = (item_parts.length > 1) ? item_parts[1] : nil
|
|
28
|
+
|
|
29
|
+
# First check if field name is provided with extension in the path
|
|
30
|
+
if field_name
|
|
31
|
+
field_type = FormatInferrer.infer_from_name(field_name)
|
|
32
|
+
{path: path, field_name: field_name, field_type: field_type}
|
|
33
|
+
# If no field name in path, infer from item name patterns
|
|
34
|
+
elsif (field_type = FormatInferrer.infer_from_name(item_name))
|
|
35
|
+
{path: path, field_name: NOTES_PLAIN_FIELD, field_type: field_type}
|
|
36
|
+
else
|
|
37
|
+
# All other items: load all fields without parsing
|
|
38
|
+
{path: path, field_name: nil, field_type: nil}
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Parse op:// path to extract vault and item
|
|
43
|
+
#
|
|
44
|
+
# @param path [String] Path like "op://Vault/Item" or "op://Vault/Item/Field"
|
|
45
|
+
# @return [Array<String>] [vault, item] tuple
|
|
46
|
+
def parse_op_path(path)
|
|
47
|
+
m = path.match(/\Aop:\/\/([^\/]+)\/(.+)/)
|
|
48
|
+
raise ArgumentError, "Invalid op path: #{path}" unless m
|
|
49
|
+
[m[1], m[2]]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Normalize hash format for backward compatibility
|
|
53
|
+
#
|
|
54
|
+
# @param source [Hash] Source hash with :path, :field_name, :field_type keys
|
|
55
|
+
# @return [Hash] Normalized source
|
|
56
|
+
def normalize_hash(source)
|
|
57
|
+
{
|
|
58
|
+
path: source[:path] || source["path"],
|
|
59
|
+
field_name: source[:field_name] || source["field_name"],
|
|
60
|
+
field_type: (source[:field_type] || source["field_type"])&.to_sym,
|
|
61
|
+
overwrite: if source.key?(:overwrite)
|
|
62
|
+
source[:overwrite]
|
|
63
|
+
else
|
|
64
|
+
(source.key?("overwrite") ? source["overwrite"] : nil)
|
|
65
|
+
end
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
module_function :normalize_hash
|
|
70
|
+
end
|
|
71
|
+
end
|
data/lib/opdotenv.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
require "yaml"
|
|
3
|
+
require "shellwords"
|
|
4
|
+
|
|
5
|
+
require_relative "opdotenv/version"
|
|
6
|
+
require_relative "opdotenv/format_inferrer"
|
|
7
|
+
require_relative "opdotenv/op_client"
|
|
8
|
+
require_relative "opdotenv/connect_api_client"
|
|
9
|
+
require_relative "opdotenv/client_factory"
|
|
10
|
+
require_relative "opdotenv/parsers/dotenv_parser"
|
|
11
|
+
require_relative "opdotenv/parsers/json_parser"
|
|
12
|
+
require_relative "opdotenv/parsers/yaml_parser"
|
|
13
|
+
require_relative "opdotenv/source_parser"
|
|
14
|
+
require_relative "opdotenv/loader"
|
|
15
|
+
require_relative "opdotenv/exporter"
|
|
16
|
+
require_relative "opdotenv/anyway_loader" if defined?(Anyway)
|
|
17
|
+
|
|
18
|
+
# Ensure Railtie is loaded so Rails auto-discovers it
|
|
19
|
+
require_relative "opdotenv/railtie" if defined?(Rails)
|
metadata
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: opdotenv
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- amkisko
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: railties
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '6.0'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '9.0'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - ">="
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '6.0'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '9.0'
|
|
32
|
+
- !ruby/object:Gem::Dependency
|
|
33
|
+
name: rake
|
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
|
35
|
+
requirements:
|
|
36
|
+
- - "~>"
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: '13.0'
|
|
39
|
+
type: :development
|
|
40
|
+
prerelease: false
|
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
42
|
+
requirements:
|
|
43
|
+
- - "~>"
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: '13.0'
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: rspec
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
requirements:
|
|
50
|
+
- - "~>"
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: '3.12'
|
|
53
|
+
type: :development
|
|
54
|
+
prerelease: false
|
|
55
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '3.12'
|
|
60
|
+
- !ruby/object:Gem::Dependency
|
|
61
|
+
name: simplecov
|
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - "~>"
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '0.21'
|
|
67
|
+
type: :development
|
|
68
|
+
prerelease: false
|
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
70
|
+
requirements:
|
|
71
|
+
- - "~>"
|
|
72
|
+
- !ruby/object:Gem::Version
|
|
73
|
+
version: '0.21'
|
|
74
|
+
- !ruby/object:Gem::Dependency
|
|
75
|
+
name: rspec_junit_formatter
|
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
|
77
|
+
requirements:
|
|
78
|
+
- - "~>"
|
|
79
|
+
- !ruby/object:Gem::Version
|
|
80
|
+
version: '0.6'
|
|
81
|
+
type: :development
|
|
82
|
+
prerelease: false
|
|
83
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
84
|
+
requirements:
|
|
85
|
+
- - "~>"
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
version: '0.6'
|
|
88
|
+
- !ruby/object:Gem::Dependency
|
|
89
|
+
name: simplecov-cobertura
|
|
90
|
+
requirement: !ruby/object:Gem::Requirement
|
|
91
|
+
requirements:
|
|
92
|
+
- - "~>"
|
|
93
|
+
- !ruby/object:Gem::Version
|
|
94
|
+
version: '3'
|
|
95
|
+
type: :development
|
|
96
|
+
prerelease: false
|
|
97
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
98
|
+
requirements:
|
|
99
|
+
- - "~>"
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
version: '3'
|
|
102
|
+
- !ruby/object:Gem::Dependency
|
|
103
|
+
name: standard
|
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
|
105
|
+
requirements:
|
|
106
|
+
- - "~>"
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
version: '1.0'
|
|
109
|
+
type: :development
|
|
110
|
+
prerelease: false
|
|
111
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
112
|
+
requirements:
|
|
113
|
+
- - "~>"
|
|
114
|
+
- !ruby/object:Gem::Version
|
|
115
|
+
version: '1.0'
|
|
116
|
+
- !ruby/object:Gem::Dependency
|
|
117
|
+
name: appraisal
|
|
118
|
+
requirement: !ruby/object:Gem::Requirement
|
|
119
|
+
requirements:
|
|
120
|
+
- - "~>"
|
|
121
|
+
- !ruby/object:Gem::Version
|
|
122
|
+
version: '2.4'
|
|
123
|
+
type: :development
|
|
124
|
+
prerelease: false
|
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
126
|
+
requirements:
|
|
127
|
+
- - "~>"
|
|
128
|
+
- !ruby/object:Gem::Version
|
|
129
|
+
version: '2.4'
|
|
130
|
+
- !ruby/object:Gem::Dependency
|
|
131
|
+
name: webmock
|
|
132
|
+
requirement: !ruby/object:Gem::Requirement
|
|
133
|
+
requirements:
|
|
134
|
+
- - "~>"
|
|
135
|
+
- !ruby/object:Gem::Version
|
|
136
|
+
version: '3'
|
|
137
|
+
type: :development
|
|
138
|
+
prerelease: false
|
|
139
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
140
|
+
requirements:
|
|
141
|
+
- - "~>"
|
|
142
|
+
- !ruby/object:Gem::Version
|
|
143
|
+
version: '3'
|
|
144
|
+
- !ruby/object:Gem::Dependency
|
|
145
|
+
name: pry
|
|
146
|
+
requirement: !ruby/object:Gem::Requirement
|
|
147
|
+
requirements:
|
|
148
|
+
- - "~>"
|
|
149
|
+
- !ruby/object:Gem::Version
|
|
150
|
+
version: '0.14'
|
|
151
|
+
type: :development
|
|
152
|
+
prerelease: false
|
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
154
|
+
requirements:
|
|
155
|
+
- - "~>"
|
|
156
|
+
- !ruby/object:Gem::Version
|
|
157
|
+
version: '0.14'
|
|
158
|
+
- !ruby/object:Gem::Dependency
|
|
159
|
+
name: rbs
|
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
|
161
|
+
requirements:
|
|
162
|
+
- - "~>"
|
|
163
|
+
- !ruby/object:Gem::Version
|
|
164
|
+
version: '3.0'
|
|
165
|
+
type: :development
|
|
166
|
+
prerelease: false
|
|
167
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
168
|
+
requirements:
|
|
169
|
+
- - "~>"
|
|
170
|
+
- !ruby/object:Gem::Version
|
|
171
|
+
version: '3.0'
|
|
172
|
+
description: Read environment variables from 1Password fields (dotenv/json/yaml format)
|
|
173
|
+
or all fields using the op CLI or 1Password Connect Server API. Export local .env
|
|
174
|
+
files back to 1Password.
|
|
175
|
+
email:
|
|
176
|
+
- contact@kiskolabs.com
|
|
177
|
+
executables:
|
|
178
|
+
- opdotenv
|
|
179
|
+
extensions: []
|
|
180
|
+
extra_rdoc_files: []
|
|
181
|
+
files:
|
|
182
|
+
- CHANGELOG.md
|
|
183
|
+
- LICENSE.md
|
|
184
|
+
- README.md
|
|
185
|
+
- bin/opdotenv
|
|
186
|
+
- lib/opdotenv.rb
|
|
187
|
+
- lib/opdotenv/anyway_loader.rb
|
|
188
|
+
- lib/opdotenv/client_factory.rb
|
|
189
|
+
- lib/opdotenv/connect_api_client.rb
|
|
190
|
+
- lib/opdotenv/exporter.rb
|
|
191
|
+
- lib/opdotenv/format_inferrer.rb
|
|
192
|
+
- lib/opdotenv/loader.rb
|
|
193
|
+
- lib/opdotenv/op_client.rb
|
|
194
|
+
- lib/opdotenv/parsers/dotenv_parser.rb
|
|
195
|
+
- lib/opdotenv/parsers/json_parser.rb
|
|
196
|
+
- lib/opdotenv/parsers/yaml_parser.rb
|
|
197
|
+
- lib/opdotenv/railtie.rb
|
|
198
|
+
- lib/opdotenv/source_parser.rb
|
|
199
|
+
- lib/opdotenv/version.rb
|
|
200
|
+
homepage: https://github.com/amkisko/opdotenv
|
|
201
|
+
licenses:
|
|
202
|
+
- MIT
|
|
203
|
+
metadata:
|
|
204
|
+
source_code_uri: https://github.com/amkisko/opdotenv
|
|
205
|
+
changelog_uri: https://github.com/amkisko/opdotenv/blob/main/CHANGELOG.md
|
|
206
|
+
bug_tracker_uri: https://github.com/amkisko/opdotenv/issues
|
|
207
|
+
rdoc_options: []
|
|
208
|
+
require_paths:
|
|
209
|
+
- lib
|
|
210
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
211
|
+
requirements:
|
|
212
|
+
- - ">="
|
|
213
|
+
- !ruby/object:Gem::Version
|
|
214
|
+
version: '2.7'
|
|
215
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
216
|
+
requirements:
|
|
217
|
+
- - ">="
|
|
218
|
+
- !ruby/object:Gem::Version
|
|
219
|
+
version: '0'
|
|
220
|
+
requirements: []
|
|
221
|
+
rubygems_version: 3.6.9
|
|
222
|
+
specification_version: 4
|
|
223
|
+
summary: Load and export environment variables with 1Password CLI or Connect API
|
|
224
|
+
test_files: []
|