jac 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jac/configuration.rb +63 -24
- data/lib/jac/parser.rb +5 -4
- data/lib/jac.rb +5 -0
- metadata +3 -18
- data/lib/version.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b46834178b5af04b84cb286e7f449a4fc63920b
|
4
|
+
data.tar.gz: 04f6f8bd3f489f28fb78f138d2a665cf8e03e690
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6586f01ea2192d6abf3c49d525bd0c3586261ba74e5e23b03fc700f8dd0ffa40d97be1ce1b5b8b31fc3dbe07ebe17c66f629eab9768d422bc41e762ec6c68c40
|
7
|
+
data.tar.gz: 93a37896f9a576ae32147bc801463812e2a8b752ecc6cd3066ac032587e8fb29abc85abeae47e129098e964db04bc6bc44cf6e242b615d90e79e3647de4800a4
|
data/lib/jac/configuration.rb
CHANGED
@@ -9,7 +9,7 @@ module Jac
|
|
9
9
|
# key names (i.e. `extends`) each key in profile is a
|
10
10
|
# configuration field. For example following yaml document
|
11
11
|
#
|
12
|
-
# ```
|
12
|
+
# ```yml
|
13
13
|
#
|
14
14
|
# foo:
|
15
15
|
# bar: 42
|
@@ -39,7 +39,7 @@ module Jac
|
|
39
39
|
# profiles. To specify this one should use `extends` field
|
40
40
|
# like that
|
41
41
|
#
|
42
|
-
# ```
|
42
|
+
# ```yml
|
43
43
|
#
|
44
44
|
# base:
|
45
45
|
# application_name: my-awesome-app
|
@@ -56,7 +56,7 @@ module Jac
|
|
56
56
|
#
|
57
57
|
# In this example `debug` will receive following fields:
|
58
58
|
#
|
59
|
-
# ```
|
59
|
+
# ```yml
|
60
60
|
# application_name: my-awesome-app # from base profile
|
61
61
|
# port: 9292 # from debug profile
|
62
62
|
# version_name: 0.0.0 # from version profile
|
@@ -70,7 +70,7 @@ module Jac
|
|
70
70
|
# are merged down together. Having sequence of files like
|
71
71
|
# `.application.yml`, `.application.user.yml` with following content
|
72
72
|
#
|
73
|
-
# ```
|
73
|
+
# ```yml
|
74
74
|
# # .application.yml
|
75
75
|
# base:
|
76
76
|
# user: deployer
|
@@ -80,7 +80,7 @@ module Jac
|
|
80
80
|
# # ... other values
|
81
81
|
# ```
|
82
82
|
#
|
83
|
-
# ```
|
83
|
+
# ```yml
|
84
84
|
# # .application.user.yml
|
85
85
|
# base:
|
86
86
|
# user: developer
|
@@ -96,14 +96,14 @@ module Jac
|
|
96
96
|
# feature: it allows evaluate strings as ruby expressions
|
97
97
|
# like this:
|
98
98
|
#
|
99
|
-
# ```
|
99
|
+
# ```yml
|
100
100
|
# foo:
|
101
101
|
# build_time: "#{Time.now}" # Will be evaluated at configuration resolving step
|
102
102
|
# ```
|
103
103
|
#
|
104
104
|
# Configuration values are available to and can be referenced with `c`:
|
105
105
|
#
|
106
|
-
# ```
|
106
|
+
# ```yml
|
107
107
|
# base:
|
108
108
|
# application_name: my-awesome-app
|
109
109
|
# debug:
|
@@ -120,13 +120,47 @@ module Jac
|
|
120
120
|
#
|
121
121
|
# ## Merging values
|
122
122
|
#
|
123
|
-
# By default if one value
|
123
|
+
# By default if one value have multiple defenitions it will be overwritten by
|
124
|
+
# topmost value. Except several cases where Jac handles value resolution
|
125
|
+
# specialy
|
126
|
+
#
|
124
127
|
# ### Merging hashes
|
125
128
|
#
|
126
|
-
#
|
127
|
-
#
|
129
|
+
# Hashes inside profile are recurseively merged automaticly. This rule works
|
130
|
+
# for profile extensions and value redefenitions too.
|
131
|
+
#
|
132
|
+
# Example:
|
133
|
+
#
|
134
|
+
# ```yml
|
135
|
+
# base:
|
136
|
+
# servers:
|
137
|
+
# release: http://release.com
|
138
|
+
#
|
139
|
+
# debug:
|
140
|
+
# extends: base
|
141
|
+
# debug: http://debug.com
|
142
|
+
#
|
143
|
+
# ```
|
128
144
|
#
|
145
|
+
# ### Merging sets
|
129
146
|
#
|
147
|
+
# Sets allowed to be merged with `nil`s and any instance of `Enumerable`.
|
148
|
+
# Merge result is always new `Set` instance.
|
149
|
+
# ```yml
|
150
|
+
# release:
|
151
|
+
# extends:
|
152
|
+
# - no_rtti
|
153
|
+
# - no_debug
|
154
|
+
# flags: !set {} # empty set
|
155
|
+
# no_rtti:
|
156
|
+
# flags:
|
157
|
+
# - -fno-rtti
|
158
|
+
# no_debug:
|
159
|
+
# flags:
|
160
|
+
# - -DNDEBUG
|
161
|
+
# ```
|
162
|
+
#
|
163
|
+
# Resulting profile will have `-fno-rtti, -DNDEBUG` in `release profile`
|
130
164
|
# ## Generic profiles
|
131
165
|
#
|
132
166
|
# Same result as shown above can be achieved with generic profiles. Generic profile
|
@@ -151,18 +185,17 @@ module Jac
|
|
151
185
|
DEFAULT_PROFILE_NAME = 'default'.freeze
|
152
186
|
# Creates "empty" config
|
153
187
|
DEFAULT_CONFIGURATION = -> () { { DEFAULT_PROFILE_NAME => {} } }
|
154
|
-
# Creates configuration reader
|
155
|
-
# @param streams [Array] of pairs containing YAML document and provided
|
156
|
-
# name for this stream
|
157
188
|
attr_reader :merger
|
189
|
+
# Creates configuration reader
|
190
|
+
# @param [Array] streams of pairs containing YAML document and provided
|
191
|
+
# name for this stream
|
158
192
|
def initialize(streams)
|
159
193
|
@streams = streams
|
160
194
|
@merger = Merger.new
|
161
195
|
end
|
162
196
|
|
163
197
|
# Parses all streams and resolves requested profile
|
164
|
-
# @param
|
165
|
-
# merged
|
198
|
+
# @param [Array] profile list of profile names to be merged
|
166
199
|
# @return [OpenStruct] instance which contains all resolved profile fields
|
167
200
|
def read(*profile)
|
168
201
|
result = @streams
|
@@ -177,7 +210,7 @@ module Jac
|
|
177
210
|
# Each stream consists of one or more documents
|
178
211
|
YAML.parse_stream(stream).children.flat_map do |document|
|
179
212
|
# Will use separate visitor per YAML document.
|
180
|
-
visitor =
|
213
|
+
visitor = Jac::Parser::VisitorToRuby.create
|
181
214
|
# Expecting document to be single mapping
|
182
215
|
profile_mapping = document.children.first
|
183
216
|
raise(ArgumentError, 'Mapping expected') unless profile_mapping.is_a? Psych::Nodes::Mapping
|
@@ -208,8 +241,8 @@ module Jac
|
|
208
241
|
# @param [Hash] base value mappings
|
209
242
|
# @param [Hash] values ovverides.
|
210
243
|
# @return [Hash] merged profile
|
211
|
-
def merge!(base,
|
212
|
-
merger.merge!(base,
|
244
|
+
def merge!(base, values)
|
245
|
+
merger.merge!(base, values)
|
213
246
|
end
|
214
247
|
|
215
248
|
def resolve(profile, config)
|
@@ -261,7 +294,9 @@ module Jac
|
|
261
294
|
def generate_profile(match, matched_profile, profile_name)
|
262
295
|
gen_profile = {}
|
263
296
|
gen_profile['captures'] = match.captures if match.captures
|
264
|
-
|
297
|
+
if match.respond_to?(:named_captures) && match.named_captures
|
298
|
+
gen_profile['named_captures'] = match.named_captures
|
299
|
+
end
|
265
300
|
gen_profile.merge!(config[matched_profile])
|
266
301
|
|
267
302
|
config[profile_name] = gen_profile
|
@@ -373,13 +408,13 @@ module Jac
|
|
373
408
|
end
|
374
409
|
|
375
410
|
# List of files where configuration can be placed
|
376
|
-
# * `
|
411
|
+
# * `jac.yml` - expected to be main configuration file.
|
377
412
|
# Usually it placed under version control.
|
378
|
-
# * `
|
413
|
+
# * `jac.user.yml` - user defined overrides for main
|
379
414
|
# configuration, sensitive data which can't be placed
|
380
415
|
# under version control.
|
381
|
-
# * `
|
382
|
-
CONFIGURATION_FILES = %w[
|
416
|
+
# * `jac.override.yml` - final overrides.
|
417
|
+
CONFIGURATION_FILES = %w[jac.yml jac.user.yml jac.override.yml].freeze
|
383
418
|
|
384
419
|
class << self
|
385
420
|
# Generates configuration object for given profile
|
@@ -394,10 +429,14 @@ module Jac
|
|
394
429
|
end
|
395
430
|
|
396
431
|
# Read configuration from configuration files.
|
432
|
+
# @praram [String or Array] profile which should be loaded
|
433
|
+
# @param [Array] files filenames to load
|
434
|
+
# @param [String] dir base directory path for provided files may be nil
|
435
|
+
# @return [OpenStruct] resolved profile values
|
397
436
|
def load(profile, files: CONFIGURATION_FILES, dir: Dir.pwd)
|
398
437
|
# Read all known files
|
399
438
|
streams = files
|
400
|
-
.map { |f| [File.join(dir, f), f] }
|
439
|
+
.map { |f| [dir ? File.join(dir, f) : f, f] }
|
401
440
|
.select { |path, _name| File.exist?(path) }
|
402
441
|
.map { |path, name| [IO.read(path), name] }
|
403
442
|
read(profile, *streams)
|
data/lib/jac/parser.rb
CHANGED
@@ -2,16 +2,17 @@ require 'psych'
|
|
2
2
|
require 'set'
|
3
3
|
|
4
4
|
module Jac
|
5
|
+
# Custom YAML parsing routines
|
5
6
|
module Parser
|
6
7
|
# Cutstom Yaml AST visitor
|
7
|
-
# @see
|
8
|
-
# While
|
9
|
-
# we need explicitly convert those mappings to ruby
|
8
|
+
# @see Psych::Visitors::ToRuby
|
9
|
+
# While standard Psych visitor converts sets to `{ value => nil }` mappings
|
10
|
+
# we need explicitly convert those mappings to ruby [Set]
|
10
11
|
class VisitorToRuby < Psych::Visitors::ToRuby
|
11
12
|
# rubocop: disable Naming/MethodName
|
12
13
|
|
13
14
|
# Uses standard Psych visitor to convert mapping to ruby object
|
14
|
-
# except `!set` case. Here we convert mapping to
|
15
|
+
# except `!set` case. Here we convert mapping to [Set].
|
15
16
|
# @param [Psych::Nodes::Mapping] o YAML AST node
|
16
17
|
# @return [Object] parsed ruby object
|
17
18
|
def visit_Psych_Nodes_Mapping(o)
|
data/lib/jac.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ilya.arkhanhelsky
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: powerpack
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1.1
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 0.1.1
|
11
|
+
date: 2017-11-15 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
27
13
|
description: Profile based configuration lib
|
28
14
|
email: ilya.arkhanhelsky@vizor-games.com
|
29
15
|
executables: []
|
@@ -34,7 +20,6 @@ files:
|
|
34
20
|
- lib/jac/configuration.rb
|
35
21
|
- lib/jac/merger.rb
|
36
22
|
- lib/jac/parser.rb
|
37
|
-
- lib/version.rb
|
38
23
|
homepage: https://github.com/vizor-games/jac
|
39
24
|
licenses:
|
40
25
|
- MIT
|