axiom-types 0.0.2 → 0.0.3

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.
Files changed (47) hide show
  1. data/.rspec +1 -0
  2. data/.travis.yml +11 -16
  3. data/Gemfile +5 -2
  4. data/Gemfile.devtools +19 -24
  5. data/Guardfile +18 -10
  6. data/README.md +5 -28
  7. data/axiom-types.gemspec +2 -3
  8. data/config/flay.yml +2 -2
  9. data/config/flog.yml +1 -1
  10. data/config/reek.yml +15 -13
  11. data/config/rubocop.yml +62 -0
  12. data/lib/axiom/types.rb +5 -3
  13. data/lib/axiom/types/boolean.rb +4 -2
  14. data/lib/axiom/types/collection.rb +5 -2
  15. data/lib/axiom/types/encodable.rb +1 -1
  16. data/lib/axiom/types/float.rb +3 -0
  17. data/lib/axiom/types/hash.rb +8 -3
  18. data/lib/axiom/types/length_comparable.rb +7 -4
  19. data/lib/axiom/types/numeric.rb +5 -0
  20. data/lib/axiom/types/object.rb +2 -2
  21. data/lib/axiom/types/support/infinity.rb +116 -0
  22. data/lib/axiom/types/support/options.rb +9 -18
  23. data/lib/axiom/types/time.rb +2 -2
  24. data/lib/axiom/types/type.rb +13 -9
  25. data/lib/axiom/types/value_comparable.rb +5 -2
  26. data/lib/axiom/types/version.rb +1 -1
  27. data/spec/unit/axiom/types/boolean/class_methods/infer_spec.rb +6 -0
  28. data/spec/unit/axiom/types/collection/class_methods/finalize_spec.rb +3 -3
  29. data/spec/unit/axiom/types/encodable/class_methods/extended_spec.rb +8 -7
  30. data/spec/unit/axiom/types/encodable/finalize_spec.rb +30 -8
  31. data/spec/unit/axiom/types/hash/class_methods/infer_spec.rb +17 -17
  32. data/spec/unit/axiom/types/infinity/class_methods/coerce_spec.rb +64 -0
  33. data/spec/unit/axiom/types/infinity/class_methods/spaceship_operator_spec.rb +67 -0
  34. data/spec/unit/axiom/types/infinity/class_methods/succ_spec.rb +11 -0
  35. data/spec/unit/axiom/types/length_comparable/class_methods/extended_spec.rb +17 -8
  36. data/spec/unit/axiom/types/negative_infinity/class_methods/spaceship_operator_spec.rb +67 -0
  37. data/spec/unit/axiom/types/object/class_methods/coercion_method_spec.rb +2 -2
  38. data/spec/unit/axiom/types/object/class_methods/infer_spec.rb +13 -1
  39. data/spec/unit/axiom/types/object/class_methods/primitive_spec.rb +4 -4
  40. data/spec/unit/axiom/types/options/accept_options_spec.rb +12 -4
  41. data/spec/unit/axiom/types/options/inherited_spec.rb +10 -36
  42. data/spec/unit/axiom/types/type/class_methods/constraint_spec.rb +6 -11
  43. data/spec/unit/axiom/types/type/class_methods/include_predicate_spec.rb +7 -7
  44. data/spec/unit/axiom/types/type/class_methods/includes_spec.rb +2 -2
  45. data/spec/unit/axiom/types/value_comparable/class_methods/extended_spec.rb +17 -8
  46. metadata +29 -31
  47. checksums.yaml +0 -7
data/.rspec CHANGED
@@ -1,4 +1,5 @@
1
1
  --color
2
2
  --format progress
3
3
  --profile
4
+ --warnings
4
5
  --order random
@@ -3,29 +3,24 @@ before_install: gem install bundler
3
3
  bundler_args: --without yard guard benchmarks
4
4
  script: "bundle exec rake ci"
5
5
  rvm:
6
- - ree
7
- - 1.8.7
8
- - 1.9.2
9
6
  - 1.9.3
10
7
  - 2.0.0
11
8
  - ruby-head
12
- - rbx-18mode
13
9
  - rbx-19mode
14
- - jruby-18mode
15
- notifications:
16
- irc:
17
- channels:
18
- - irc.freenode.org#rom-rb
19
- on_success: never
20
- on_failure: change
21
- email:
22
- recipients:
23
- - dan.kubb@gmail.com
24
- on_success: never
25
- on_failure: change
26
10
  matrix:
