dry-web 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 02df09586b21408b90c3471bea69419b3cff6cdd
4
- data.tar.gz: b5d24c33ce4f44cde81347a477d33100cb822fce
3
+ metadata.gz: 6bd38cff5b681971b1dc6b4291944d7d22c2b1fe
4
+ data.tar.gz: 3552ee32bd6052c1f4a1f50058ebdaf0977bead5
5
5
  SHA512:
6
- metadata.gz: 8f7a7e946e9de3ad3ee0ae80d879e5136b5c054bfee920a4ccdc59e99fa5a993e102c64db37e7342b2df56a141822832a76295a47f0ccb1a38faeb87aa587675
7
- data.tar.gz: 7423c16ad141d8a4457bcd4b7a741acdbd7ff8f16b13f2f471a3d29d729c4d4f41d88d2689c682b282ad18a52048ae4cc5c210cbade8311cd0e1eff135ee9a19
6
+ metadata.gz: 2a390ec0d28183d82e79cbdc288c0ef63b977b84f6e1d0ef5417c0e0ef1b18a7e3ddf04ed54ae9d37510532fbd5fd56aa4ada3792df8ed80a80be4b3200602d8
7
+ data.tar.gz: 9698aa2a296a5767ec936caf8c31994fc04a1e7daa4b43b77617a8359ac94d1affdd6f9bc31ad0d50d6e722daa2cb8a19bfea0d18eebfd3e5231027de3b0e777
@@ -1,21 +1,19 @@
1
1
  language: ruby
2
- dist: trusty
3
- sudo: required
4
2
  cache: bundler
5
- bundler_args: --without tools
3
+ bundler_args: --without benchmarks tools
6
4
  script:
7
5
  - bundle exec rake spec
6
+ before_install: gem update --system
8
7
  after_script:
9
8
  - bundle exec codeclimate-test-reporter
10
9
  rvm:
11
- - 2.4.0
12
- - 2.3
13
- - 2.2
14
- - rbx-3
15
- - jruby-9.1.6.0
10
+ - 2.5.0
11
+ - 2.4.3
12
+ - 2.3.6
13
+ - jruby-9.1.9.0
16
14
  env:
17
15
  global:
18
- - JRUBY_OPTS='--dev -J-Xmx1024M'
16
+ - COVERAGE='true'
19
17
  notifications:
20
18
  email: false
21
19
  webhooks:
