api-blueprint 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: '0809cc6a8a9bb3e101463e557f3e089f8ad14ea4'
4
- data.tar.gz: f52e26b878dcf30e2378409e52321709333181b1
3
+ metadata.gz: 3d23a188a9076e091b9ce710bad84b2bafd27723
4
+ data.tar.gz: e3cd015fb4cc6b563113515cb8a00f1387fe4345
5
5
  SHA512:
6
- metadata.gz: be379d505c900cc5d725bc7b67765dde33869a119c29a95dfad39ad986e96711dace8136ccfb05e399f4bb22399e085b54f65d5da67a0f0918fcd00aad9e02e2
7
- data.tar.gz: e5d97a944496d8a0255c3489ccb7417f3c5bef1e96b45b80c4617ff1b4c42ba58f20ba338f6ea4cc698a827840d280d7a19c64efc697952903db1e11a29805e3
6
+ metadata.gz: 4dd0313e92b043c835515e9e970313c79d452167604560de4a988cd7a9aee672629412e990a16fc9c783039eba73bc05e8b50df3e0e735ba41143164a12500dd
7
+ data.tar.gz: 708aad91e765f722ad8c9fa34b47aa71887d92a3b04fa34a67564bb4d2fb1feecce368283e3e76c3cff47a95c8bd9db15179f70718ad9ddfe375f70f4ff8cb14
data/README.md CHANGED
@@ -60,3 +60,82 @@ The result of using `api.run` on a blueprint is as you'd expect, nice model inst
60
60
  <% end %>
61
61
  </ul>
62
62
  ```
63
+
64
+ ## Model Configuration
65
+
66
+ Using a `configure` block on models, you can define a default url (host), a [parser](#configparser), a [builder](#configbuilder) and can define a list of [replacements](#configreplacements):
67
+
68
+ ```ruby
69
+ class AstronautsInSpace < ApiBlueprint::Model
70
+ configure do |config|
71
+ config.host = "http://api.open-notify.org"
72
+ config.parser = CustomResponseParser.new
73
+ config.builder = CustomObjectBuilder.new
74
+ config.replacements = {}
75
+ end
76
+ end
77
+ ```
78
+
79
+ ### Config.builder
80
+
81
+ When running a blueprint, after the response is returned and parsed, the result is passed to a builder, which is responsible for initializing objects from the response. The default [ApiBlueprint::Builder](https://github.com/iZettle/api-blueprint/blob/master/lib/api-blueprint/builder.rb)
82
+ will pass the attributes from the response into the initializer for the class the blueprint was defined in.
83
+
84
+ If you want to change the behavior of the builder, or have a complex response which needs manipulation before it should be passed to the initializer, you can define a custom builder. Custom builders must inherit from the default builder, and can override any combination of the core methods which are used to build responses; `build`, `prepare_item`, and `build_item`. Refer to the [default builder](https://github.com/iZettle/api-blueprint/blob/master/lib/api-blueprint/builder.rb) to see what those methods do.
85
+
86
+ ### Config.parser
87
+
88
+ The parser is responsible for taking the raw response body string and generating a useful object from it, which can be passed into the builder to generate instances of the model. The [default parser](https://github.com/iZettle/api-blueprint/blob/master/lib/api-blueprint/parser.rb) is used to parse json strings and return a hash.
89
+
90
+ If you need a custom parser (for example, an XML parser), you must define a class which inherits from `ApiBlueprint::Parser`, and overrides the `#parse` method.
91
+
92
+ ### Config.replacements
93
+
94
+ Replacements can be used to handle poorly named keys in api responses, or to re-word things without the need to creating a custom builder. For example, if the api by default returned a key called `numberOfAstronautsInSpace` and you wanted this to assign the `number` attribute on the model, you could use a replacement to handle that:
95
+
96
+ ```ruby
97
+ config.replacements = {
98
+ numberOfAstronautsInSpace: :number
99
+ }
100
+ ```
101
+
102
+ ## Blueprint options
103
+
104
+ When defining a blueprint in a model, you can pass it a number of options to set request headers, params, body, or to run code after an instance of the model has been initialized. Here's some examples:
105
+
106
+ ```ruby
107
+ # Most basic usage
108
+ blueprint :get, "/endpoint"
109
+
110
+ # Different http methods are supported (:get, :post, :put, :delete, :head, :patch, :options)
111
+ blueprint :put, "/endpoint"
112
+
113
+ # Request headers, body, or params can be passed along
114
+ blueprint :post, "/endpoint", {
115
+ headers: { "Content-Type": "application/json" },
116
+ params: { hello: "world" },
117
+ body: { something: "in the body" }
118
+ }
119
+
120
+ # If you need to modify the instance which will be returned, or run subsequent requests using
121
+ # the runner, you can do so in a block. Note, this is the only place the runner will be available
122
+ # when running the blueprint.
123
+ blueprint :get, "/endpoint" do |runner, result|
124
+ result.tap do |astronaut|
125
+ astronaut.number = 23 # override something
126
+ astronaut.more_info = runner.run SomeOtherModel.fetch # run another request
127
+ end
128
+ end
129
+ ```
130
+
131
+ ## A note on Dry::Struct immutability
132
+
133
+ Models you create use `Dry::Struct` to handle initialization and assignment. `Dry::Struct` is designed with immutability in mind, so if you need to mutate the objects you have, there are two possibilities; explicitly define an `attr_writer` for the attributes which you want to mutate, or do things the "Dry::Struct way" and use the current instance to initialize a new instance:
134
+
135
+ ```ruby
136
+ astros = AstronautsInSpace.new number: 5, foo: "bar"
137
+ astros.number # => 5
138
+ astros.number = 10 # NoMethodError: undefined method `number=' for #<AstronautsInSpace number=5 foo="bar">
139
+ new_astros = astros.new number: 10
140
+ new_astros # #<AstronautsInSpace number=10 foo="bar">
141
+ ```
@@ -47,7 +47,7 @@ module ApiBlueprint
47
47
  def call_api(options)
48
48
  connection.send options[:http_method] do |req|
49
49
  req.url options[:url]
50
- req.headers.merge! options[:headers]
50
+ req.headers.merge!({ "Content-Type": "application/json" }.merge(options[:headers]))
51
51
  req.params = options[:params]
52
52
  req.body = options[:body].to_json
53
53
  end
@@ -56,6 +56,7 @@ module ApiBlueprint
56
56
  def connection
57
57
  Faraday.new do |conn|
58
58
  conn.response :json, content_type: /\bjson$/
59
+ conn.response :raise_error
59
60
  # conn.response :logger
60
61
 
61
62
  conn.adapter Faraday.default_adapter
@@ -1,3 +1,3 @@
1
1
  module ApiBlueprint
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api-blueprint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damien Timewell