27
11
  include:
28
12
  - rvm: jruby-19mode
29
13
  env: JRUBY_OPTS="$JRUBY_OPTS --debug"
30
14
  - rvm: jruby-head
31
15
  env: JRUBY_OPTS="$JRUBY_OPTS --debug"
16
+ allow_failures:
17
+ - rvm: 1.9.3 # mutant fails
18
+ - rvm: 2.0.0 # mutant fails
19
+ - rvm: ruby-head # travis broken
20
+ - rvm: rbx-19mode # mutant fails
21
+ notifications:
22
+ irc:
23
+ channels:
24
+ - irc.freenode.org#rom-rb
25
+ on_success: never
26
+ on_failure: change
data/Gemfile CHANGED
@@ -4,5 +4,8 @@ source 'https://rubygems.org'
4
4
 
5
5
  gemspec
6
6
 
7
- gem 'devtools', :git => 'https://github.com/rom-rb/devtools.git'
8
- eval File.read('Gemfile.devtools')
7
+ group :development, :test do
8
+ gem 'devtools', git: 'https://github.com/rom-rb/devtools.git'
9
+ end
10
+
11
+ eval_gemfile 'Gemfile.devtools'
@@ -2,50 +2,45 @@
2
2
 
3
3
  group :development do
4
4
  gem 'rake', '~> 10.1.0'
5
- gem 'rspec', '~> 2.13.0'
6
- gem 'yard', '~> 0.8.6.1'
5
+ gem 'rspec', '~> 2.14.1'
6
+ gem 'yard', '~> 0.8.7'
7
7
  end
8
8
 
9
9
  group :yard do
10
- gem 'kramdown', '~> 1.0.1'
10
+ gem 'kramdown', '~> 1.1.0'
11
11
  end
12
12
 
13
13
  group :guard do
14
14
  gem 'guard', '~> 1.8.1'
15
15
  gem 'guard-bundler', '~> 1.0.0'
16
16
  gem 'guard-rspec', '~> 3.0.2'
17
+ gem 'guard-rubocop', '~> 0.2.0'
18
+ gem 'guard-mutant', '~> 0.0.1'
17
19
 
18
20
  # file system change event handling
19
- gem 'listen', '~> 1.2.2'
20
- gem 'rb-fchange', '~> 0.0.6', :require => false
21
- gem 'rb-fsevent', '~> 0.9.3', :require => false
22
- gem 'rb-inotify', '~> 0.9.0', :require => false
21
+ gem 'listen', '~> 1.3.0'
22
+ gem 'rb-fchange', '~> 0.0.6', require: false
23
+ gem 'rb-fsevent', '~> 0.9.3', require: false
24
+ gem 'rb-inotify', '~> 0.9.0', require: false
23
25
 
24
26
  # notification handling
25
- gem 'libnotify', '~> 0.8.0', :require => false
26
- gem 'rb-notifu', '~> 0.0.4', :require => false
27
- gem 'terminal-notifier-guard', '~> 1.5.3', :require => false
27
+ gem 'libnotify', '~> 0.8.0', require: false
28
+ gem 'rb-notifu', '~> 0.0.4', require: false
29
+ gem 'terminal-notifier-guard', '~> 1.5.3', require: false
28
30
  end
29
31
 
30
32
  group :metrics do
31
- gem 'backports', '~> 3.3', '>= 3.3.2'
32
33
  gem 'coveralls', '~> 0.6.7'
33
- gem 'flay', '~> 2.3.0'
34
- gem 'flog', '~> 4.1.0'
35
- gem 'reek', '~> 1.3.1', :git => 'https://github.com/troessner/reek.git'
34
+ gem 'flay', '~> 2.4.0'
35
+ gem 'flog', '~> 4.1.1'
36
+ gem 'reek', '~> 1.3.2'
37
+ gem 'rubocop', '~> 0.11.0'
36
38
  gem 'simplecov', '~> 0.7.1'
37
- gem 'yardstick', '~> 0.9.6'
38
-
39
- platforms :ruby_19 do
40
- gem 'yard-spellcheck', '~> 0.1.5'
41
- end
39
+ gem 'yardstick', '~> 0.9.7', git: 'https://github.com/dkubb/yardstick.git'
42
40
 
43
41
  platforms :ruby_19, :ruby_20 do
