halitosis 0.1.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.
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Halitosis
4
+ # Behavior for serializers with a single primary resource
5
+ #
6
+ module Resource
7
+ def self.included(base)
8
+ if base.included_modules.include?(Collection)
9
+ raise InvalidResource, "#{base.name} has already defined a collection"
10
+ end
11
+
12
+ base.extend ClassMethods
13
+
14
+ base.send :include, InstanceMethods
15
+
16
+ base.send :attr_reader, :resource
17
+
18
+ base.class.send :attr_accessor, :resource_name
19
+ end
20
+
21
+ module ClassMethods
22
+ # @param name [Symbol, String] name of the resource
23
+ #
24
+ # @return [Module] self
25
+ #
26
+ def define_resource(name)
27
+ self.resource_name = name.to_s
28
+
29
+ alias_method name, :resource
30
+ end
31
+
32
+ # Override standard property field for resource-based serializers
33
+ #
34
+ # @param name [Symbol, String] name of the property
35
+ # @param options [nil, Hash] property options for field
36
+ #
37
+ def property(name, options = {}, &procedure)
38
+ super.tap do |field|
39
+ unless field.procedure || field.options.key?(:value)
40
+ field.procedure = proc { resource.send(name) }
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ module InstanceMethods
47
+ # Override standard initializer to assign primary resource
48
+ #
49
+ # @param resource [Object] the primary resource
50
+ #
51
+ def initialize(resource, **)
52
+ @resource = resource
53
+
54
+ super(**)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Halitosis
4
+ VERSION = "0.1.0"
5
+ end
data/lib/halitosis.rb ADDED
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "halitosis/version"
4
+
5
+ require "json"
6
+
7
+ # HAL-like JSON generator
8
+ #
9
+ # Provides an interface for serializing resources as JSON
10
+ # with HAL-like links and relationships.
11
+ #
12
+ # @example
13
+ # class ArticleSerializer
14
+ # include Halitosis
15
+ #
16
+ # resource :article
17
+ #
18
+ # property :id, required: true
19
+ #
20
+ # property :title
21
+ #
22
+ # link :self, -> { article_path(article) }
23
+ #
24
+ # link :external, optional: true, -> { "http://example.com/read/#{article.id}" }
25
+ #
26
+ # rel :author, -> { UserSerializer.new(article.author) }
27
+ # # or relatioinship :author, -> { UserSerializer.new(article.author) }
28
+ # end
29
+ #
30
+ # render json: ArticleSerializer.new(article, include: :author, fields: :title)
31
+ module Halitosis
32
+ def self.included(base)
33
+ base.extend ClassMethods
34
+
35
+ base.include Base
36
+
37
+ config.extensions.each { |extension| base.send :include, extension }
38
+ end
39
+
40
+ module ClassMethods
41
+ def resource(name)
42
+ include Halitosis::Resource
43
+
44
+ define_resource(name)
45
+ end
46
+
47
+ def collection(name, ...)
48
+ include Halitosis::Collection
49
+
50
+ define_collection(name, ...)
51
+ end
52
+ end
53
+
54
+ class << self
55
+ # @yield [Halitosis::Configuration] configuration instance for modification
56
+ #
57
+ def configure
58
+ yield config
59
+ end
60
+
61
+ # Configuration instance
62
+ #
63
+ # @return [Halitosis::Configuration]
64
+ #
65
+ def config
66
+ @config ||= Configuration.new
67
+ end
68
+ end
69
+ end
70
+
71
+ require_relative "halitosis/base"
72
+ require_relative "halitosis/errors"
73
+ require_relative "halitosis/field"
74
+ require_relative "halitosis/fields"
75
+ require_relative "halitosis/properties"
76
+ require_relative "halitosis/links"
77
+ require_relative "halitosis/meta"
78
+ require_relative "halitosis/permissions"
79
+ require_relative "halitosis/relationships"
80
+ require_relative "halitosis/resource"
81
+ require_relative "halitosis/collection"
82
+ require_relative "halitosis/hash_util"
83
+ require_relative "halitosis/configuration"
84
+
85
+ require "halitosis/railtie" if defined?(::Rails)
data/sig/halitosis.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Halitosis
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: halitosis
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ben Morrall
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-09-30 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Provides an interface for serializing resources as JSON with HAL-like
14
+ links and relationships.
15
+ email:
16
+ - bemo56@hotmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ".rspec"
22
+ - ".rubocop.yml"
23
+ - CHANGELOG.md
24
+ - CODE_OF_CONDUCT.md
25
+ - LICENSE.txt
26
+ - README.md
27
+ - Rakefile
28
+ - lib/halitosis.rb
29
+ - lib/halitosis/base.rb
30
+ - lib/halitosis/collection.rb
31
+ - lib/halitosis/collection/field.rb
32
+ - lib/halitosis/configuration.rb
33
+ - lib/halitosis/errors.rb
34
+ - lib/halitosis/field.rb
35
+ - lib/halitosis/fields.rb
36
+ - lib/halitosis/hash_util.rb
37
+ - lib/halitosis/links.rb
38
+ - lib/halitosis/links/field.rb
39
+ - lib/halitosis/meta.rb
40
+ - lib/halitosis/meta/field.rb
41
+ - lib/halitosis/permissions.rb
42
+ - lib/halitosis/permissions/field.rb
43
+ - lib/halitosis/properties.rb
44
+ - lib/halitosis/properties/field.rb
45
+ - lib/halitosis/railtie.rb
46
+ - lib/halitosis/relationships.rb
47
+ - lib/halitosis/relationships/field.rb
48
+ - lib/halitosis/resource.rb
49
+ - lib/halitosis/version.rb
50
+ - sig/halitosis.rbs
51
+ homepage: https://github.com/bmorrall/halitosis
52
+ licenses:
53
+ - MIT
54
+ metadata:
55
+ homepage_uri: https://github.com/bmorrall/halitosis
56
+ source_code_uri: https://github.com/bmorrall/halitosis
57
+ changelog_uri: https://github.com/bmorrall/halitosis/main/CHANGELOG.md
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 3.2.0
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubygems_version: 3.4.19
74
+ signing_key:
75
+ specification_version: 4
76
+ summary: HAL-like API client for Ruby
77
+ test_files: []