jsonapi-resources 0.2.0 → 0.3.0.pre1

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.travis.yml +5 -2
  4. data/Gemfile +3 -1
  5. data/README.md +52 -13
  6. data/jsonapi-resources.gemspec +1 -1
  7. data/lib/jsonapi-resources.rb +1 -0
  8. data/lib/jsonapi/association.rb +1 -9
  9. data/lib/jsonapi/error_codes.rb +1 -0
  10. data/lib/jsonapi/exceptions.rb +9 -5
  11. data/lib/jsonapi/formatter.rb +9 -18
  12. data/lib/jsonapi/paginator.rb +4 -15
  13. data/lib/jsonapi/request.rb +26 -42
  14. data/lib/jsonapi/resource.rb +35 -45
  15. data/lib/jsonapi/resource_controller.rb +6 -32
  16. data/lib/jsonapi/resource_serializer.rb +62 -33
  17. data/lib/jsonapi/resources/version.rb +1 -1
  18. data/lib/jsonapi/routing_ext.rb +4 -4
  19. data/test/config/database.yml +2 -1
  20. data/test/controllers/controller_test.rb +200 -160
  21. data/test/fixtures/active_record.rb +44 -201
  22. data/test/fixtures/book_comments.yml +11 -0
  23. data/test/fixtures/books.yml +6 -0
  24. data/test/fixtures/comments.yml +17 -0
  25. data/test/fixtures/comments_tags.yml +20 -0
  26. data/test/fixtures/expense_entries.yml +13 -0
  27. data/test/fixtures/facts.yml +11 -0
  28. data/test/fixtures/iso_currencies.yml +17 -0
  29. data/test/fixtures/people.yml +24 -0
  30. data/test/fixtures/posts.yml +96 -0
  31. data/test/fixtures/posts_tags.yml +59 -0
  32. data/test/fixtures/preferences.yml +18 -0
  33. data/test/fixtures/sections.yml +8 -0
  34. data/test/fixtures/tags.yml +39 -0
  35. data/test/helpers/hash_helpers.rb +0 -7
  36. data/test/integration/requests/request_test.rb +86 -28
  37. data/test/integration/routes/routes_test.rb +14 -25
  38. data/test/test_helper.rb +41 -17
  39. data/test/unit/jsonapi_request/jsonapi_request_test.rb +152 -0
  40. data/test/unit/operation/operations_processor_test.rb +13 -2
  41. data/test/unit/resource/resource_test.rb +68 -13
  42. data/test/unit/serializer/serializer_test.rb +328 -220
  43. metadata +33 -6
  44. data/lib/jsonapi/resource_for.rb +0 -29
@@ -1,9 +1,5 @@
1
1
  require 'active_record'
2
- require 'jsonapi/resource_controller'
3
- require 'jsonapi/resource'
4
- require 'jsonapi/exceptions'
5
- require 'rails'
6
- require 'rails/all'
2
+ require 'jsonapi-resources'
7
3
 
8
4
  ActiveSupport::Inflector.inflections(:en) do |inflect|
9
5
  inflect.uncountable 'preferences'
@@ -16,7 +12,7 @@ ActiveRecord::Schema.define do
16
12
  t.string :email
17
13
  t.datetime :date_joined
18
14
  t.belongs_to :preferences
19
- t.timestamps
15
+ t.timestamps null: false
20
16
  end
21
17
 
22
18
  create_table :posts, force: true do |t|
@@ -24,14 +20,14 @@ ActiveRecord::Schema.define do
24
20
  t.text :body
25
21
  t.integer :author_id
26
22
  t.belongs_to :section, index: true
27
- t.timestamps
23
+ t.timestamps null: false
28
24
  end
29
25
 
30
26
  create_table :comments, force: true do |t|
31
27
  t.text :body
32
28
  t.belongs_to :post, index: true
33
29
  t.integer :author_id
34
- t.timestamps
30
+ t.timestamps null: false
35
31
  end
36
32
 
37
33
  create_table :tags, force: true do |t|
