dry-web 0.7.1 → 0.8.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 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