@@ -1,3 +1,11 @@
1
+ # 0.8.0 - 2018-01-02
2
+
3
+ ### Changed
4
+
5
+ * Updated to `dry-system ~> 0.9` (solnic)
6
+
7
+ [Compare v0.7.1...v0.8.0](https://github.com/dry-rb/dry-web/compare/v0.7.1...v0.8.0)
8
+
1
9
  # 0.7.1 - 2017-07-25
2
10
 
3
11
  ### Changed
data/Gemfile CHANGED
@@ -2,6 +2,10 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
+ gem 'dry-system', git: 'https://github.com/dry-rb/dry-system.git', branch: 'master'
6
+ gem 'dry-monitor', git: 'https://github.com/dry-rb/dry-monitor.git', branch: 'master'
7
+ gem 'dry-events', git: 'https://github.com/dry-rb/dry-events.git', branch: 'master'
8
+
5
9
  group :test do
6
10
  gem 'byebug', platform: :mri
7
11
  gem 'codeclimate-test-reporter'
@@ -20,8 +20,8 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.required_ruby_version = '>= 2.1.0'
22
22
 
23
- spec.add_runtime_dependency "dry-system", "~> 0.5"
24
- spec.add_runtime_dependency "dry-monitor"
23
+ spec.add_runtime_dependency "dry-system", "~> 0.9"
24
+ spec.add_runtime_dependency "dry-monitor", "~> 0.1"
25
25
 
26
26
  spec.add_development_dependency "bundler", "~> 1.7"
27
27
  spec.add_development_dependency "rake", "~> 11.0"
@@ -4,41 +4,23 @@ require 'dry/monitor'
4
4
  module Dry
5
5
  module Web
6
6
  class Container < Dry::System::Container
7
- setting :env, ENV.fetch('RACK_ENV', 'development').to_sym
8
- setting :log_dir, 'log'.freeze
9
- setting :log_levels, development: Logger::DEBUG, test: Logger::DEBUG
10
- setting :logger
11
- setting :listeners, false
7
+ use :env, inferrer: -> { ENV.fetch('RACK_ENV', 'development').to_sym }
8
+ use :logging
9
+ use :notifications
12
10
 
13
- class << self
14
- def configure(&block)
15
- super.
16
- configure_logger.
17
- configure_notifications.
18
- configure_rack_monitor.
19
- attach_listeners
20
- end
21
-
22
- def configure_logger
23
- if key?(:logger)
24
- self
25
- elsif config.logger
26
- register(:logger, config.logger)
27
- else
28
- config.logger = Monitor::Logger.new(config.root.join(config.log_dir).realpath.join("#{config.env}.log"))
29
- config.logger.level = config.log_levels.fetch(config.env, Logger::ERROR)
30
- register(:logger, config.logger)
31
- self
32
- end
33
- end
11
+ setting :logger_class, Monitor::Logger
12
+ setting :listeners, false
34
13
 
35
- def configure_notifications
36
- return self if key?(:notifications)
37
- register(:notifications, Monitor::Notifications.new(config.name))
38
- self
14
+ def self.inherited(klass)
15
+ klass.after(:configure) do
16
+ register_rack_monitor
17
+ attach_listeners
39
18
  end
19
+ super
20
+ end
40
21
 
41
- def configure_rack_monitor
22
+ class << self
23
+ def register_rack_monitor
42
24
  return self if key?(:rack_monitor)
43
25
  register(:rack_monitor, Monitor::Rack::Middleware.new(self[:notifications]))
44
26
  self
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Web
3
- VERSION = '0.7.1'.freeze
3
+ VERSION = '0.8.0'.freeze
4
4
  end
5
5
  end
@@ -2,19 +2,6 @@ RSpec.describe "Dry::Web::Container" do
2
2
  subject(:container) { Class.new(Dry::Web::Container) }
3
3
 
4
4
  describe "settings" do
5
- # Do some acrobatics to make the container reload a setting from scratch
6
- # and apply a new default
7
- def reload_setting_for(key)
8
- if Dry::Web::Container.instance_variables.include?(:@_config)
9
- Dry::Web::Container.remove_instance_variable(:@_config)
10
- end
11
-
12
- Dry::Web::Container.instance_variable_get(:@_settings).delete_if do |setting|
13
- setting.name == key
14
- end
15
- load "dry/web/container.rb"
16
- end
17
-
18
5
  describe ".config.logger" do
19
6
  it 'sets up default logger for development env' do
20
7
  container.configure do |config|
@@ -81,36 +68,8 @@ RSpec.describe "Dry::Web::Container" do
81
68
 
82
69
  describe ".config.env" do
83
70
  context "existing RACK_ENV environment variable" do
84
- before do
85
- @rack_env = ENV["RACK_ENV"]
86
- ENV["RACK_ENV"] = "production"
87
-
88
- reload_setting_for :env
89
- end
90
-
91
- after do
92
- ENV["RACK_ENV"] = @rack_env
93
- end
94
-
95
71
  it "returns the RACK_ENV" do
96
- expect(Dry::Web::Container.config.env).to eq :production
97
- end
98
- end
99
-
100
- context "no RACK_ENV set" do
101
- before do
102
- @rack_env = ENV["RACK_ENV"]
103
- ENV.delete("RACK_ENV")
104
-
105
- reload_setting_for :env
106
- end
107
-
108
- after do
109
- ENV["RACK_ENV"] = @rack_env
110
- end
111
-
112
- it "defaults to development" do
113
- expect(Dry::Web::Container.config.env).to eq :development
72
+ expect(Class.new(Dry::Web::Container).config.env).to eq :test
114
73
  end
115
74
  end
116
75
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-web
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-25 00:00:00.000000000 Z
11
+ date: 2018-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-system
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.5'
19
+ version: '0.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.5'
26
+ version: '0.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: dry-monitor
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '0.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '0.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -114,9 +114,6 @@ files:
114
114
  - lib/dry-web.rb
115
115
  - lib/dry/web/console.rb
116
116
  - lib/dry/web/container.rb
117
- - lib/dry/web/settings.rb
118
- - lib/dry/web/settings/file_loader.rb
119
- - lib/dry/web/settings/file_parser.rb
120
117
  - lib/dry/web/version.rb
121
118
  - log/.gitkeep
122
119
  - spec/fixtures/multiple_env_files/.env
@@ -125,9 +122,6 @@ files:
125
122
  - spec/fixtures/test/log/.gitkeep
126
123
  - spec/spec_helper.rb
127
124
  - spec/unit/container_spec.rb
128
- - spec/unit/settings/file_loader_spec.rb
129
- - spec/unit/settings/file_parser_spec.rb
130
- - spec/unit/settings_spec.rb
131
125
  homepage: https://github.com/dry-rb/dry-web
132
126
  licenses:
133
127
  - MIT
@@ -148,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
142
  version: '0'
149
143
  requirements: []
150
144
  rubyforge_project:
151
- rubygems_version: 2.6.9
145
+ rubygems_version: 2.6.11
152
146
  signing_key:
153
147
  specification_version: 4
154
148
  summary: Lightweight web application stack on top of dry-system
@@ -159,6 +153,3 @@ test_files:
159
153
  - spec/fixtures/test/log/.gitkeep
160
154
  - spec/spec_helper.rb
161
155
  - spec/unit/container_spec.rb
162
- - spec/unit/settings/file_loader_spec.rb
163
- - spec/unit/settings/file_parser_spec.rb
164
- - spec/unit/settings_spec.rb
@@ -1,57 +0,0 @@
1
- require "dry/web/settings/file_loader"
2
-
3
- module Dry
4
- module Web
5
- class Settings
6
- SettingValueError = Class.new(StandardError)
7
-
8
- def self.schema
9
- @schema ||= {}
10
- end
11
-
12
- def self.setting(name, type = nil)
13
- settings(name => type)
14
- end
15
-
16
- def self.settings(new_schema)
17
- check_schema_duplication(new_schema)
18
- @schema = schema.merge(new_schema)
19
-
20
- self
21
- end
22
-
23
- def self.check_schema_duplication(new_schema)
24
- shared_keys = new_schema.keys & schema.keys
25
-
26
- raise ArgumentError, "Setting :#{shared_keys.first} has already been defined" if shared_keys.any?
27
- end
28
- private_class_method :check_schema_duplication
29
-
30
- def self.load_files(root, env)
31
- FileLoader.new.(root, env)
32
- end
33
- private_class_method :load_files
34
-
35
- def self.load(root, env)
36
- env_data = load_files(root, env)
37
- schema = self.schema
38
-
39
- Class.new do
40
- extend Dry::Configurable
41
-
42
- schema.each do |key, type|
43
- value = ENV.fetch(key.to_s.upcase) { env_data[key.to_s.upcase] }
44
-
45
- begin
46
- value = type[value] if type
47
- rescue => e
48
- raise SettingValueError, "error typecasting +#{key}+: #{e}"
49
- end
50
-
51
- setting key, value
52
- end
53
- end.config
54
- end
55
- end
56
- end
57
- end
@@ -1,28 +0,0 @@
1
- require "dry/web/settings/file_parser"
2
-
3
- module Dry
4
- module Web
5
- class Settings
6
- class FileLoader
7
- def call(root, env)
8
- files(root, env).reduce({}) do |hash, file|
9
- hash.merge(parser.(file))
10
- end
11
- end
12
-
13
- private
14
-
15
- def parser
16
- @parser ||= FileParser.new
17
- end
18
-
19
- def files(root, env)
20
- [
21
- root.join(".env"),
22
- root.join(".env.#{env}")
23
- ].compact
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,49 +0,0 @@
1
- module Dry
2
- module Web
3
- class Settings
4
- class FileParser
5
- # Regex extracted from dotenv gem
6
- # https://github.com/bkeepers/dotenv/blob/master/lib/dotenv/parser.rb#L14
7
- LINE = %r(
8
- \A
9
- \s*
10
- (?:export\s+)? # optional export
11
- ([\w\.]+) # key
12
- (?:\s*=\s*|:\s+?) # separator
13
- ( # optional value begin
14
- '(?:\'|[^'])*' # single quoted value
15
- | # or
16
- "(?:\"|[^"])*" # double quoted value
17
- | # or
18
- [^#\n]+ # unquoted value
19
- )? # value end
20
- \s*
21
- (?:\#.*)? # optional comment
22
- \z
23
- )x
24
-
25
- def call(file)
26
- File.readlines(file).each_with_object({}) do |line, hash|
27
- parse_line(line, hash)
28
- end
29
- rescue Errno::ENOENT
30
- {}
31
- end
32
-
33
- private
34
-
35
- def parse_line(line, hash)
36
- if (match = line.match(LINE))
37
- key, value = match.captures
38
- hash[key] = parse_value(value || "")
39
- end
40
- hash
41
- end
42
-
43
- def parse_value(value)
44
- value.strip.sub(/\A(['"])(.*)\1\z/, '\2')
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,16 +0,0 @@
1
- require "dry/web/settings/file_loader"
2
-
3
- RSpec.describe Dry::Web::Settings::FileLoader do
4
- let(:klass) { Dry::Web::Settings::FileLoader }
5
- let(:root) { SPEC_ROOT.join("fixtures/multiple_env_files") }
6
- let(:env) { :test }
7
- subject(:data) { klass.new.(root, env) }
8
-
9
- describe "#call" do
10
- it "will create hash with both variables from files" do
11
- expect(subject["ONLY_ON_ENV"]).to eq ("will be loaded from env")
12
- expect(subject["ONLY_IN_TEST"]).to eq ("will be loaded from env.test")
13
- expect(subject["IN_BOTH_ENVIRONMENT"]).to eq (".env.test")
14
- end
15
- end
16
- end
@@ -1,29 +0,0 @@
1
- require "dry/web/settings/file_parser"
2
-
3
- RSpec.describe Dry::Web::Settings::FileParser do
4
- let(:klass) { Dry::Web::Settings::FileParser }
5
- let(:parser) { klass.new }
6
-
7
- describe "#call" do
8
- context "with existing file" do
9
- let(:file) { SPEC_ROOT.join("fixtures/test/.env.test") }
10
- subject(:settings) { parser.(file) }
11
-
12
- it "will retrun a hash with all variables and its value" do
13
- expect(subject["API_KEY"]).to eq ("yaml123")
14
- expect(subject["PRECOMPILE_ASSETS"]).to eq ("1")
15
- expect(subject["UNDECLARED"]).to eq ("not declared in settings")
16
- expect(subject["TESTING"]).to eq ("variables with = in it")
17
- end
18
- end
19
-
20
- context "without existing file" do
21
- let(:file) { SPEC_ROOT.join("fixtures/test/.env") }
22
- subject(:settings) { parser.(file) }
23
-
24
- it "will retrun a empty hash" do
25
- expect(subject).to eq ({})
26
- end
27
- end
28
- end
29
- end
@@ -1,105 +0,0 @@
1
- require "dry/web/settings"
2
-
3
- RSpec.describe Dry::Web::Settings do
4
- describe ".setting" do
5
- it "raises an error if a duplicate setting is specified" do
6
- expect {
7
- Class.new(Dry::Web::Settings) do
8
- setting :foo
9
- setting :foo
10
- end
11
- }.to raise_error(ArgumentError)
12
- end
13
- end
14
-
15
- describe ".load" do
16
- subject(:settings) {
17
- Class.new(Dry::Web::Settings) do
18
- setting :api_key
19
- setting :precompile_assets
20
- setting :env_only_setting
21
- end.load(SPEC_ROOT.join("fixtures/test"), :test)
22
- }
23
-
24
- it "loads settings from ENV first (as upper-cased variables)" do
25
- ENV["ENV_ONLY_SETTING"] = "hello"
26
- expect(settings.env_only_setting).to eq "hello"
27
- end
28
-
29
- it "loads settings from a env file (as upper-cased keys) if unavailable from ENV" do
30
- expect(settings.api_key).to eq "yaml123"
31
- end
32
-
33
- it "ignores undeclared settings in the env file" do
34
- expect(settings).not_to respond_to(:undeclared)
35
- end
36
-
37
- context "without file" do
38
- subject(:settings) {
39
- Class.new(Dry::Web::Settings) do
40
- setting :api_key
41
- setting :precompile_assets
42
- end.load(SPEC_ROOT.join("fixtures/test"), :development)
43
- }
44
-
45
- it "will retrun an config hash " do
46
- expect(settings.to_h).to eq ({api_key: nil, precompile_assets: nil})
47
- end
48
- end
49
-
50
- context "specific env file will merge on top of `.env`" do
51
- subject(:settings) {
52
- Class.new(Dry::Web::Settings) do
53
- setting :in_both_environment
54
- end.load(SPEC_ROOT.join("fixtures/multiple_env_files"), :test)
55
- }
56
-
57
- it "will retrun the value set from the test env " do
58
- expect(settings.in_both_environment).to eq ".env.test"
59
- end
60
- end
61
-
62
- context "settings with types" do
63
- before do
64
- Test::CoercingBool = Class.new do
65
- def self.[](val)
66
- %w[1 true].include?(val.to_s)
67
- end
68
- end
69
-
70
- Test::ConstraintNotMatched = Class.new(ArgumentError)
71
-
72
- Test::LongString = Class.new do
73
- def self.[](val)
74
- raise Test::ConstraintNotMatched, "string must be 12 characters or longer" if val.length < 12
75
- end
76
- end
77
- end
78
-
79
- context "coercing types" do
80
- subject(:settings) {
81
- Class.new(Dry::Web::Settings) do
82
- setting :precompile_assets, Test::CoercingBool
83
- end.load(SPEC_ROOT.join("fixtures/test"), :test)
84
- }
85
-
86
- it "supports coercion input data" do
87
- expect(settings.precompile_assets).to eq true
88
- end
89
- end
90
-
91
- context "constraining types" do
92
- subject(:settings) {
93
- Class.new(Dry::Web::Settings) do
94
- setting :api_key, Test::LongString
95
- end.load(SPEC_ROOT.join("fixtures/test"), :test)
96
- }
97
-
98
- it "raises helpful exceptions if input data does not match constraints" do
99
- expect { settings }.to raise_error(Dry::Web::Settings::SettingValueError)
100
- expect { settings }.to raise_error(/error typecasting \+api_key\+/)
101
- end
102
- end
103
- end
104
- end
105
- end