fetching 0.6.1 → 0.7.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
- SHA1:
3
- metadata.gz: d376f053b0ff1258626543fce7a932245218cbfc
4
- data.tar.gz: 4fce06a064b39f7017cb4a5bc2eb312e19db3fcc
2
+ SHA256:
3
+ metadata.gz: 9ac1c22b5f53d128f788bcba8e01803b17bcdc861adbe1cb545a7361b372a240
4
+ data.tar.gz: 5ed9955513c5f64df46d89a4e312343516326f2aa7094f8b6b09a30367fbab19
5
5
  SHA512:
6
- metadata.gz: 25a61cf2c0b4338d5a17530881b5d87fc6cdf4656726aca674dc007dbac02456ff00f141d536fb2daa414a9347fb0ba750d643ff7e16e621e74d010ef7bdd764
7
- data.tar.gz: 656d5b6e258b930a5becb45ac94098e5c9ab59ea36c6473a0c8355152c3fa40d04be23c9100a200b196c9c0baf4f162731e12161ce589debebc3afd5ba5c8fac
6
+ metadata.gz: 735ae911c25552e07d81264fd4d585e306e23664a5069bd9bad7557a958d4fbeae2034dde3c106e316143be704917e1eb9fa76b1f839a9335ed86e1a8477fdf7
7
+ data.tar.gz: f2a59a5c7a295729fe7e2f7b842c5c9d431c2dad03cfc1f0cee1ea7f07fdaffe5200cd050dbeef97b04057a80fcd0a9c793dbcfe2e48e3ff0bbf9ffd270a1e9e
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -1,37 +1,34 @@
1
1
  AllCops:
2
2
  Include:
3
3
  - Gemfile
4
+ - Guardfile
4
5
  - Rakefile
6
+ - fetching.gemspec
7
+ - rubocop-rspec
5
8
 
6
- Documentation:
7
- Enabled: false
8
-
9
- Encoding:
10
- Enabled: false
11
-
12
- EmptyLinesAroundBody:
9
+ Layout/EmptyLinesAroundClassBody:
13
10
  Enabled: false
14
11
 
15
- LineLength:
16
- Max: 100
17
-
18
- MethodDefParentheses:
12
+ Layout/EmptyLinesAroundModuleBody:
19
13
  Enabled: false
20
14
 
21
- NumericLiterals:
15
+ Layout/EmptyLinesAroundBlockBody:
22
16
  Enabled: false
23
17
 
24
- RegexpLiteral:
25
- MaxSlashes: 0
18
+ Layout/IndentHeredoc:
26
19
  Exclude:
27
- - Guardfile
20
+ - fetching.gemspec
28
21
 
29
- SpecialGlobalVars:
22
+ Metrics/BlockLength:
30
23
  Exclude:
31
24
  - fetching.gemspec
32
25
 
33
- StringLiterals:
34
- EnforcedStyle: double_quotes
26
+ Metrics/LineLength:
27
+ Max: 100
35
28
 
36
- TrailingComma:
37
- EnforcedStyleForMultiline: comma
29
+ Style/Documentation:
30
+ Enabled: false
31
+
32
+ Style/RegexpLiteral:
33
+ Exclude:
34
+ - Guardfile
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ script:
3
+ - bundle exec rspec
4
+ - bundle exec rubocop --display-cop-names
5
+ sudo: false
6
+ rvm:
7
+ - jruby-9.2
8
+ - ruby-2.3
9
+ - ruby-2.4
10
+ - ruby-2.5
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in fetching.gemspec
4
4
  gemspec
