attr_object 0.0.1

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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +34 -0
  4. data/lib/attr_object.rb +49 -0
  5. data/lib/attr_object/version.rb +3 -0
  6. data/lib/tasks/attr_object_tasks.rake +4 -0
  7. data/test/dummy/README.rdoc +28 -0
  8. data/test/dummy/Rakefile +6 -0
  9. data/test/dummy/app/assets/javascripts/application.js +13 -0
  10. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  11. data/test/dummy/app/attr_objects/phone_value.rb +28 -0
  12. data/test/dummy/app/attr_objects/position_value.rb +15 -0
  13. data/test/dummy/app/controllers/application_controller.rb +5 -0
  14. data/test/dummy/app/helpers/application_helper.rb +2 -0
  15. data/test/dummy/app/models/user.rb +4 -0
  16. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  17. data/test/dummy/bin/bundle +3 -0
  18. data/test/dummy/bin/rails +4 -0
  19. data/test/dummy/bin/rake +4 -0
  20. data/test/dummy/bin/setup +29 -0
  21. data/test/dummy/config.ru +4 -0
  22. data/test/dummy/config/application.rb +25 -0
  23. data/test/dummy/config/boot.rb +5 -0
  24. data/test/dummy/config/database.yml +25 -0
  25. data/test/dummy/config/environment.rb +5 -0
  26. data/test/dummy/config/environments/development.rb +41 -0
  27. data/test/dummy/config/environments/production.rb +79 -0
  28. data/test/dummy/config/environments/test.rb +42 -0
  29. data/test/dummy/config/initializers/assets.rb +11 -0
  30. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  31. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  32. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  33. data/test/dummy/config/initializers/inflections.rb +16 -0
  34. data/test/dummy/config/initializers/mime_types.rb +4 -0
  35. data/test/dummy/config/initializers/session_store.rb +3 -0
  36. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  37. data/test/dummy/config/locales/en.yml +23 -0
  38. data/test/dummy/config/routes.rb +56 -0
  39. data/test/dummy/config/secrets.yml +22 -0
  40. data/test/dummy/db/development.sqlite3 +0 -0
  41. data/test/dummy/db/migrate/20160110221317_create_users.rb +10 -0
  42. data/test/dummy/db/migrate/20160111012055_add_position_to_users.rb +5 -0
  43. data/test/dummy/db/schema.rb +24 -0
  44. data/test/dummy/db/test.sqlite3 +0 -0
  45. data/test/dummy/log/RAILS_ENV=test.log +0 -0
  46. data/test/dummy/log/development.log +57 -0
  47. data/test/dummy/log/test.log +12699 -0
  48. data/test/dummy/public/404.html +67 -0
  49. data/test/dummy/public/422.html +67 -0
  50. data/test/dummy/public/500.html +66 -0
  51. data/test/dummy/public/favicon.ico +0 -0
  52. data/test/dummy/test/fixtures/users.yml +7 -0
  53. data/test/dummy/test/models/user_test.rb +7 -0
  54. data/test/test_helper.rb +20 -0
  55. data/test/value_object_test.rb +111 -0
  56. metadata +177 -0
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/404.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The page you were looking for doesn't exist.</h1>
62
+ <p>You may have mistyped the address or the page may have moved.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/422.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The change you wanted was rejected.</h1>
62
+ <p>Maybe you tried to change something you didn't have access to.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
@@ -0,0 +1,7 @@
1
+ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
2
+
3
+ one:
4
+ phone: MyString
5
+
6
+ two:
7
+ phone: MyString
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class UserTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,20 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
5
+ ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
6
+ require "rails/test_help"
7
+
8
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
9
+ # to be shown.
10
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
11
+
12
+ # Load support files
13
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
14
+
15
+ # Load fixtures from the engine
16
+ if ActiveSupport::TestCase.respond_to?(:fixture_path=)
17
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
18
+ ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
19
+ ActiveSupport::TestCase.fixtures :all
20
+ end
@@ -0,0 +1,111 @@
1
+ require 'test_helper'
2
+
3
+ require 'minitest/spec'
4
+
5
+ describe AttrObject do
6
+ DEFAULT_PHONE = "959-542-5256"
7
+ DEFAULT_MOBILE = "878-858-5115"
8
+
9
+ def userz(phone: DEFAULT_PHONE, mobile: DEFAULT_MOBILE, position: nil)
10
+ User.new phone: phone, mobile: mobile, position: position
11
+ end
12
+
13
+ let(:user) do
14
+ User.new phone: DEFAULT_PHONE, mobile: DEFAULT_MOBILE
15
+ end
16
+
17
+ it "should be a module" do
18
+ assert_kind_of Module, AttrObject
19
+ end
20
+
21
+ describe "User" do
22
+ it "should have the `attr_object` method" do
23
+ assert User.methods.include?(:attr_object)
24
+ assert ActiveRecord::Base.methods.include?(:attr_object)
25
+ end
26
+ end
27
+
28
+ describe PhoneValue do
29
+ it "should return the right class on the attribute" do
30
+ assert user.phone.is_a?(PhoneValue), "`phone` should be PhoneValue"
31
+ assert user.mobile.is_a?(PhoneValue), "`mobile` should be PhoneValue"
32
+ end
33
+
34
+ it "should call a method from the value object" do
35
+ assert_equal "9595425256", user.phone.unformat
36
+ end
37
+
38
+ it "should be respond to numbering plan" do
39
+ assert_equal "959", user.phone.area_code
40
+ assert_equal "542", user.phone.central_office
41
+ assert_equal "5256", user.phone.subscriber_number
42
+ end
43
+
44
+ describe "with two users" do
45
+ let(:user_2) do
46
+ User.new phone: "111-111-1111"
47
+ end
48
+
49
+ it "two instances should have distinct values" do
50
+ refute_equal user.phone, user_2.phone
51
+ end
52
+
53
+ it "should be sorted on phone.subscriber_number" do
54
+ users = [user, user_2]
55
+ _(users.sort_by(&:phone)).must_equal [user_2, user]
56
+ end
57
+ end
58
+ end
59
+
60
+ describe PositionValue do
61
+ let(:user) do
62
+ User.new position: 0
63
+ end
64
+
65
+ it "`position` should be a PositionValue" do
66
+ _(user.position).must_be_instance_of PositionValue
67
+ end
68
+
69
+ it "`position` should be updated as a `Fixnum`" do
70
+ assert_equal 0, user.position.value
71
+ user.position = 99
72
+ assert user.save
73
+ assert_equal 99, user.reload.position.value
74
+ end
75
+
76
+ it "should update position to next" do
77
+ assert_equal 1, user.position.next!
78
+ assert_equal 1, user.position.value
79
+
80
+ # TODO
81
+ # assert_equal 1, u[:position], "should also be updated"
82
+
83
+ assert user.save
84
+ assert_equal 1, user.reload[:position]
85
+ end
86
+
87
+ it "#to_db" do
88
+ _(user.position.to_db).must_be_instance_of Fixnum
89
+ end
90
+
91
+ it "`reload` should clear cache" do
92
+ user.save
93
+
94
+ user.position.next!
95
+ assert_equal 1, user.position.value
96
+
97
+ user.reload
98
+ assert_equal 0, user[:position]
99
+ skip "TODO"
100
+ assert_equal 0, user.position.value
101
+ end
102
+
103
+ describe "without position" do
104
+ let(:user) { User.new }
105
+
106
+ it "if value to nil, it's not instanciated" do
107
+ assert_nil user.position
108
+ end
109
+ end
110
+ end
111
+ end
metadata ADDED
@@ -0,0 +1,177 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: attr_object
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - dsimard
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.5
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Value Objects should be used to have more capabilities on a model attribute
42
+ in Rails.
43
+ email:
44
+ - dsimard@azanka.ca
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - MIT-LICENSE
50
+ - Rakefile
51
+ - lib/attr_object.rb
52
+ - lib/attr_object/version.rb
53
+ - lib/tasks/attr_object_tasks.rake
54
+ - test/dummy/README.rdoc
55
+ - test/dummy/Rakefile
56
+ - test/dummy/app/assets/javascripts/application.js
57
+ - test/dummy/app/assets/stylesheets/application.css
58
+ - test/dummy/app/attr_objects/phone_value.rb
59
+ - test/dummy/app/attr_objects/position_value.rb
60
+ - test/dummy/app/controllers/application_controller.rb
61
+ - test/dummy/app/helpers/application_helper.rb
62
+ - test/dummy/app/models/user.rb
63
+ - test/dummy/app/views/layouts/application.html.erb
64
+ - test/dummy/bin/bundle
65
+ - test/dummy/bin/rails
66
+ - test/dummy/bin/rake
67
+ - test/dummy/bin/setup
68
+ - test/dummy/config.ru
69
+ - test/dummy/config/application.rb
70
+ - test/dummy/config/boot.rb
71
+ - test/dummy/config/database.yml
72
+ - test/dummy/config/environment.rb
73
+ - test/dummy/config/environments/development.rb
74
+ - test/dummy/config/environments/production.rb
75
+ - test/dummy/config/environments/test.rb
76
+ - test/dummy/config/initializers/assets.rb
77
+ - test/dummy/config/initializers/backtrace_silencers.rb
78
+ - test/dummy/config/initializers/cookies_serializer.rb
79
+ - test/dummy/config/initializers/filter_parameter_logging.rb
80
+ - test/dummy/config/initializers/inflections.rb
81
+ - test/dummy/config/initializers/mime_types.rb
82
+ - test/dummy/config/initializers/session_store.rb
83
+ - test/dummy/config/initializers/wrap_parameters.rb
84
+ - test/dummy/config/locales/en.yml
85
+ - test/dummy/config/routes.rb
86
+ - test/dummy/config/secrets.yml
87
+ - test/dummy/db/development.sqlite3
88
+ - test/dummy/db/migrate/20160110221317_create_users.rb
89
+ - test/dummy/db/migrate/20160111012055_add_position_to_users.rb
90
+ - test/dummy/db/schema.rb
91
+ - test/dummy/db/test.sqlite3
92
+ - test/dummy/log/RAILS_ENV=test.log
93
+ - test/dummy/log/development.log
94
+ - test/dummy/log/test.log
95
+ - test/dummy/public/404.html
96
+ - test/dummy/public/422.html
97
+ - test/dummy/public/500.html
98
+ - test/dummy/public/favicon.ico
99
+ - test/dummy/test/fixtures/users.yml
100
+ - test/dummy/test/models/user_test.rb
101
+ - test/test_helper.rb
102
+ - test/value_object_test.rb
103
+ homepage: https://github.com/dsimard/attr_object
104
+ licenses:
105
+ - MIT
106
+ metadata: {}
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubyforge_project:
123
+ rubygems_version: 2.2.2
124
+ signing_key:
125
+ specification_version: 4
126
+ summary: Value Objects for Ruby on Rails
127
+ test_files:
128
+ - test/value_object_test.rb
129
+ - test/dummy/Rakefile
130
+ - test/dummy/app/controllers/application_controller.rb
131
+ - test/dummy/app/helpers/application_helper.rb
132
+ - test/dummy/app/models/user.rb
133
+ - test/dummy/app/views/layouts/application.html.erb
134
+ - test/dummy/app/attr_objects/phone_value.rb
135
+ - test/dummy/app/attr_objects/position_value.rb
136
+ - test/dummy/app/assets/stylesheets/application.css
137
+ - test/dummy/app/assets/javascripts/application.js
138
+ - test/dummy/README.rdoc
139
+ - test/dummy/public/500.html
140
+ - test/dummy/public/422.html
141
+ - test/dummy/public/404.html
142
+ - test/dummy/public/favicon.ico
143
+ - test/dummy/log/RAILS_ENV=test.log
144
+ - test/dummy/log/test.log
145
+ - test/dummy/log/development.log
146
+ - test/dummy/test/fixtures/users.yml
147
+ - test/dummy/test/models/user_test.rb
148
+ - test/dummy/config.ru
149
+ - test/dummy/config/routes.rb
150
+ - test/dummy/config/initializers/inflections.rb
151
+ - test/dummy/config/initializers/cookies_serializer.rb
152
+ - test/dummy/config/initializers/mime_types.rb
153
+ - test/dummy/config/initializers/filter_parameter_logging.rb
154
+ - test/dummy/config/initializers/assets.rb
155
+ - test/dummy/config/initializers/backtrace_silencers.rb
156
+ - test/dummy/config/initializers/session_store.rb
157
+ - test/dummy/config/initializers/wrap_parameters.rb
158
+ - test/dummy/config/environment.rb
159
+ - test/dummy/config/environments/production.rb
160
+ - test/dummy/config/environments/test.rb
161
+ - test/dummy/config/environments/development.rb
162
+ - test/dummy/config/secrets.yml
163
+ - test/dummy/config/locales/en.yml
164
+ - test/dummy/config/database.yml
165
+ - test/dummy/config/boot.rb
166
+ - test/dummy/config/application.rb
167
+ - test/dummy/db/development.sqlite3
168
+ - test/dummy/db/migrate/20160111012055_add_position_to_users.rb
169
+ - test/dummy/db/migrate/20160110221317_create_users.rb
170
+ - test/dummy/db/test.sqlite3
171
+ - test/dummy/db/schema.rb
172
+ - test/dummy/bin/bundle
173
+ - test/dummy/bin/setup
174
+ - test/dummy/bin/rails
175
+ - test/dummy/bin/rake
176
+ - test/test_helper.rb
177
+ has_rdoc: