middleman-dato 0.0.1.rc12 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.gitlab-ci.yml +7 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +9 -1070
  5. data/Gemfile +8 -8
  6. data/Rakefile +14 -5
  7. data/foo.rb +12 -0
  8. data/lib/dato/client.rb +14 -9
  9. data/lib/dato/entities_repo.rb +43 -0
  10. data/lib/dato/field_type/boolean.rb +9 -0
  11. data/lib/dato/field_type/date.rb +9 -0
  12. data/lib/dato/field_type/date_time.rb +9 -0
  13. data/lib/dato/field_type/file.rb +30 -0
  14. data/lib/dato/field_type/float.rb +9 -0
  15. data/lib/dato/field_type/image.rb +23 -0
  16. data/lib/dato/field_type/integer.rb +9 -0
  17. data/lib/dato/field_type/lat_lon.rb +16 -0
  18. data/lib/dato/field_type/link.rb +9 -0
  19. data/lib/dato/field_type/links.rb +9 -0
  20. data/lib/dato/field_type/seo.rb +21 -0
  21. data/lib/dato/field_type/string.rb +9 -0
  22. data/lib/dato/field_type/text.rb +9 -0
  23. data/lib/dato/field_type/video.rb +48 -0
  24. data/lib/dato/json_api_entity.rb +75 -0
  25. data/lib/dato/meta_tags/article_modified_time.rb +3 -3
  26. data/lib/dato/meta_tags/article_publisher.rb +3 -3
  27. data/lib/dato/meta_tags/base.rb +12 -19
  28. data/lib/dato/meta_tags/description.rb +4 -4
  29. data/lib/dato/meta_tags/image.rb +5 -8
  30. data/lib/dato/meta_tags/og_locale.rb +2 -2
  31. data/lib/dato/meta_tags/og_meta_tag.rb +2 -4
  32. data/lib/dato/meta_tags/og_site_name.rb +2 -2
  33. data/lib/dato/meta_tags/og_type.rb +5 -5
  34. data/lib/dato/meta_tags/robots.rb +2 -4
  35. data/lib/dato/meta_tags/title.rb +5 -4
  36. data/lib/dato/meta_tags/twitter_card.rb +3 -3
  37. data/lib/dato/meta_tags/twitter_meta_tag.rb +2 -4
  38. data/lib/dato/meta_tags/twitter_site.rb +2 -2
  39. data/lib/dato/meta_tags/url.rb +4 -4
  40. data/lib/dato/meta_tags_builder.rb +13 -13
  41. data/lib/dato/middleman_extension.rb +15 -23
  42. data/lib/dato/record.rb +77 -46
  43. data/lib/dato/records_repo.rb +106 -0
  44. data/lib/dato/space.rb +36 -0
  45. data/lib/middleman-dato.rb +5 -2
  46. data/middleman-dato.gemspec +14 -13
  47. data/spec/dato/entities_repo_spec.rb +41 -0
  48. data/spec/dato/field_type/file_spec.rb +20 -0
  49. data/spec/dato/field_type/image_spec.rb +24 -0
  50. data/spec/dato/field_type/lat_lon_spec.rb +18 -0
  51. data/spec/dato/field_type/seo_spec.rb +31 -0
  52. data/spec/dato/field_type/video_spec.rb +32 -0
  53. data/spec/dato/json_api_entity_spec.rb +123 -0
  54. data/spec/dato/meta_tags/article_modified_time_spec.rb +16 -14
  55. data/spec/dato/meta_tags/image_spec.rb +39 -0
  56. data/spec/dato/meta_tags/og_locale_spec.rb +14 -12
  57. data/spec/dato/record_spec.rb +137 -78
  58. data/spec/dato/records_repo_spec.rb +125 -0
  59. data/spec/spec_helper.rb +14 -12
  60. metadata +58 -13
  61. data/lib/dato/field.rb +0 -43
  62. data/lib/dato/fields/belongs_to.rb +0 -21
  63. data/lib/dato/fields/file.rb +0 -22
  64. data/lib/dato/fields/seo.rb +0 -37
  65. data/lib/dato/repo.rb +0 -111
  66. data/lib/middleman_extension.rb +0 -1
  67. data/spec/dato/field_spec.rb +0 -110