@@ -0,0 +1,42 @@
1
+ guard :rubocop, cli: ['--display-cop-names'] do
2
+ watch(%r{.+\.rb$})
3
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
4
+ end
5
+
6
+ rspec_opts = {
7
+ cmd: 'bundle exec rspec',
8
+ all_on_start: true,
9
+ all_after_pass: true,
10
+ failed_mode: :keep
11
+ }
12
+
13
+ guard :rspec, rspec_opts do
14
+ watch(%r{^spec/.+_spec\.rb$})
15
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
16
+ watch('spec/spec_helper.rb') { 'spec' }
17
+
18
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
19
+ watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) do |m|
20
+ "spec/#{m[1]}#{m[2]}_spec.rb"
21
+ end
22
+
23
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) do |m|
24
+ [
25
+ "spec/routing/#{m[1]}_routing_spec.rb",
26
+ "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb",
27
+ "spec/acceptance/#{m[1]}_spec.rb"
28
+ ]
29
+ end
30
+ watch(%r{^spec/support/(.+)\.rb$}) { 'spec' }
31
+ watch('config/routes.rb') { 'spec/routing' }
32
+ watch('app/controllers/application_controller.rb') { 'spec/controllers' }
33
+
34
+ watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) do |m|
35
+ "spec/features/#{m[1]}_spec.rb"
36
+ end
37
+
38
+ watch(%r{^spec/acceptance/(.+)\.feature$})
39
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
40
+ Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance'
41
+ end
42
+ end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Fetching
1
+ # Fetching [![Build Status](https://travis-ci.org/covermymeds/fetching-gem.svg?branch=master)](https://travis-ci.org/covermymeds/fetching-gem)
2
2
 
3
3
  Turn deeply nested hashes and arrays (like an API response) into a whiney object with method syntax.
4
4
 
data/Rakefile CHANGED
@@ -1 +1,6 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
+
3
+ desc "Run a pry session with the gem's code loaded"
4
+ task :console do
5
+ sh 'pry -I lib -r fetching'
6
+ end
@@ -1,32 +1,35 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "fetching/version"
3
+ require 'fetching/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "fetching"
6
+ spec.name = 'fetching'
8
7
  spec.version = Fetching::VERSION
9
- spec.authors = ["Michael Gee", "Mark Lorenz"]
10
- spec.email = ["mgee@covermymeds.com", "mlorenz@covermymeds.com"]
11
- spec.description = %q(More sass in more structs.)
8
+ spec.authors = ['Michael Gee', 'Mark Lorenz']
9
+ spec.email = ['mgee@covermymeds.com', 'mlorenz@covermymeds.com']
10
+ spec.description = "Strict wrapper for Hashes and Arrays that doesn't return nil"
12
11
 
13
12
  spec.summary = <<-HEREDOC
14
- This gem is a work in progress. The implementation code is not what's
15
- important. What is important: Don't de-serialize API responses in to
16
- hashes and arrays. Use a "strict" object that inforces key presence,
17
- and array bounds.}
18
- HEREDOC
13
+ Don't de-serialize API responses in to hashes and arrays.
14
+ Use a "strict" object that inforces key presence and array bounds.
15
+ HEREDOC
19
16
 
20
- spec.homepage = ""
21
- spec.license = "MIT"
17
+ spec.homepage = ''
18
+ spec.license = 'MIT'
22
19
 
23
- spec.files = `git ls-files`.split($/)
20
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
24
21
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
25
22
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
26
- spec.require_paths = ["lib"]
23
+ spec.require_paths = ['lib']
27
24
 
28
- spec.add_development_dependency "bundler", "~> 1.3"
29
- spec.add_development_dependency "rake"
30
- spec.add_development_dependency "rspec"
31
- spec.add_development_dependency "pry-plus"
25
+ spec.add_development_dependency 'bundler', '~> 1.3'
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'rspec', '~> 3.1'
28
+ spec.add_development_dependency 'rubocop', '~> 0.58.0'
29
+ spec.add_development_dependency 'rubocop-rspec'
30
+ unless ENV['CI']
31
+ spec.add_development_dependency 'guard-rspec'
32
+ spec.add_development_dependency 'guard-rubocop'
33
+ spec.add_development_dependency 'pry'
34
+ end
32
35
  end
@@ -1,6 +1,6 @@
1
- require "json"
2
- require "fetching/fetching_array"
3
- require "fetching/fetching_hash"
1
+ require 'json'
2
+ require 'fetching/fetching_array'
3
+ require 'fetching/fetching_hash'
4
4
 
5
5
  module Kernel
6
6
 
@@ -14,11 +14,10 @@ class Fetching
14
14
 
15
15
  WHITELIST = %w(
16
16
  class object_id == equal?
17
- define_singleton_method instance_eval
17
+ define_singleton_method singleton_class
18
18
  respond_to?
19
- instance_variables instance_variable_get
20
- nil?
21
- )
19
+ nil? tap
20
+ ).freeze
22
21
 
