strapi 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2fb69f8122cef08e5397ed248b28d6cadaec1f9bd957324d94741dc674515111
4
- data.tar.gz: 148174f62efc4a4566cbe6b96982f8a9981d37dba5b6e875ce17146308c7a3c5
3
+ metadata.gz: 01f0caddbedae31af4265a1c71c53cd2e637b6ebee6e4781f39fed76a198bb38
4
+ data.tar.gz: 97c263e1c894cd5b78beb8fba42f8949bf9276271ae8506f2adba9e43599a096
5
5
  SHA512:
6
- metadata.gz: cea0d86d27e200156e9f08ab505e32bd576ac6977de4965df0393e3106a92d549185577f580fc8a6b6d414ce4c1a1883496b3ec05b2a2776921b674768b8c759
7
- data.tar.gz: f16548cd8666e6d8e9ee9f31f16c1d1dadf93d06a8c05e09397553ac9246b962503aabba2b8480a67f360b65275b4638e9d23b12c52c717d82c472fe0151e5af
6
+ metadata.gz: fbc3c226031a49c023c5d901908903b1cbeffcef8f99cae0c9c0a88e193a25cace270144070995410546fd04d79734124cbbef904cd873992987bba74fc69fc6
7
+ data.tar.gz: 8abd4c2833d6210a4aa29c5dacb72bea903fa94c86fb1d30523622127976879a93dbcdbba8f5ffe417d16072828d87b58e364ca594b3746955c7edc01fcd76e1
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- strapi (0.0.1)
4
+ strapi (0.0.2)
5
5
  activesupport (>= 5.0)
6
6
  faraday (>= 1.0)
7
7
  oj (>= 3.0)
@@ -23,25 +23,8 @@ GEM
23
23
  debug (1.4.0)
24
24
  irb (>= 1.3.6)
25
25
  reline (>= 0.2.7)
26
- faraday (1.8.0)
27
- faraday-em_http (~> 1.0)
28
- faraday-em_synchrony (~> 1.0)
29
- faraday-excon (~> 1.1)
30
- faraday-httpclient (~> 1.0.1)
31
- faraday-net_http (~> 1.0)
32
- faraday-net_http_persistent (~> 1.1)
33
- faraday-patron (~> 1.0)
34
- faraday-rack (~> 1.0)
35
- multipart-post (>= 1.2, < 3)
26
+ faraday (2.0.0)
36
27
  ruby2_keywords (>= 0.0.4)
37
- faraday-em_http (1.0.0)
38
- faraday-em_synchrony (1.0.0)
39
- faraday-excon (1.1.0)
40
- faraday-httpclient (1.0.1)
41
- faraday-net_http (1.0.1)
42
- faraday-net_http_persistent (1.2.0)
43
- faraday-patron (1.0.0)
44
- faraday-rack (1.0.0)
45
28
  hashdiff (1.0.1)
46
29
  i18n (1.8.11)
47
30
  concurrent-ruby (~> 1.0)
@@ -49,7 +32,6 @@ GEM
49
32
  irb (1.4.1)
50
33
  reline (>= 0.3.0)
51
34
  minitest (5.15.0)
52
- multipart-post (2.1.1)
53
35
  oj (3.13.10)
54
36
  parallel (1.21.0)
55
37
  parser (3.0.3.2)
data/README.md CHANGED
@@ -12,6 +12,12 @@ your Strapi content types as it is to define them within Strapi itself.
12
12
  Add this line to your application's Gemfile:
13
13
 
14
14
  ```ruby
15
+ gem 'strapi'
16
+ ```
17
+
18
+ Or if you want to run the absolute latest, potentially unreleased version:
19
+
20
+ ``` ruby
15
21
  gem 'strapi', github: 'waymondo/strapi-ruby'
16
22
  ```
17
23
 
@@ -19,11 +25,11 @@ And then execute:
19
25
 
20
26
  $ bundle install
21
27
 
22
- This gem has only been tested with Strapi v4. It may work with previous versions of Strapi, but they
23
- remain untested.
24
-
25
28
  ## Usage
26
29
 
30
+ This gem has only been tested with Strapi v4. It may work with previous versions of Strapi, but they
31
+ remain untested at this time.
32
+
27
33
  ### Configuration
28
34
 