data/Gemfile CHANGED
@@ -1,20 +1,20 @@
1
1
  # If you do not have OpenSSL installed, update
2
2
  # the following line to use "http://" instead
3
- source "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
 
5
5
  # Specify your gem's dependencies in middleman-dato.gemspec
6
6
  gemspec
7
7
 
8
- gem "rubocop"
9
- gem "rubocop-rspec"
8
+ gem 'rubocop'
10
9
 
11
10
  group :development do
12
- gem "rake"
13
- gem "rdoc"
14
- gem "yard"
11
+ gem 'rake'
12
+ gem 'rdoc'
13
+ gem 'yard'
14
+ gem 'pry'
15
15
  end
16
16
 
17
17
  group :test do
18
- gem "rspec"
19
- gem "simplecov", require: false
18
+ gem 'rspec'
19
+ gem 'simplecov', require: false
20
20
  end
data/Rakefile CHANGED
@@ -1,12 +1,21 @@
1
- require "bundler"
1
+ require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
3
 
4
- require "rspec/core/rake_task"
4
+ require 'rspec/core/rake_task'
5
5
  RSpec::Core::RakeTask.new(:spec)
6
6
 
7
- require "rubocop/rake_task"
8
- RuboCop::RakeTask.new do |task|
9
- task.requires << "rubocop-rspec"
7
+ require 'rubocop/rake_task'
8
+ RuboCop::RakeTask.new
9
+
10
+ desc 'Open an irb (or pry) session preloaded with this gem'
11
+ task :console do
12
+ begin
13
+ require 'pry'
14
+ gem_name = File.basename(Dir.pwd)
15
+ sh %(pry -I lib -r #{gem_name}.rb)
16
+ rescue LoadError => _
17
+ sh %(irb -rubygems -I lib -r #{gem_name}.rb)
18
+ end
10
19
  end
11
20
 
12
21
  task default: :spec
data/foo.rb ADDED
@@ -0,0 +1,12 @@
1
+ space = Dato::Space.new(
2
+ domain: 'admin.cucistorie.it',
3
+ api_host: 'http://127.0.0.1:3001',
4
+ token: 'xZqr1G8vRFOMnLe9ofn7w4Yr590SKhxjZ46v4tw1WXc'
5
+ )
6
+
7
+ space.refresh!
8
+ puts space.records_repo.creations.size
9
+ puts space.records_repo.creations.first.attributes.inspect
10
+ puts space.records_repo.creations.first.name
11
+ puts space.records_repo.creations.first.slug
12
+ puts space.records_repo.creations.first.cover_image.file.to_url
data/lib/dato/client.rb CHANGED
@@ -1,6 +1,7 @@
1
- require "faraday"
2
- require "faraday_middleware"
3
- require "json"
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+ require 'json'
4
+ require 'active_support/core_ext/hash/indifferent_access'
4
5
 
5
6
  module Dato
6
7
  class Client
@@ -11,11 +12,15 @@ module Dato
11
12
  end
12
13
 
13
14
  def space
14
- get("space").body
15
+ include = [
16
+ 'content_types',
17
+ 'content_types.fields'
18
+ ]
19
+ get('space', include: include).body.with_indifferent_access
15
20
  end
16
21
 
17
22
  def records
18
- get("records", "page[limit]" => 10_000).body
23
+ get('records', 'page[limit]' => 10_000).body.with_indifferent_access
19
24
  end
20
25
 
21
26
  def get(*args)
@@ -30,10 +35,10 @@ module Dato
30
35
  options = {
31
36
  url: @host,
32
37
  headers: {
33
- "Content-Type" => "application/json",
34
- "Accept" => "application/json",
35
- "X-Space-Domain" => @domain,
36
- "Authorization" => "Api-Key #{@token}"
38
+ 'Content-Type' => 'application/json',
39
+ 'Accept' => 'application/json',
40
+ 'X-Space-Domain' => @domain,
41
+ 'Authorization' => "Api-Key #{@token}"
37
42
  }
38
43
  }
39
44
  @connection ||= Faraday.new(options) do |c|
@@ -0,0 +1,43 @@
1
+ require 'dato/json_api_entity'
2
+
3
+ module Dato
4
+ class EntitiesRepo
5
+ attr_reader :entities
6
+
7
+ def initialize(*payloads)
8
+ @entities = {}
9
+
10
+ payloads.each do |payload|
11
+ EntitiesRepo.payload_entities(payload).each do |entity_payload|
12
+ object = JsonApiEntity.new(entity_payload, self)
13
+ @entities[object.type] ||= {}
14
+ @entities[object.type][object.id] = object
15
+ end
16
+ end
17
+ end
18
+
19
+ def find_entities_of_type(type)
20
+ entities.fetch(type, {}).values
21
+ end
22
+
23
+ def find_entity(type, id)
24
+ entities.fetch(type, {}).fetch(id, nil)
25
+ end
26
+
27
+ def self.payload_entities(payload)
28
+ acc = []
29
+
30
+ if payload[:data]
31
+ acc = if payload[:data].is_a? Array
32
+ acc + payload[:data]
33
+ else
34
+ acc + [payload[:data]]
35
+ end
36
+ end
37
+
38
+ acc += payload[:included] if payload[:included]
39
+
40
+ acc
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,9 @@
1
+ module Dato
2
+ module FieldType
3
+ class Boolean
4
+ def self.parse(value, _repo)
5
+ value
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Dato
2
+ module FieldType
3
+ class Date
4
+ def self.parse(value, _repo)
5
+ ::Date.parse(value)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Dato
2
+ module FieldType
3
+ class DateTime
4
+ def self.parse(value, _repo)
5
+ ::Time.parse(value)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,30 @@
1
+ require 'imgix'
2
+
3
+ module Dato
4
+ module FieldType
5
+ class File
6
+ attr_reader :path, :format, :size
7
+
8
+ def self.parse(value, _repo)
9
+ new(
10
+ value[:path],
11
+ value[:format],
12
+ value[:size]
13
+ )
14
+ end
15
+
16
+ def initialize(path, format, size)
17
+ @path = path
18
+ @format = format
19
+ @size = size
20
+ end
21
+
22
+ def file
23
+ @file ||= Imgix::Client.new(
24
+ host: 'dato-images.imgix.net',
25
+ secure: true
26
+ ).path(path).ch("DPR", "Width").auto("compress", "format")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ module Dato
2
+ module FieldType
3
+ class Float
4
+ def self.parse(value, _repo)
5
+ value
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ module Dato
2
+ module FieldType
3
+ class Image < Dato::FieldType::File
4
+ attr_reader :width, :height
5
+
6
+ def self.parse(value, _repo)
7
+ new(
8
+ value[:path],
9
+ value[:format],
10
+ value[:size],
11
+ value[:width],
12
+ value[:height]
13
+ )
14
+ end
15
+
16
+ def initialize(path, format, size, width, height)
17
+ super(path, format, size)
18
+ @width = width
19
+ @height = height
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ module Dato
2
+ module FieldType
3
+ class Integer
4
+ def self.parse(value, _repo)
5
+ value
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ module Dato
2
+ module FieldType
3
+ class LatLon
4
+ attr_reader :latitude, :longitude
5
+
6
+ def self.parse(value, _repo)
7
+ new(value[:latitude], value[:longitude])
8
+ end
9
+
10
+ def initialize(latitude, longitude)
11
+ @latitude = latitude
12
+ @longitude = longitude
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ module Dato
2
+ module FieldType
3
+ class Link
4
+ def self.parse(value, repo)
5
+ repo.find(value)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Dato
2
+ module FieldType
3
+ class Links
4
+ def self.parse(ids, repo)
5
+ ids.map { |id| repo.find(id) }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module Dato
2
+ module FieldType
3
+ class Seo
4
+ attr_reader :title, :description
5
+
6
+ def self.parse(value, _repo)
7
+ new(value[:title], value[:description], value[:image])
8
+ end
9
+
10
+ def initialize(title, description, image)
11
+ @title = title
12
+ @description = description
13
+ @image = image
14
+ end
15
+
16
+ def image
17
+ @image && Image.parse(@image, nil)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ module Dato
2
+ module FieldType
3
+ class String
4
+ def self.parse(value, _repo)
5
+ value
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Dato
2
+ module FieldType
3
+ class Text
4
+ def self.parse(value, _repo)
5
+ value
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,48 @@
1
+ require 'active_support/core_ext/hash/compact'
2
+ require 'video_embed'
3
+
4
+ module Dato
5
+ module FieldType
6
+ class Video
7
+ def self.parse(value, _repo)
8
+ new(value)
9
+ end
10
+
11
+ def initialize(attributes)
12
+ @attributes = attributes
13
+ end
14
+
15
+ def url
16
+ @attributes[:url]
17
+ end
18
+
19
+ def thumbnail_url
20
+ @attributes[:thumbnail_url]
21
+ end
22
+
23
+ def title
24
+ @attributes[:title]
25
+ end
26
+
27
+ def width
28
+ @attributes[:width]
29
+ end
30
+
31
+ def height
32
+ @attributes[:height]
33
+ end
34
+
35
+ def provider
36
+ @attributes[:provider]
37
+ end
38
+
39
+ def provider_url
40
+ @attributes[:provider_url]
41
+ end
42
+
43
+ def iframe_embed(width = nil, height = nil)
44
+ VideoEmbed.embed(url, { width: width, height: height }.compact)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,75 @@
1
+ module Dato
2
+ class JsonApiEntity
3
+ attr_reader :payload, :data_source
4
+
5
+ def initialize(payload, data_source)
6
+ @payload = payload
7
+ @data_source = data_source
8
+ end
9
+
10
+ def id
11
+ @payload[:id]
12
+ end
13
+
14
+ def type
15
+ @payload[:type]
16
+ end
17
+
18
+ def ==(other)
19
+ if other.is_a? JsonApiEntity
20
+ id == other.id && type == other.type
21
+ else
22
+ false
23
+ end
24
+ end
25
+
26
+ def to_s
27
+ "#<JsonApiEntity id=#{id} type=#{type} payload=#{payload}>"
28
+ end
29
+ alias inspect to_s
30
+
31
+ def [](key)
32
+ attributes[key]
33
+ end
34
+
35
+ def respond_to?(method, include_private = false)
36
+ if attributes.key?(method) || relationships.key?(method)
37
+ true
38
+ else
39
+ super
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def attributes
46
+ @payload.fetch(:attributes, {})
47
+ end
48
+
49
+ def relationships
50
+ @payload.fetch(:relationships, {})
51
+ end
52
+
53
+ def dereference_linkage(linkage)
54
+ if linkage.is_a? Array
55
+ linkage.map do |item|
56
+ data_source.find_entity(item[:type], item[:id])
57
+ end
58
+ else
59
+ data_source.find_entity(linkage[:type], linkage[:id])
60
+ end
61
+ end
62
+
63
+ def method_missing(method, *arguments, &block)
64
+ return super unless arguments.empty?
65
+
66
+ if attributes.key?(method)
67
+ attributes[method]
68
+ elsif relationships.key?(method)
69
+ dereference_linkage(relationships[method][:data])
70
+ else
71
+ super
72
+ end
73
+ end
74
+ end
75
+ end