23
22
  all_methods = instance_methods.map(&:to_s).grep(/\A[^_]/)
24
23
  (all_methods - WHITELIST).each(&method(:undef_method))
@@ -30,11 +29,11 @@ class Fetching
30
29
  value
31
30
  end
32
31
 
33
- def self.from_json json
34
- from(JSON.parse json)
32
+ def self.from_json(json)
33
+ from JSON.parse(json)
35
34
  end
36
35
 
37
- def initialize table
36
+ def initialize(table)
38
37
  @table = table
39
38
  end
40
39
 
@@ -60,7 +59,7 @@ class Fetching
60
59
 
61
60
  private
62
61
 
63
- def respond_to_missing? _method_name, _include_private = false
62
+ def respond_to_missing?(_method_name, _include_private = false)
64
63
  false
65
64
  end
66
65
 
@@ -3,8 +3,12 @@ class Fetching
3
3
 
4
4
  include Enumerable
5
5
 
6
- def [](index)
7
- Fetching.from @table.fetch(index)
6
+ def [](*args)
7
+ if args.length == 1 && args.first.is_a?(Integer)
8
+ Fetching.from @table.fetch(args.first)
9
+ else
10
+ values_at(*args)
11
+ end
8
12
  end
9
13
 
10
14
  def each
@@ -13,8 +17,10 @@ class Fetching
13
17
  end
14
18
  end
15
19
 
16
- def first
17
- self[0]
20
+ def first(num = 0)
21
+ return self[0] if num.zero?
22
+
23
+ Array.new(num) { |i| self[i] }
18
24
  end
19
25
 
20
26
  module ArrayMethods
@@ -26,28 +32,54 @@ class Fetching
26
32
  def length
27
33
  @table.length
28
34
  end
29
- alias_method :size, :length
35
+ alias size length
30
36
 
31
37
  def reverse
32
38
  Fetching.from @table.reverse
33
39
  end
34
40
 
35
- def shuffle *args
41
+ def shuffle(*args)
36
42
  Fetching.from @table.shuffle(*args)
37
43
  end
38
44
 
39
- def sort &block
45
+ def sort(&block)
40
46
  Fetching.from @table.sort(&block)
41
47
  end
42
48
 
43
- def sort_by &block
49
+ def sort_by(&block)
44
50
  Fetching.from @table.sort_by(&block)
45
51
  end
46
52
 
47
- def values_at *args
48
- Fetching.from(args.map { |i| self[i] })
53
+ def values_at(*args)
54
+ results = args.map { |arg| result_for_argument(arg) }.flatten
55
+
56
+ Fetching.from(results)
57
+ end
58
+
59
+ private
60
+
61
+ def result_for_argument(argument)
62
+ case argument
63
+ when Integer
64
+ values_at_integer(argument)
65
+ when Array
66
+ values_at_array(argument)
67
+ when Range
68
+ values_at_range(argument)
69
+ end
49
70
  end
50
71
 
72
+ def values_at_integer(integer)
73
+ self[integer]
74
+ end
75
+
76
+ def values_at_array(array)
77
+ array.map { |a| values_at_integer(a) }
78
+ end
79
+
80
+ def values_at_range(range)
81
+ values_at_array(range.to_a)
82
+ end
51
83
  end
52
84
 
53
85
  include ArrayMethods
@@ -1,7 +1,7 @@
1
1
  class Fetching
2
2
  class FetchingHash < Fetching
3
3
 
4
- def initialize *args
4
+ def initialize(*args)
5
5
  super
6
6
  make_methods
7
7
  end
@@ -20,8 +20,8 @@ class Fetching
20
20
  end
21
21
  end
22
22
 
23
- def method_missing key, *_args, &_block
24
- fail NoMethodError, "#{key} not found\nyou have:\n#{@table.inspect}"
23
+ def method_missing(key, *_args, &_block)
24
+ raise NoMethodError, "#{key} not found\nyou have:\n#{@table.keys.join(', ')}"
25
25
  end
26
26
 
27
27
  end
@@ -1,3 +1,3 @@
1
1
  class Fetching
2
- VERSION = "0.6.1"
2
+ VERSION = '0.7.0'.freeze
3
3
  end