@@ -56,7 +52,7 @@ ActiveRecord::Schema.define do
56
52
  t.string :name
57
53
  t.string :country_name
58
54
  t.string :minor_unit
59
- t.timestamps
55
+ t.timestamps null: false
60
56
  end
61
57
  add_index :iso_currencies, :code, unique: true
62
58
 
@@ -115,7 +111,7 @@ ActiveRecord::Schema.define do
115
111
  t.text :body
116
112
  t.belongs_to :book, index: true
117
113
  t.integer :author_id
118
- t.timestamps
114
+ t.timestamps null: false
119
115
  end
120
116
  end
121
117
 
@@ -361,6 +357,9 @@ module Api
361
357
  end
362
358
 
363
359
  module V5
360
+ class AuthorsController < JSONAPI::ResourceController
361
+ end
362
+
364
363
  class PostsController < JSONAPI::ResourceController
365
364
  end
366
365
 
@@ -380,6 +379,8 @@ class PersonResource < JSONAPI::Resource
380
379
  has_many :comments
381
380
  has_many :posts
382
381
 
382
+ has_one :preferences
383
+
383
384
  filter :name
384
385
 
385
386
  def self.verify_custom_filter(filter, values, context)
@@ -395,29 +396,6 @@ class PersonResource < JSONAPI::Resource
395
396
  end
396
397
  end
397
398
 
398
- class AuthorResource < JSONAPI::Resource
399
- attributes :name, :email
400
- model_name 'Person'
401
- has_many :posts
402
-
403
- filter :name
404
-
405
- def self.find(filters, options = {})
406
- resources = []
407
-
408
- filters.each do |attr, filter|
409
- _model_class.where("\"#{attr}\" LIKE \"%#{filter[0]}%\"").each do |model|
410
- resources.push self.new(model, options[:context])
411
- end
412
- end
413
- return resources
414
- end
415
-
416
- def fetchable_fields
417
- super - [:email]
418
- end
419
- end
420
-
421
399
  class CommentResource < JSONAPI::Resource
422
400
  attributes :body
423
401
  has_one :post
@@ -529,6 +507,10 @@ class IsoCurrencyResource < JSONAPI::Resource
529
507
  attributes :name, :country_name, :minor_unit
530
508
 
531
509
  filter :country_name
510
+
511
+ def self.verify_key(key, context = nil)
512
+ key && String(key)
513
+ end
532
514
  end
533
515
 
534
516
  class ExpenseEntryResource < JSONAPI::Resource
@@ -565,10 +547,6 @@ class BreedResource < JSONAPI::Resource
565
547
  def self.find_by_key(id, options = {})
566
548
  BreedResource.new($breed_data.breeds[id.to_i], options[:context])
567
549
  end
568
-
569
- def self.find_by_keys(keys, options = {})
570
- keys.map { |key| self.find_by_key(key, options) }
571
- end
572
550
  end
573
551
 
574
552
  class PlanetResource < JSONAPI::Resource
@@ -602,7 +580,7 @@ end
602
580
  class PreferencesResource < JSONAPI::Resource
603
581
  attribute :advanced_mode
604
582
 
605
- has_one :author, foreign_key: :person_id
583
+ has_one :author, foreign_key: :person_id, class_name: 'Person'
606
584
  has_many :friends, class_name: 'Person'
607
585
 
608
586
  def self.find_by_key(key, options = {})
@@ -652,7 +630,7 @@ module Api
652
630
  filters :writer
653
631
  end
654
632
 
655
- AuthorResource = AuthorResource.dup
633
+ # AuthorResource = AuthorResource.dup
656
634
  PersonResource = PersonResource.dup
657
635
  CommentResource = CommentResource.dup
658
636
  TagResource = TagResource.dup
@@ -672,7 +650,7 @@ end
672
650
  module Api
673
651
  module V2
674
652
  PreferencesResource = PreferencesResource.dup
675
- AuthorResource = AuthorResource.dup
653
+ # AuthorResource = AuthorResource.dup
676
654
  PersonResource = PersonResource.dup