29
35
  You will first need to set an `ENV` variable for `STRAPI_HOST_URL` and `STRAPI_API_TOKEN` (the
@@ -37,7 +43,7 @@ STRAPI_HOST_URL=http://localhost:1337
37
43
  STRAPI_API_TOKEN=asdf1234qwer5678
38
44
  ```
39
45
 
40
- #### Defining Content Type Classes
46
+ ### Defining Content Type Classes
41
47
 
42
48
  In Ruby, define some content type classes, i.e.:
43
49
 
@@ -107,7 +113,7 @@ parameter options are included by default, so if you want to eagerly load relate
107
113
  example, you’ll need to specify that with the `populate` option:
108
114
 
109
115
  ``` ruby
110
- cows = Cow.all(populate: "*")
116
+ cows = Cow.all(populate: '*')
111
117
  cows.first.farm.name # => "McDonald’s"
112
118
  farm = Farm.find(1, populate: ['cows'])
113
119
  farm.cows.first.name # => "Hershey"
@@ -116,9 +122,49 @@ farm.cows.first.name # => "Hershey"
116
122
  The class method `.where` also exists, which is the same implementation as `.all`, except a hash of
117
123
  API parameters is required.
118
124
 
119
- ### CRUD
125
+ ### Creating, Updating, Deleting
126
+
127
+ You can create and update entries by calling `.save` on them:
128
+
129
+ ``` ruby
130
+ cow = Cow.new(name: 'Hershey')
131
+ cow.id # => nil
132
+ cow.save # => performs POST request
133
+ cow.id # => 1
134
+ cow = Cow.find(1)
135
+ cow.name = 'Bessie'
136
+ cow.save # => performs PUT request
137
+ ```
138
+
139
+ You can also use `create` class method to more concisely create entries:
120
140
 
121
- Coming Soon
141
+ ``` ruby
142
+ cow = Cow.create(name: 'Bessie')
143
+ cow.id # => 1
144
+ ```
145
+
146
+ You can delete entries by calling `.delete` on them:
147
+
148
+ ``` ruby
149
+ cow = Cow.find(1)
150
+ cow.delete # => performs DELETE request
151
+ cow = Cow.find(1) # => raises Strapi::Error
152
+ ```
153
+
154
+ ### Error Handling
155
+
156
+ Any non successful Strapi request will raise a
157
+ [Strapi::Error](https://github.com/waymondo/strapi-ruby/blob/main/lib/strapi/error.rb) with the API
158
+ response’s status, message, and payload, which you can rescue and handle accordingly:
159
+
160
+ ``` ruby
161
+ def show
162
+ cow = Cow.find(123)
163
+ render :cow, cow: cow
164
+ rescue Strapi::Error => e
165
+ render :error, message: e.message
166
+ end
167
+ ```
122
168
 
123
169
  ## Development
124
170
 
@@ -133,7 +179,7 @@ file to [rubygems.org](https://rubygems.org).
133
179
 
134
180
  ## Contributing
135
181
 
136
- Bug reports and pull requests are welcome on GitHub at https://github.com/waymondo/strapi.
182
+ Bug reports and pull requests are welcome on GitHub at https://github.com/waymondo/strapi-ruby.
137
183
 
138
184
  ## License
139
185
 
@@ -3,31 +3,57 @@
3
3
  module Strapi
4
4
  # The class for defining a Ruby class that represents a Strapi Content-Type
5
5
  class ContentType
6
- attr_reader :id, :attributes
6
+ attr_reader :id, :attributes, :deleted
7
7
 
8
- def initialize(response_data)
9
- @id = response_data['id']
10
- @attributes = response_data['attributes'].transform_keys(&:underscore)
8
+ def initialize(attributes = {})
9
+ @attributes = attributes.symbolize_keys
11
10
  end
12
11
 
13
- def created_at
14
- datetime_from_timestamp 'created_at'
12
+ %w[created_at updated_at published_at].each do |method|
13
+ define_method(method) do
14
+ datetime_from_timestamp method
15
+ end
15
16
  end
16
17
 
17
- def updated_at
18
- datetime_from_timestamp 'updated_at'
18
+ def ==(other)
19
+ other.is_a?(self.class) && id == other.id
19
20
  end
20
21
 
21
- def published_at
22
- datetime_from_timestamp 'published_at'
22
+ def save(query_hash = {})
23
+ return if deleted
24
+
25
+ response = id ? update_request(query_hash) : create_request(query_hash)
26
+ entry = self.class.send(:new_from_response, response)
27
+ tap do
28
+ @attributes = attributes.deep_merge entry.attributes
29
+ @id = entry.id
30
+ end
23
31
  end
24
32
 
25
- def ==(other)
26
- other.is_a?(self.class) && id == other.id
33
+ def delete(query_hash = {})
34
+ Request.delete("#{self.class.send(:_plural_id)}/#{id}?#{query_hash.to_query}")
35
+ @attributes = {}
36
+ @id = nil
37
+ @deleted = true
38
+ nil
27
39
  end
28
40
 
29
41
  private
30
42
 
43
+ def create_request(query_hash)
44
+ Request.post(
45
+ "#{self.class.send(:_plural_id)}?#{query_hash.to_query}",
46
+ data: attributes.slice(*self.class.fields)
47
+ ).data
48
+ end
49
+
50
+ def update_request(query_hash)
51
+ Request.put(
52
+ "#{self.class.send(:_plural_id)}/#{id}?#{query_hash.to_query}",
53
+ data: attributes.slice(*self.class.fields)
54
+ ).data
55
+ end
56
+
31
57
  def datetime_from_timestamp(key)
32
58
  return unless (timestamp = @attributes[key])
33
59
 
@@ -35,36 +61,41 @@ module Strapi
35
61
  end
36
62
 
37
63
  def strapi_attr_value(attr, options)
38
- value = @attributes[attr.to_s]
64
+ value = @attributes[attr]
39
65
  return value unless (content_type = options[:content_type])
40
66
 
41
67
  content_type_class = content_type.is_a?(String) ? content_type.constantize : content_type
42
68
  if (data = value['data']).is_a?(Array)
43
69
  data.map do |entry|
44
- content_type_class.new(entry)
70
+ content_type_class.send(:new_from_response, entry)
45
71
  end
46
72
  else
47
- content_type_class.new(data)
73
+ content_type_class.send(:new_from_response, data)
48
74
  end
49
75
  end
50
76
 
51
77
  class << self
78
+ attr_reader :fields
79
+
52
80
  def plural_id(name)
53
81
  @_plural_id = name
54
82
  end
55
83
 
56
84
  def field(attr, options = {})
85
+ @fields = [] if fields.nil?
86
+ fields << attr
87
+
57
88
  define_method attr do
58
89
  strapi_attr_value(attr, options)
59
90
  end
60
91
 
61
92
  define_method "#{attr}=" do |value|
62
- attributes[attr.to_s] = value
93
+ attributes[attr] = value
63
94
  end
64
95
  end
65
96
 
66
97
  def find(id, query_hash = {})
67
- new Request.get("#{_plural_id}/#{id}?#{query_hash.to_query}").data
98
+ new_from_response Request.get("#{_plural_id}/#{id}?#{query_hash.to_query}").data
68
99
  end
69
100
 
70
101
  def all(query_hash = {})
@@ -75,16 +106,22 @@ module Strapi
75
106
  get_list(query_hash)
76
107
  end
77
108
 
109
+ def create(attributes, query_hash = {})
110
+ new(attributes).save(query_hash)
111
+ end
112
+
78
113
  private
79
114
 
80
- def get_list(query_hash)
81
- strapi_filter_query(query_hash).map do |result|
82
- new result
115
+ def new_from_response(response)
116
+ new(response['attributes'].transform_keys(&:underscore)).tap do |entry|
117
+ entry.instance_variable_set('@id', response['id'])
83
118
  end
84
119
  end
85
120
 
86
- def strapi_filter_query(query_hash)
87
- Request.get("#{_plural_id}?#{query_hash.to_query}").data
121
+ def get_list(query_hash)
122
+ Request.get("#{_plural_id}?#{query_hash.to_query}").data.map do |result|
123
+ new_from_response result
124
+ end
88
125
  end
89
126
 
90
127
  def _plural_id
@@ -7,9 +7,6 @@ module Strapi
7
7
 
8
8
  def initialize(faraday_response)
9
9
  @parsed_response = Oj.load(faraday_response.body)
10
- puts '########################'
11
- p @parsed_response
12
- puts '########################'
13
10
  return if faraday_response.success?
14
11
 
15
12
  raise Error, error
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Strapi
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
  end
data/lib/strapi.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'active_support'
4
4
  require 'active_support/core_ext/string/inflections'
5
5
  require 'active_support/core_ext/object/to_query'
6
+ require 'active_support/core_ext/hash/keys'
6
7
  require 'faraday'
7
8
  require 'oj'
8
9
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - justin talbott
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-04 00:00:00.000000000 Z
11
+ date: 2022-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -75,12 +75,12 @@ files:
75
75
  - lib/strapi/request.rb
76
76
  - lib/strapi/response.rb
77
77
  - lib/strapi/version.rb
78
- homepage: https://github.com/waymondo/strapi
78
+ homepage: https://github.com/waymondo/strapi-ruby
79
79
  licenses:
80
80
  - MIT
81
81
  metadata:
82
- homepage_uri: https://github.com/waymondo/strapi
83
- source_code_uri: https://github.com/waymondo/strapi
82
+ homepage_uri: https://github.com/waymondo/strapi-ruby
83
+ source_code_uri: https://github.com/waymondo/strapi-ruby
84
84
  rubygems_mfa_required: 'true'
85
85
  post_install_message:
86
86
  rdoc_options: []