@@ -0,0 +1,174 @@
1
+ RSpec.describe Fetching::FetchingArray do
2
+
3
+ specify 'a Fetching object as a value' do
4
+ ary = Fetching([1, 2])
5
+ hsh = Fetching(one: 1)
6
+ [ary, hsh].each do |obj|
7
+ fetching_ary = Fetching [obj]
8
+ expect(fetching_ary.first).to equal(obj)
9
+ end
10
+ end
11
+
12
+ specify '#map' do
13
+ ary = [1, 2]
14
+ fetching_ary = Fetching(ary)
15
+ expect(fetching_ary.map(&:to_s)).to eq(%w(1 2))
16
+ end
17
+
18
+ specify 'Fetching goes deep' do
19
+ Fetching([{ one: 1 }]).each do |element|
20
+ expect(element.one).to eq(1)
21
+ end
22
+ end
23
+
24
+ describe '#first' do
25
+ it 'returns the first element in the array' do
26
+ ary = []
27
+ sassy_ary = Fetching(ary)
28
+ expect { sassy_ary.first }.to raise_error(IndexError)
29
+ end
30
+
31
+ context 'when passed an amount to fetch the first of' do
32
+ it 'returns the first n elements' do
33
+ ary = [1, 2, 3]
34
+ sassy_ary = Fetching(ary)
35
+ expect(sassy_ary.first(2)).to eq([1, 2])
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '#[]' do
41
+ let(:array) { [1, 2, 3] }
42
+ let(:fetching) { Fetching(array) }
43
+
44
+ it 'returns the specified index' do
45
+ expect(fetching[0]).to eq(1)
46
+ expect(fetching[1]).to eq(2)
47
+ expect(fetching[2]).to eq(3)
48
+ end
49
+
50
+ it 'throws an error on an invalid index' do
51
+ expect { fetching[5] }.to raise_error(IndexError)
52
+ end
53
+
54
+ context 'with multiple values' do
55
+ it 'returns a fetching array of the results' do
56
+ expected = Fetching([1, 2])
57
+ expect(fetching[0, 1]).to eq(expected)
58
+ end
59
+
60
+ it 'raises error on invalid index' do
61
+ expect { fetching[0, 5] }.to raise_error(IndexError)
62
+ end
63
+ end
64
+
65
+ context 'with a Range' do
66
+ it 'returns a fetching array of the results' do
67
+ expected = Fetching([1, 2])
68
+ expect(fetching[0..1]).to eq(expected)
69
+ end
70
+
71
+ it 'raises error on invalid index' do
72
+ expect { fetching[0..5] }.to raise_error(IndexError)
73
+ end
74
+ end
75
+
76
+ context 'with multiple ranges' do
77
+ it 'returns a fetching array of the results' do
78
+ expected = Fetching([1, 2, 3, 3])
79
+ expect(fetching[0..2, 2..2]).to eq(expected)
80
+ end
81
+
82
+ it 'raises error on invalid index' do
83
+ expect { fetching[0..1, 5..5] }.to raise_error(IndexError)
84
+ end
85
+ end
86
+ end
87
+
88
+ describe 'array methods' do
89
+ let(:array) { [1, 2, 3] }
90
+ let(:fetching) { Fetching(array) }
91
+
92
+ describe '#empty?' do
93
+ it('is false') { expect(fetching.empty?).to be_falsy }
94
+
95
+ context 'when empty' do
96
+ let(:array) { [] }
97
+ it('is true') { expect(fetching.empty?).to be_truthy }
98
+ end
99
+ end
100
+
101
+ specify '#length' do
102
+ expect(fetching.length).to eq(array.length)
103
+ expect(fetching.size).to eq(array.size)
104
+ end
105
+
106
+ specify '#reverse' do
107
+ reversed = Fetching(array.reverse)
108
+ expect(fetching.reverse).to eq(reversed)
109
+ end
110
+
111
+ specify '#shuffle' do
112
+ seed = 1
113
+ shuffled = Fetching(array.shuffle(random: Random.new(seed)))
114
+ expect(fetching.shuffle(random: Random.new(seed))).to eq(shuffled)
115
+ end
116
+
117
+ specify '#sort' do
118
+ sorter = ->(x, y) { y <=> x }
119
+ sorted = Fetching(array.sort(&sorter))
120
+ expect(fetching.sort(&sorter)).to eq(sorted)
121
+ end
122
+
123
+ specify '#sort_by' do
124
+ sorter = ->(i) { 1.0 / i }
125
+ sorted = Fetching(array.sort_by(&sorter))
126
+ expect(fetching.sort_by(&sorter)).to eq(sorted)
127
+ end
128
+
129
+ describe '#values_at' do
130
+ specify 'happy path' do
131
+ at = [0, 2]
132
+ values = Fetching(array.values_at(*at))
133
+ expect(fetching.values_at(*at)).to eq(values)
134
+ end
135
+
136
+ specify 'out of bounds' do
137
+ at = 5
138
+ expected_message = /\Aindex #{at} out/
139
+ expect { fetching.values_at(at) }.to raise_error(IndexError, expected_message)
140
+ end
141
+
142
+ context 'with a range' do
143
+ it 'returns the expected values' do
144
+ range = (0..2)
145
+ values = Fetching(array.values_at(range))
146
+ expect(fetching.values_at(range)).to eq(values)
147
+ end
148
+
149
+ it 'correctly throws when range exceeds array' do
150
+ range = (0..5)
151
+ expect { fetching.values_at(range) }.to raise_error(IndexError)
152
+ end
153
+ end
154
+
155
+ context 'with multiple ranges' do
156
+ let(:array) { [1, 2, 3, 4, 5] }
157
+
158
+ it 'returns the proper values' do
159
+ range_1 = (0..2)
160
+ range_2 = (2..4)
161
+ expected = Fetching([1, 2, 3, 3, 4, 5])
162
+ values = Fetching(array.values_at(range_1, range_2))
163
+ expect(values).to eq(expected)
164
+ end
165
+
166
+ it 'correctly throws when range exceeds array' do
167
+ range_1 = (0..2)
168
+ range_2 = (2..7)
169
+ expect { fetching.values_at(range_1, range_2) }.to raise_error(IndexError)
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
@@ -1,8 +1,6 @@
1
- require "spec_helper"
1
+ RSpec.describe Fetching::FetchingHash do
2
2
 