677
655
  PostResource = PostResource.dup
678
656
 
@@ -712,7 +690,30 @@ end
712
690
 
713
691
  module Api
714
692
  module V5
715
- AuthorResource = AuthorResource.dup
693
+ class AuthorResource < JSONAPI::Resource
694
+ attributes :name, :email
695
+ model_name 'Person'
696
+ has_many :posts
697
+
698
+ filter :name
699
+
700
+ def self.find(filters, options = {})
701
+ resources = []
702
+
703
+ filters.each do |attr, filter|
704
+ _model_class.where("\"#{attr}\" LIKE \"%#{filter[0]}%\"").each do |model|
705
+ resources.push self.new(model, options[:context])
706
+ end
707
+ end
708
+ return resources
709
+ end
710
+
711
+ def fetchable_fields
712
+ super - [:email]
713
+ end
714
+ end
715
+
716
+ PersonResource = PersonResource.dup
716
717
  PostResource = PostResource.dup
717
718
  ExpenseEntryResource = ExpenseEntryResource.dup
718
719
  IsoCurrencyResource = IsoCurrencyResource.dup
@@ -737,141 +738,7 @@ class BadlyNamedAttributesResource < JSONAPI::Resource
737
738
  end
738
739
  warn 'end testing Name Collisions'
739
740
 