44
- gem 'mutant', '~> 0.3.0.beta4'
45
- end
46
-
47
- platforms :rbx do
48
- gem 'pelusa', '~> 0.2.2'
42
+ gem 'mutant', git: 'https://github.com/mbj/mutant.git'
43
+ gem 'yard-spellcheck', '~> 0.1.5'
49
44
  end
50
45
  end
51
46
 
data/Guardfile CHANGED
@@ -2,23 +2,31 @@
2
2
 
3
3
  guard :bundler do
4
4
  watch('Gemfile')
5
- watch('axiom-types.gemspec')
5
+ watch('Gemfile.lock')
6
+ watch(%w{.+.gemspec\z})
6
7
  end
7
8
 
8
- guard :rspec, :keep_failed => false do
9
- # run all specs if configuration is modified
9
+ guard :rspec, cli: File.read('.rspec').split.push('--fail-fast').join(' '), keep_failed: false do
10
+ # Run all specs if configuration is modified
11
+ watch('.rspec') { 'spec' }
10
12
  watch('Guardfile') { 'spec' }
11
13
  watch('Gemfile.lock') { 'spec' }
12
14
  watch('spec/spec_helper.rb') { 'spec' }
13
15
 
14
- # run all specs if supporting files files are modified
15
- watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
16
+ # Run all specs if supporting files files are modified
17
+ watch(%r{\Aspec/(?:fixtures|lib|support|shared)/.+\.rb\z}) { 'spec' }
16
18
 
17
- # run unit specs if associated lib code is modified
18
- watch(%r{\Alib/(.+)\.rb\z}) { |m| Dir["spec/unit/#{m[1]}"] }
19
- watch(%r{\Alib/(.+)/support/(.+)\.rb\z}) { |m| Dir["spec/unit/#{m[1]}/#{m[2]}"] }
20
- watch("lib/#{File.basename(File.expand_path('../', __FILE__))}.rb") { 'spec' }
19
+ # Run unit specs if associated lib code is modified
20
+ watch(%r{\Alib/(.+)\.rb\z}) { |m| Dir["spec/unit/#{m[1]}*"] }
21
+ watch(%r{\Alib/(.+)/support/(.+)\.rb\z}) { |m| Dir["spec/unit/#{m[1]}/#{m[2]}*"] }
22
+ watch("lib/#{File.basename(File.expand_path('../', __FILE__))}.rb") { 'spec' }
21
23
 
22
- # run a spec if it is modified
24
+ # Run a spec if it is modified
23
25
  watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
24
26
  end