3
- describe Fetching::FetchingHash do
4
-
5
- specify "a Fetching object as a value" do
3
+ specify 'a Fetching object as a value' do
6
4
  ary = Fetching([1, 2])
7
5
  hsh = Fetching(one: 1)
8
6
  [ary, hsh].each do |obj|
@@ -11,7 +9,7 @@ describe Fetching::FetchingHash do
11
9
  end
12
10
  end
13
11
 
14
- specify "#to_hash" do
12
+ specify '#to_hash' do
15
13
  hash = { one: 1, two: 2 }
16
14
  fetching_hash = Fetching(hash)
17
15
  expect(fetching_hash.to_hash).to eq(hash)
@@ -20,11 +18,11 @@ describe Fetching::FetchingHash do
20
18
  specify "#to_hash doesn't allow you to break fetching" do
21
19
  fetching_hash = Fetching(one: 1, two: 2)
22
20
  hash = fetching_hash.to_hash
23
- hash[:one] = ":)"
21
+ hash[:one] = ':)'
24
22
  expect(fetching_hash.to_hash[:one]).to eq(1)
25
23
  end
26
24
 
27
- specify "#to_hash does a deep copy" do
25
+ specify '#to_hash does a deep copy' do
28
26
  hash = { one: 1, two: { three: 3 } }
29
27
  fetching_hash = Fetching(hash)
30
28
  expect(fetching_hash.to_hash).to eq(hash)
@@ -1,52 +1,57 @@
1
- require "spec_helper"
2
-
3
- describe Fetching do
1
+ RSpec.describe Fetching do
4
2
 
5
3
  let(:input) { { one: 1, two: two, ary: ary, object_ary: object_ary } }
6
- let(:two) { { "two" => 2 } }
4
+ let(:two) { { 'two' => 2 } }
7
5
  let(:ary) { [1, 2] }
8
6
  let(:object_ary) { [{}, last_object] }
9
7
  let(:last_object) { { three: 3 } }
10
8
 
11
9
  subject { Fetching(input) }