740
- ### DATA
741
- javascript = Section.create(name: 'javascript')
742
- ruby = Section.create(name: 'ruby')
743
-
744
- a = Person.create(name: 'Joe Author',
745
- email: 'joe@xyz.fake',
746
- date_joined: DateTime.parse('2013-08-07 20:25:00 UTC +00:00'))
747
-
748
- b = Person.create(name: 'Fred Reader',
749
- email: 'fred@xyz.fake',
750
- date_joined: DateTime.parse('2013-10-31 20:25:00 UTC +00:00'))
751
-
752
- c = Person.create(name: 'Lazy Author',
753
- email: 'lazy@xyz.fake',
754
- date_joined: DateTime.parse('2013-10-31 21:25:00 UTC +00:00'))
755
-
756
- d = Person.create(name: 'Tag Crazy Author',
757
- email: 'taggy@xyz.fake',
758
- date_joined: DateTime.parse('2013-11-30 4:20:00 UTC +00:00'))
759
-
760
- short_tag = Tag.create(name: 'short')
761
- whiny_tag = Tag.create(name: 'whiny')
762
- grumpy_tag = Tag.create(name: 'grumpy')
763
- happy_tag = Tag.create(name: 'happy')
764
- jr_tag = Tag.create(name: 'JR')
765
-
766
- silly_tag = Tag.create(name: 'silly')
767
- sleepy_tag = Tag.create(name: 'sleepy')
768
- goofy_tag = Tag.create(name: 'goofy')
769
- wacky_tag = Tag.create(name: 'wacky')
770
-
771
- # id:1
772
- Post.create(title: 'New post',
773
- body: 'A body!!!',
774
- author_id: a.id).tap do |post|
775
-
776
- post.tags.concat short_tag, whiny_tag, grumpy_tag
777
-
778
- post.comments.create(body: 'what a dumb post', author_id: a.id, post_id: post.id).tap do |comment|
779
- comment.tags.concat whiny_tag, short_tag
780
- end
781
-
782
- post.comments.create(body: 'i liked it', author_id: b.id, post_id: post.id).tap do |comment|
783
- comment.tags.concat happy_tag, short_tag
784
- end
785
- end
786
-
787
- # id:2
788
- Post.create(title: 'JR Solves your serialization woes!',
789
- body: 'Use JR',
790
- author_id: a.id,
791
- section: Section.create(name: 'ruby')).tap do |post|
792
-
793
- post.tags.concat jr_tag
794
-
795
- post.comments.create(body: 'Thanks man. Great post. But what is JR?', author_id: b.id, post_id: post.id).tap do |comment|
796
- comment.tags.concat jr_tag
797
- end
798
- end
799
-
800
- # id:3
801
- Post.create(title: 'Update This Later',
802
- body: 'AAAA',
803
- author_id: c.id)
804
-
805
- # id:4
806
- Post.create(title: 'Delete This Later - Single',
807
- body: 'AAAA',
808
- author_id: c.id)
809
-
810
- # id:5
811
- Post.create(title: 'Delete This Later - Multiple1',
812
- body: 'AAAA',
813
- author_id: c.id)
814
-
815
- # id:6
816
- Post.create(title: 'Delete This Later - Multiple2',
817
- body: 'AAAA',
818
- author_id: c.id)
819
-
820
- # id:7
821
- Post.create(title: 'Delete This Later - Single2',
822
- body: 'AAAA',
823
- author_id: c.id)
824
-
825
- # id:8
826
- Post.create(title: 'Delete This Later - Multiple2-1',
827
- body: 'AAAA',
828
- author_id: c.id)
829
-
830
- # id:9
831
- Post.create(title: 'Delete This Later - Multiple2-2',
832
- body: 'AAAA',
833
- author_id: c.id)
834
-
835
- # id:9
836
- Post.create(title: 'Update This Later - Multiple',
837
- body: 'AAAA',
838
- author_id: c.id)
839
-
840
- # id:10
841
- Post.create(title: 'JR How To',
842
- body: 'Use JR to write API apps',
843
- author_id: a.id).tap do |post|
844
- post.tags.concat jr_tag
845
- end
846
-
847
- IsoCurrency.create(code: 'USD', name: 'United States Dollar', country_name: 'United States', minor_unit: 'cent')
848
- IsoCurrency.create(code: 'EUR', name: 'Euro Member Countries', country_name: 'Euro Member Countries', minor_unit: 'cent')
849
- IsoCurrency.create(code: 'CAD', name: 'Canadian dollar', country_name: 'Canada', minor_unit: 'cent')
850
-
851
- ExpenseEntry.create(currency_code: 'USD',
852
- employee_id: c.id,
853
- cost: '12.05',
854
- transaction_date: Date.parse('2014-04-15'))
855
-
856
- ExpenseEntry.create(currency_code: 'USD',
857
- employee_id: c.id,
858
- cost: '12.06',
859
- transaction_date: Date.parse('2014-04-15'))
860
-
861
- # id:11
862
- Post.create(title: 'Tagged up post 1',
863
- body: 'AAAA',
864
- author_id: d.id,
865
- tag_ids: [6,7,8,9]
866
- )
867
-
868
- # id:12
869
- Post.create(title: 'Tagged up post 2',
870
- body: 'BBBB',
871
- author_id: d.id,
872
- tag_ids: [6,7,8,9]
873
- )
874
-
741
+ ### PORO DATA
875
742
  gas_giant = PlanetType.create(name: 'Gas Giant')
876
743
  planetoid = PlanetType.create(name: 'Planetoid')
877
744
  terrestrial = PlanetType.create(name: 'Terrestrial')