27
+
28
+ guard :rubocop, cli: %w[--config config/rubocop.yml] do
29
+ watch(%r{.+\.(?:rb|rake)\z})
30
+ watch(%r{\Aconfig/rubocop\.yml\z}) { |m| File.dirname(m[0]) }
31
+ watch(%r{(?:.+/)?\.rubocop\.yml\z}) { |m| File.dirname(m[0]) }
32
+ end
data/README.md CHANGED
@@ -1,3 +1,8 @@
1
+ axiom-types
2
+ ===========
3
+
4
+ Define types with optional constraints for use within axiom and other libraries.
5
+
1
6
  [![Gem Version](https://badge.fury.io/rb/axiom-types.png)][gem]
2
7
  [![Build Status](https://secure.travis-ci.org/dkubb/axiom-types.png?branch=master)][travis]
3
8
  [![Dependency Status](https://gemnasium.com/dkubb/axiom-types.png)][gemnasium]
@@ -10,11 +15,6 @@
10
15
  [codeclimate]: https://codeclimate.com/github/dkubb/axiom-types
11
16
  [coveralls]: https://coveralls.io/r/dkubb/axiom-types
12
17
 
13
- axiom-types
14
- ===========
15
-
16
- Define types with optional constraints for use within axiom and other libraries.
17
-
18
18
  Examples
19
19
  --------
20
20
 
@@ -35,29 +35,6 @@ Name.include?('') # => false
35
35
  Name.include?('a' * 31) # => false
36
36
  ```
37
37
 
38
- Installation
39
- ------------
40
-
41
- With Rubygems:
42
-
43
- ```bash
44
- $ gem install axiom-types
45
- $ irb -rubygems
46
- >> require 'axiom-types'
47
- => true
48
- ```
49
-
50
- With git and local working copy:
51
-
52
- ```bash
53
- $ git clone git://github.com/dkubb/axiom-types.git
54
- $ cd axiom-types
55
- $ rake install
56
- $ irb -rubygems
57
- >> require 'axiom-types'
58
- => true
59
- ```
60
-
61
38
  Contributing
62
39
  -------------
63
40
 
@@ -17,9 +17,8 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = `git ls-files -- spec/unit`.split($/)
18
18
  gem.extra_rdoc_files = %w[LICENSE README.md TODO]
19
19
 
20
- gem.add_runtime_dependency('backports', '~> 3.3', '>= 3.3.2')
21
- gem.add_runtime_dependency('descendants_tracker', '~> 0.0.1')
22
- gem.add_runtime_dependency('ice_nine', '~> 0.8.0')
20
+ gem.add_dependency('descendants_tracker', '~> 0.0.1')
21
+ gem.add_dependency('ice_nine', '~> 0.9')
23
22
 
24
23
  gem.add_development_dependency('bundler', '~> 1.3', '>= 1.3.5')
25
24
  end
@@ -1,3 +1,3 @@
1
1
  ---
2
- threshold: 14
3
- total_score: 135
2
+ threshold: 19
3
+ total_score: 142
@@ -1,2 +1,2 @@
1
1
  ---
2
- threshold: 9.1
2
+ threshold: 10.0
@@ -18,7 +18,8 @@ DataClump:
18
18
  min_clump_size: 2
19
19
  DuplicateMethodCall:
20
20
  enabled: true
21
- exclude: []
21
+ exclude:
22
+ - Axiom::Types::Infinity#self.coerce
22
23
  max_calls: 1
23
24
  allow_calls: []
24
25
  FeatureEnvy:
@@ -52,7 +53,8 @@ NilCheck:
52
53
  - Axiom::Types::Type#self.constraint
53
54
  RepeatedConditional:
54
55
  enabled: true
55
- exclude: []
56
+ exclude:
57
+ - Axiom::Types::Infinity
56
58
  max_ifs: 1
57
59
  TooManyInstanceVariables:
58
60
  enabled: true
@@ -71,32 +73,32 @@ UncommunicativeMethodName:
71
73
  enabled: true
72
74
  exclude: []
73
75
  reject:
74
- - !ruby/regexp /^[a-z]$/
75
- - !ruby/regexp /[0-9]$/
76
- - !ruby/regexp /[A-Z]/
76
+ - !ruby/regexp /^[a-z]$/
77
+ - !ruby/regexp /[0-9]$/
78
+ - !ruby/regexp /[A-Z]/
77
79
  accept: []
78
80
  UncommunicativeModuleName:
79
81
  enabled: true
80
82
  exclude: []
81
83
  reject:
82
- - !ruby/regexp /^.$/
83
- - !ruby/regexp /[0-9]$/
84
+ - !ruby/regexp /^.$/
85
+ - !ruby/regexp /[0-9]$/
84
86
  accept: []
85
87
  UncommunicativeParameterName:
86
88
  enabled: true
87
89
  exclude: []
88
90
  reject:
89
- - !ruby/regexp /^.$/
90
- - !ruby/regexp /[0-9]$/
91
- - !ruby/regexp /[A-Z]/
91
+ - !ruby/regexp /^.$/
92
+ - !ruby/regexp /[0-9]$/
93
+ - !ruby/regexp /[A-Z]/
92
94
  accept: []
93
95
  UncommunicativeVariableName:
94
96
  enabled: true
95
97
  exclude: []
96
98
  reject:
97
- - !ruby/regexp /^.$/
98
- - !ruby/regexp /[0-9]$/
99
- - !ruby/regexp /[A-Z]/
99
+ - !ruby/regexp /^.$/
100
+ - !ruby/regexp /[0-9]$/
101
+ - !ruby/regexp /[A-Z]/
100
102
  accept: []
101
103
  UnusedParameters:
102
104
  enabled: true
@@ -0,0 +1,62 @@
1
+ AllCops:
2
+ Includes:
3
+ - '../**/*.rake'
4
+ - 'Gemfile'
5
+ - 'Gemfile.devtools'
6
+ Excludes:
7
+ - '**/vendor/**'
8
+ - '**/benchmarks/**'
9
+
10
+ # Avoid parameter lists longer than five parameters.
11
+ ParameterLists:
12
+ Max: 3
13
+ CountKeywordArgs: true
14
+
15
+ # Avoid more than `Max` levels of nesting.
16
+ BlockNesting:
17
+ Max: 3
18
+
19
+ # Align with the style guide.
20
+ CollectionMethods:
21
+ PreferredMethods:
22
+ collect: 'map'
23
+ inject: 'reduce'
24
+ find: 'detect'
25
+ find_all: 'select'
26
+
27
+ # Do not force public/protected/private keyword to be indented at the same
28
+ # level as the def keyword. My personal preference is to outdent these keywords
29
+ # because I think when scanning code it makes it easier to identify the
30
+ # sections of code and visually separate them. When the keyword is at the same
31
+ # level I think it sort of blends in with the def keywords and makes it harder
32
+ # to scan the code and see where the sections are.
33
+ AccessControl:
34
+ Enabled: false
35
+
36
+ # Limit line length
37
+ LineLength:
38
+ Max: 79
39
+
40
+ # Disable documentation checking until a class needs to be documented once
41
+ Documentation:
42
+ Enabled: false
43
+
44
+ # Do not always use &&/|| instead of and/or.
45
+ AndOr:
46
+ Enabled: false
47
+
48
+ # Do not favor modifier if/unless usage when you have a single-line body
49
+ IfUnlessModifier:
50
+ Enabled: false
51
+
52
+ # Allow case equality operator (in limited use within the specs)
53
+ CaseEquality:
54
+ Enabled: false
55
+
56
+ # Constants do not always have to use SCREAMING_SNAKE_CASE
57
+ ConstantName:
58
+ Enabled: false
59
+
60
+ # Not all trivial readers/writers can be defined with attr_* methods
61
+ TrivialAccessors:
62
+ Enabled: false
@@ -4,11 +4,12 @@ require 'bigdecimal'
4
4
  require 'date'
5
5
  require 'set'
6
6
 
7
- require 'backports'
8
7
  require 'ice_nine'
9
8
  require 'descendants_tracker'
10
9
 
11
10
  module Axiom
11
+
12
+ # Gem namespace
12
13
  module Types
13
14
 
14
15
  # Represent an undefined argument
@@ -23,8 +24,8 @@ module Axiom
23
24
  # Cache the type inference lookup by object
24
25
  @inference_cache = Hash.new do |cache, object|
25
26
  type = nil
26
- Type.descendants.each do |descendant|
27
- break if type = descendant.infer(object)
27
+ Type.descendants.detect do |descendant|
28
+ type = descendant.infer(object)
28
29
  end
29
30
  cache[object] = type
30
31
  end
@@ -60,6 +61,7 @@ module Axiom
60
61
  end # module Types
61
62
  end # module Axiom
62
63
 
64
+ require 'axiom/types/support/infinity'
63
65
  require 'axiom/types/support/options'
64
66
 
65
67
  require 'axiom/types/value_comparable'
@@ -20,8 +20,10 @@ module Axiom
20
20
  #
21
21
  # @api private
22
22
  def self.infer_from_primitive_class(object)
23
- self if TrueClass.singleton_class === object ||
24
- FalseClass.singleton_class === object
23
+ case object
24
+ when TrueClass.singleton_class, FalseClass.singleton_class
25
+ self
26
+ end
25
27
  end
26
28
 
27
29
  private_class_method :infer_from_primitive_class
@@ -76,6 +76,7 @@ module Axiom
76
76
  member_type = Types.infer(member) || Object
77
77
  infer_from(member_type) || new_from(member_type)
78
78
  end
79
+ private_class_method :infer_from_primitive_instance
79
80
 
80
81
  # Infer the type from the member_type
81
82
  #
@@ -90,6 +91,7 @@ module Axiom
90
91
  def self.infer_from(member_type)
91
92
  self if self.member_type.equal?(member_type)
92
93
  end
94
+ private_class_method :infer_from
93
95
 
94
96
  # Instantiate a new type from a base type
95
97
  #
@@ -104,6 +106,7 @@ module Axiom
104
106
  def self.new_from(member_type)
105
107
  new { member_type(member_type) } if base?
106
108
  end
109
+ private_class_method :new_from
107
110
 
108
111
  # Test if the type is a base type
109
112
  #
@@ -113,6 +116,7 @@ module Axiom
113
116
  def self.base?
114
117
  # noop
115
118
  end
119
+ private_class_method :base?
116
120
 
117
121
  # Add a constraints for the member
118
122
  #
@@ -125,8 +129,7 @@ module Axiom
125
129
  end
126
130
  end
127
131
 
128
- private_class_method :infer_from_primitive_instance, :infer_from,
129
- :new_from, :base?, :matches_member_type
132
+ private_class_method :matches_member_type
130
133
 
131
134
  end # class Collection
132
135
  end # module Types