12
- specify("#one") { expect(subject.one).to eq(1) }
13
- specify("#two") { expect(subject.two).to eq(Fetching(two)) }
14
- specify("#ary") { expect(subject.ary).to eq(Fetching(ary)) }
15
- specify "objects in arrays" do
10
+ specify('#one') { expect(subject.one).to eq(1) }
11
+ specify('#two') { expect(subject.two).to eq(Fetching(two)) }
12
+ specify('#ary') { expect(subject.ary).to eq(Fetching(ary)) }
13
+ specify 'objects in arrays' do
16
14
  expect(subject.object_ary[1].three).to eq(3)
17
15
  end
18
16
 
19
- describe "an unknown hash key" do
20
- it "raises NoMethodError" do
21
- expected_message = <<-EOM.gsub(/^ +/, "").strip
17
+ describe 'an unknown hash key' do
18
+ it 'raises NoMethodError' do
19
+ expected_message = <<-EOM.gsub(/^ +/, '').strip
22
20
  not_a_key not found
23
21
  you have:
24
- {:one=>1, :two=>{\"two\"=>2}, :ary=>[1, 2], :object_ary=>[{}, {:three=>3}]}
22
+ one, two, ary, object_ary
25
23
  EOM
26
24
 
27
25
  expect { subject.not_a_key }.to raise_error(NoMethodError, expected_message)
28
26
  end
29
27
  end
30
28
 
31
- describe "an unknown array index" do
32
- it "raises NoMethodError" do
33
- expected_message = "index 3 outside of array bounds: -2...2"
29
+ describe 'an unknown array index' do
30
+ it 'raises NoMethodError' do
31
+ expected_message = /\Aindex 3 out/
34
32
  expect { subject.ary[ary.size + 1] }.to raise_error(IndexError, expected_message)
35
33
  end
36
34
  end
37
35
 
38
- it "has a nice #to_s" do
39
- nice_to_s = "{:one=>1, :two=>{\"two\"=>2}, :ary=>[1, 2], :object_ary=>[{}, {:three=>3}]}"
36
+ it 'can be #tap()ed' do
37
+ f = Fetching(foo: 'bar')
38
+ f.tap do |fetching_obj|
39
+ expect(fetching_obj).to eq(f)
40
+ end
41
+ end
42
+
43
+ it 'has a nice #to_s' do
44
+ nice_to_s = '{:one=>1, :two=>{"two"=>2}, :ary=>[1, 2], :object_ary=>[{}, {:three=>3}]}'
40
45
  expect(subject.to_s).to eq(nice_to_s)
41
46
  end
42
47
 
43
- it "has a nice #inspect" do
44
- table = "{:one=>1, :two=>{\"two\"=>2}, :ary=>[1, 2], :object_ary=>[{}, {:three=>3}]}"
48
+ it 'has a nice #inspect' do
49
+ table = '{:one=>1, :two=>{"two"=>2}, :ary=>[1, 2], :object_ary=>[{}, {:three=>3}]}'
45
50
  nice_inspect = "#<Fetching::FetchingHash: @table=#{table}>"
46
51
  expect(subject.inspect).to eq(nice_inspect)
47
52
  end
48
53
 
49
- specify ".from_json" do
54
+ specify '.from_json' do
50
55
  json = '{ "some_key": 1 }'
51
56
  expected = Fetching(JSON.parse(json))
52
57
  expect(described_class.from_json(json)).to eq(expected)
@@ -1,13 +1,26 @@
1
- require "fetching"
2
- require "rspec/autorun"
3
- require "pathname"
4
-
5
- Pathname(__FILE__).dirname.join("support").each_child { |f| require f }
1
+ require 'fetching'
6
2
 
7
3
  RSpec.configure do |config|
8
- # Run specs in random order to surface order dependencies. If you find an
9
- # order dependency and want to debug it, you can fix the order by providing
10
- # the seed, which is printed after each run.
11
- # --seed 1234
12
- config.order = "random"
4
+ config.expect_with :rspec do |expectations|
5
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
6
+ end
7
+
8
+ config.mock_with :rspec do |mocks|
9
+ mocks.verify_partial_doubles = true
10
+ end
11
+
12
+ if ENV['CI']
13
+ config.before(:example, :focus) { raise 'Should not commit focused specs' }
14
+ else
15
+ config.filter_run :focus
16
+ config.run_all_when_everything_filtered = true
17
+ end
18
+
19
+ config.disable_monkey_patching!
20
+
21
+ config.warnings = true
22
+
23
+ config.order = :random
24
+
25
+ Kernel.srand config.seed
13
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fetching
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Gee
@@ -9,65 +9,121 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-12-17 00:00:00.000000000 Z
12
+ date: 2018-08-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '1.3'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '1.3'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rspec
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.1'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.1'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rubocop
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: 0.58.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 0.58.0
70
+ - !ruby/object:Gem::Dependency
71
+ name: rubocop-rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: guard-rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: guard-rubocop
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
47
103
  - !ruby/object:Gem::Version
48
104
  version: '0'
49
105
  type: :development
50
106
  prerelease: false
51
107
  version_requirements: !ruby/object:Gem::Requirement
52
108
  requirements:
53
- - - '>='
109
+ - - ">="
54
110
  - !ruby/object:Gem::Version
55
111
  version: '0'
56
112
  - !ruby/object:Gem::Dependency
57
- name: pry-plus
113
+ name: pry
58
114
  requirement: !ruby/object:Gem::Requirement
59
115
  requirements:
60
- - - '>='
116
+ - - ">="
61
117
  - !ruby/object:Gem::Version
62
118
  version: '0'
63
119
  type: :development
64
120
  prerelease: false
65
121
  version_requirements: !ruby/object:Gem::Requirement
66
122
  requirements:
67
- - - '>='
123
+ - - ">="
68
124
  - !ruby/object:Gem::Version
69
125
  version: '0'
70
- description: More sass in more structs.
126
+ description: Strict wrapper for Hashes and Arrays that doesn't return nil
71
127
  email:
72
128
  - mgee@covermymeds.com
73
129
  - mlorenz@covermymeds.com
@@ -75,9 +131,12 @@ executables: []
75
131
  extensions: []
76
132
  extra_rdoc_files: []
77
133
  files:
78
- - .gitignore
79
- - .rubocop.yml
134
+ - ".gitignore"
135
+ - ".rspec"
136
+ - ".rubocop.yml"
137
+ - ".travis.yml"
80
138
  - Gemfile
139
+ - Guardfile
81
140
  - LICENSE.txt
82
141
  - README.md
83
142
  - Rakefile
@@ -86,11 +145,10 @@ files:
86
145
  - lib/fetching/fetching_array.rb
87
146
  - lib/fetching/fetching_hash.rb
88
147
  - lib/fetching/version.rb
89
- - spec/fetching_array_spec.rb
90
- - spec/fetching_hash_spec.rb
148
+ - spec/fetching/fetching_array_spec.rb
149
+ - spec/fetching/fetching_hash_spec.rb
91
150
  - spec/fetching_spec.rb
92
151
  - spec/spec_helper.rb
93
- - spec/support/vim_formatter.rb
94
152
  homepage: ''
95
153
  licenses:
96
154
  - MIT
@@ -101,26 +159,23 @@ require_paths:
101
159
  - lib
102
160
  required_ruby_version: !ruby/object:Gem::Requirement
103
161
  requirements:
104
- - - '>='
162
+ - - ">="
105
163
  - !ruby/object:Gem::Version
106
164
  version: '0'
107
165
  required_rubygems_version: !ruby/object:Gem::Requirement
108
166
  requirements:
109
- - - '>='
167
+ - - ">="
110
168
  - !ruby/object:Gem::Version
111
169
  version: '0'
112
170
  requirements: []
113
171
  rubyforge_project:
114
- rubygems_version: 2.4.4
172
+ rubygems_version: 2.7.6
115
173
  signing_key:
116
174
  specification_version: 4
117
- summary: 'This gem is a work in progress. The implementation code is not what''s
118
- important. What is important: Don''t de-serialize API responses in to hashes and
119
- arrays. Use a "strict" object that inforces key presence, and array bounds.}'
175
+ summary: Don't de-serialize API responses in to hashes and arrays. Use a "strict"
176
+ object that inforces key presence and array bounds.
120
177
  test_files:
121
- - spec/fetching_array_spec.rb
122
- - spec/fetching_hash_spec.rb
178
+ - spec/fetching/fetching_array_spec.rb
179
+ - spec/fetching/fetching_hash_spec.rb
123
180
  - spec/fetching_spec.rb
124
181
  - spec/spec_helper.rb
125
- - spec/support/vim_formatter.rb
126
- has_rdoc:
@@ -1,88 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Fetching::FetchingArray do
4
-
5
- specify "a Fetching object as a value" do
6
- ary = Fetching([1, 2])
7
- hsh = Fetching(one: 1)
8
- [ary, hsh].each do |obj|
9
- fetching_ary = Fetching [obj]
10
- expect(fetching_ary.first).to equal(obj)
11
- end
12
- end
13
-
14
- specify "#map" do
15
- ary = [1, 2]
16
- fetching_ary = Fetching(ary)
17
- expect(fetching_ary.map(&:to_s)).to eq(%w(1 2))
18
- end
19
-
20
- specify "Fetching should go deep" do
21
- Fetching([{ one: 1 }]).each do |element|
22
- expect(element.one).to eq(1)
23
- end
24
- end
25
-
26
- specify "#first" do
27
- ary = []
28
- sassy_ary = Fetching(ary)
29
- expect { sassy_ary.first }.to raise_error(IndexError)
30
- end
31
-
32
- describe "array methods" do
33
- let(:array) { [1, 2, 3] }
34
- let(:fetching) { Fetching(array) }
35
-
36
- describe "#empty?" do
37
- it("should be false") { expect(fetching.empty?).to be_falsy }
38
-
39
- context "when empty" do
40
- let(:array) { [] }
41
- it("should be true") { expect(fetching.empty?).to be_truthy }
42
- end
43
- end
44
-
45
- specify "#length" do
46
- expect(fetching.length).to eq(array.length)
47
- expect(fetching.size).to eq(array.size)
48
- end
49
-
50
- specify "#reverse" do
51
- reversed = Fetching(array.reverse)
52
- expect(fetching.reverse).to eq(reversed)
53
- end
54
-
55
- specify "#shuffle" do
56
- seed = 1
57
- shuffled = Fetching(array.shuffle(random: Random.new(seed)))
58
- expect(fetching.shuffle(random: Random.new(seed))).to eq(shuffled)
59
- end
60
-
61
- specify "#sort" do
62
- sorter = ->(x, y) { y <=> x }
63
- sorted = Fetching(array.sort(&sorter))
64
- expect(fetching.sort(&sorter)).to eq(sorted)
65
- end
66
-
67
- specify "#sort_by" do
68
- sorter = ->(i) { 1.0 / i }
69
- sorted = Fetching(array.sort_by(&sorter))
70
- expect(fetching.sort_by(&sorter)).to eq(sorted)
71
- end
72
-
73
- describe "#values_at" do
74
- specify "happy path" do
75
- at = [0, 2]
76
- values = Fetching(array.values_at(*at))
77
- expect(fetching.values_at(*at)).to eq(values)
78
- end
79
- specify "out of bounds" do
80
- at = 5
81
- expected_message = "index #{at} outside of array bounds: -3...3"
82
- expect { fetching.values_at(at) }.to raise_error(IndexError, expected_message)
83
- end
84
- end
85
-
86
- end
87
-
88
- end
@@ -1,35 +0,0 @@
1
- # Adapted from https://github.com/bronson/vim-runtest/blob/master/rspec_formatter.rb.
2
- require "rspec/core/formatters/base_text_formatter"
3
-
4
- class VimFormatter < RSpec::Core::Formatters::BaseTextFormatter
5
-
6
- def example_failed example
7
- exception = example.execution_result[:exception]
8
- path = Regexp.last_match[1] if exception.backtrace.find do |frame|
9
- frame =~ %r{\b(spec/.*_spec\.rb:\d+)(?::|\z)}
10
- end
11
- message = format_message exception.message
12
- path = format_caller(path || " ")
13
- output.puts "#{path}: #{example.example_group.description.strip} " \
14
- "#{example.description.strip}: #{message.strip}" if path
15
- end
16
-
17
- def example_pending *_args; end
18
-
19
- def dump_failures *_args; end
20
-
21
- def dump_pending *_args; end
22
-
23
- def message _msg; end
24
-
25
- def dump_summary *_args; end
26
-
27
- def seed *_args; end
28
-
29
- private
30
-
31
- def format_message msg
32
- msg.gsub("\n", " ")[0, 80]
33
- end
34
-
35
- end