@@ -888,28 +755,4 @@ jupiter = Planet.create(name: 'Jupiter', description: 'A gas giant.', planet_typ
888
755
  betax = Planet.create(name: 'Beta X', description: 'Newly discovered Planet X', planet_type_id: unknown.id)
889
756
  betay = Planet.create(name: 'Beta X', description: 'Newly discovered Planet Y', planet_type_id: unknown.id)
890
757
  betaz = Planet.create(name: 'Beta X', description: 'Newly discovered Planet Z', planet_type_id: unknown.id)
891
- betaw = Planet.create(name: 'Beta W', description: 'Newly discovered Planet W')
892
-
893
- preference = Preferences.create
894
-
895
- fact = Fact.create(spouse_name: 'Jane Author',
896
- bio: 'First man to run across Antartica.',
897
- quality_rating: 23.89/45.6,
898
- salary: BigDecimal('47000.56'),
899
- date_time_joined: DateTime.parse('2013-08-07 20:25:00 UTC +00:00'),
900
- birthday: Date.parse('1965-06-30'),
901
- bedtime: Time.parse('2000-01-01 20:00:00 UTC +00:00'),
902
- photo: "abc",
903
- cool: false
904
- )
905
-
906
- for book_num in 0..999
907
- Book.create(title: "Book #{book_num}", isbn: "12345-#{book_num}-67890") do |book|
908
- book.save
909
- if book_num < 5
910
- for comment_num in 0..50
911
- book.book_comments.create(body: "This is comment #{comment_num} on book #{book_num}.", author_id: a.id, book_id: book.id)
912
- end
913
- end
914
- end
915
- end
758
+ betaw = Planet.create(name: 'Beta W', description: 'Newly discovered Planet W')
@@ -0,0 +1,11 @@
1
+ <% comment_id = 0 %>
2
+ <% for book_num in 0..4 %>
3
+ <% for comment_num in 0..50 %>
4
+ book_<%= book_num %>_comment_<%= comment_num %>:
5
+ id: <%= comment_id %>
6
+ body: This is comment <%= comment_num %> on book <%= book_num %>.
7
+ author_id: 1
8
+ book_id: <%= book_num %>
9
+ <% comment_id = comment_id + 1 %>
10
+ <% end %>
11
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <% for book_num in 0..999 %>
2
+ book_<%= book_num %>:
3
+ id: <%= book_num %>
4
+ title: Book <%= book_num %>
5
+ isbn: 12345-<%= book_num %>-6789
6
+ <% end %>
@@ -0,0 +1,17 @@
1
+ post_1_dumb_post:
2
+ id: 1
3
+ post_id: 1
4
+ body: what a dumb post
5
+ author_id: 1
6
+
7
+ post_1_i_liked_it:
8
+ id: 2
9
+ post_id: 1
10
+ body: i liked it
11
+ author_id: 2
12
+
13
+ post_2_thanks_man:
14
+ id: 3
15
+ post_id: 2
16
+ body: Thanks man. Great post. But what is JR?
17
+ author_id: 2
@@ -0,0 +1,20 @@
1
+ post_1_dumb_post_whiny:
2
+ comment_id: 1
3
+ tag_id: 2
4
+
5
+ post_1_dumb_post_short:
6
+ comment_id: 1
7
+ tag_id: 1
8
+
9
+ post_1_i_liked_it_happy:
10
+ comment_id: 2
11
+ tag_id: 4
12
+
13
+ post_1_i_liked_it_short:
14
+ comment_id: 2
15
+ tag_id: 1
16
+
17
+ post_2_thanks_man_jr:
18
+ comment_id: 3
19
+ tag_id: 5
20
+
@@ -0,0 +1,13 @@
1
+ entry_1:
2
+ id: 1
3
+ currency_code: USD
4
+ employee_id: 3
5
+ cost: 12.05
6
+ transaction_date: <%= Date.parse('2014-04-15') %>
7
+
8
+ entry_2:
9
+ id: 2
10
+ currency_code: USD
11
+ employee_id: 3
12
+ cost: 12.06
13
+ transaction_date: <%= Date.parse('2014-04-15') %>
@@ -0,0 +1,11 @@
1
+ fact_1:
2
+ id: 1
3
+ spouse_name: Jane Author
4
+ bio: First man to run across Antartica.
5
+ quality_rating: <%= 23.89/45.6 %>
6
+ salary: 47000.56
7
+ date_time_joined: 2013-08-07 20:25:00 UTC +00:00
8
+ birthday: 1965-06-30
9
+ bedtime: 2000-01-01 20:00:00 UTC +00:00
10
+ photo: abc
11
+ cool: false
@@ -0,0 +1,17 @@
1
+ usd:
2
+ code: USD
3
+ name: United States Dollar
4
+ country_name: United States
5
+ minor_unit: cent
6
+
7
+ eur:
8
+ code: EUR
9
+ name: Euro Member Countries
10
+ country_name: Euro Member Countries
11
+ minor_unit: cent
12
+
13
+ cad:
14
+ code: CAD
15
+ name: Canadian dollar
16
+ country_name: Canada
17
+ minor_unit: cent