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.
@@ -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
@@ -0,0 +1,3 @@
1
+ module Opdotenv
2
+ VERSION = "1.0.0"
3
+ 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: []