dato 0.1.12 → 0.1.13

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
  SHA1:
3
- metadata.gz: 57f88cb5b563d207575df6cc877db833b84e6ba8
4
- data.tar.gz: 18d368ed8bf4431445fef22bc81c894294802239
3
+ metadata.gz: 9ce7d382f884eb6efae6931aa28679144d557aa7
4
+ data.tar.gz: 61a5d88910e3a6f9478a489e98f7cfa08467b37c
5
5
  SHA512:
6
- metadata.gz: 5413cc7f5c30e958d53a929b954409e0ae0c6b3a625648d0f38d5ccb253aa1a5d8643803de577177ac9d29cf4775029ea028121f61c83910d8f6e47817258be4
7
- data.tar.gz: d026c30365f6d67f2739f2785913831cf320c06a4f2283c1e6aad517b20842d6fa72dbf876bb31ec87c29ed493ded7bdd7b55305aaa44d1a5479dc3f1690dfa5
6
+ metadata.gz: c76af4354a87d7c467d95628ea9d49a09769cd68d99a5099470c0c4bd924dd1f0b3f4f40d38d3e76d8c6635db789a8c73b362bc6e15ed1dd2311d33aa7743bea
7
+ data.tar.gz: 251ba83f8e43176dd94aebb694a669687390846d3618bb98d6c04c68458016dcae2ee7621b0659a268bcd147f29f6afc99043f5f8bb160d8115a7ecec7764ecf
@@ -16,11 +16,16 @@ module Dato
16
16
  sites: Repo::Site
17
17
  }.freeze
18
18
 
19
- attr_reader :token, :base_url, :schema
19
+ attr_reader :token, :base_url, :schema, :extra_headers
20
20
 
21
- def initialize(token, base_url: 'https://account-api.datocms.com')
21
+ def initialize(
22
+ token,
23
+ base_url: 'https://account-api.datocms.com',
24
+ extra_headers: {}
25
+ )
22
26
  @base_url = base_url
23
27
  @token = token
28
+ @extra_headers = extra_headers
24
29
  end
25
30
 
26
31
  REPOS.each do |method_name, repo_klass|
@@ -44,11 +49,12 @@ module Dato
44
49
  def connection
45
50
  options = {
46
51
  url: base_url,
47
- headers: {
52
+ headers: extra_headers.merge(
48
53
  'Accept' => 'application/json',
49
54
  'Content-Type' => 'application/json',
50
- 'Authorization' => "Bearer #{@token}"
51
- }
55
+ 'Authorization' => "Bearer #{@token}",
56
+ 'User-Agent' => "ruby-client v#{Dato::VERSION}"
57
+ )
52
58
  }
53
59
 
54
60
  @connection ||= Faraday.new(options) do |c|
@@ -4,15 +4,15 @@ require 'yaml'
4
4
 
5
5
  class Array
6
6
  def deep_stringify_keys
7
- inject([]) { |accum, value|
8
- if (value.is_a?(Hash) or value.is_a?(Array))
7
+ each_with_object([]) do |value, accum|
8
+ if value.is_a?(Hash) || value.is_a?(Array)
9
9
  new_val = value.deep_stringify_keys
10
10
  accum.push new_val
11
11
  else
12
12
  accum.push value
13
13
  end
14
14
  accum
15
- }
15
+ end
16
16
  end
17
17
  end
18
18
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require 'dato/dump/dsl/root'
3
3
  require 'dato/dump/operation/root'
4
+ require 'dato/dump/ssg_detector'
4
5
 
5
6
  module Dato
6
7
  module Dump
@@ -13,17 +14,18 @@ module Dato
13
14
  end
14
15
 
15
16
  def run
16
- site.load
17
-
18
- root = Operation::Root.new(Dir.pwd)
19
-
20
17
  Dsl::Root.new(
21
18
  File.read(config_path),
22
19
  site.items_repo,
23
- root
20
+ operation
24
21
  )
25
22
 
26
- root.perform
23
+ site.load
24
+ operation.perform
25
+ end
26
+
27
+ def operation
28
+ @operation ||= Operation::Root.new(Dir.pwd)
27
29
  end
28
30
 
29
31
  def site
@@ -31,7 +33,17 @@ module Dato
31
33
  end
32
34
 
33
35
  def client
34
- @client ||= Dato::Site::Client.new(api_token)
36
+ @client ||= Dato::Site::Client.new(
37
+ api_token,
38
+ extra_headers: {
39
+ 'X-Reason' => 'dump',
40
+ 'X-SSG' => generator
41
+ }
42
+ )
43
+ end
44
+
45
+ def generator
46
+ SsgDetector.new(Dir.pwd).detect
35
47
  end
36
48
  end
37
49
  end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+ require 'toml'
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ module Dato
7
+ module Dump
8
+ class SsgDetector
9
+ attr_reader :path
10
+
11
+ RUBY = %w(middleman jekyll nanoc).freeze
12
+
13
+ NODE = %w(brunch assemble ember-cli hexo metalsmith react-scripts
14
+ roots docpad wintersmith gatsby harp grunt gulp).freeze
15
+
16
+ PYTHON = %w(mkdocs pelican cactus).freeze
17
+
18
+ HUGO = [
19
+ {
20
+ file: 'config.toml',
21
+ loader: ->(content) { TOML::Parser.new(content).parsed }
22
+ },
23
+ {
24
+ file: 'config.yaml',
25
+ loader: ->(content) { YAML.load(content) }
26
+ },
27
+ {
28
+ file: 'config.json',
29
+ loader: ->(content) { JSON.load(content) }
30
+ }
31
+ ].freeze
32
+
33
+ def initialize(path)
34
+ @path = path
35
+ end
36
+
37
+ def detect
38
+ ruby_generator ||
39
+ node_generator ||
40
+ python_generator ||
41
+ hugo ||
42
+ 'unknown'
43
+ end
44
+
45
+ private
46
+
47
+ def ruby_generator
48
+ gemfile_path = File.join(path, 'Gemfile')
49
+ return unless File.exist?(gemfile_path)
50
+
51
+ gemfile = File.read(gemfile_path)
52
+
53
+ RUBY.find do |generator|
54
+ gemfile =~ /('#{generator}'|"#{generator}")/
55
+ end
56
+ end
57
+
58
+ def node_generator
59
+ package_path = File.join(path, 'package.json')
60
+ return unless File.exist?(package_path)
61
+
62
+ package = JSON.load(File.read(package_path))
63
+
64
+ deps = package.fetch('dependencies', {})
65
+ dev_deps = package.fetch('devDependencies', {})
66
+ all_deps = deps.merge(dev_deps)
67
+
68
+ NODE.find do |generator|
69
+ all_deps.key? generator
70
+ end
71
+ rescue JSON::ParserError
72
+ nil
73
+ end
74
+
75
+ def python_generator
76
+ requirements_path = File.join(path, 'requirements.txt')
77
+ return unless File.exist?(requirements_path)
78
+
79
+ requirements = File.read(requirements_path)
80
+
81
+ PYTHON.find do |generator|
82
+ requirements =~ /^#{generator}(==)?/
83
+ end
84
+ end
85
+
86
+ def hugo
87
+ HUGO.any? do |option|
88
+ path = File.join(path, option[:file])
89
+ config = option[:parser].call(File.read(path))
90
+ config.key? 'baseurl'
91
+ end && 'hugo'
92
+ rescue JSON::ParserError
93
+ nil
94
+ rescue Psych::SyntaxError
95
+ nil
96
+ end
97
+ end
98
+ end
99
+ end
@@ -29,11 +29,16 @@ module Dato
29
29
  items: Repo::Item
30
30
  }.freeze
31
31
 
32
- attr_reader :token, :base_url, :schema
32
+ attr_reader :token, :base_url, :schema, :extra_headers
33
33
 
34
- def initialize(token, base_url: 'https://site-api.datocms.com')
34
+ def initialize(
35
+ token,
36
+ base_url: 'https://site-api.datocms.com',
37
+ extra_headers: {}
38
+ )
35
39
  @base_url = base_url
36
40
  @token = token
41
+ @extra_headers = extra_headers
37
42
  end
38
43
 
39
44
  def upload_file(path_or_url)
@@ -67,11 +72,12 @@ module Dato
67
72
  def connection
68
73
  options = {
69
74
  url: base_url,
70
- headers: {
75
+ headers: extra_headers.merge(
71
76
  'Accept' => 'application/json',
72
77
  'Content-Type' => 'application/json',
73
- 'Authorization' => "Bearer #{@token}"
74
- }
78
+ 'Authorization' => "Bearer #{@token}",
79
+ 'User-Agent' => "ruby-client v#{Dato::VERSION}"
80
+ )
75
81
  }
76
82
 
77
83
  @connection ||= Faraday.new(options) do |c|
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Dato
3
- VERSION = '0.1.12'
3
+ VERSION = '0.1.13'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dato
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.12
4
+ version: 0.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Verna
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-05 00:00:00.000000000 Z
11
+ date: 2016-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -321,6 +321,7 @@ files:
321
321
  - lib/dato/dump/operation/directory.rb
322
322
  - lib/dato/dump/operation/root.rb
323
323
  - lib/dato/dump/runner.rb
324
+ - lib/dato/dump/ssg_detector.rb
324
325
  - lib/dato/json_api_deserializer.rb
325
326
  - lib/dato/json_api_serializer.rb
326
327
  - lib/dato/local/entities_repo.rb
@@ -379,4 +380,3 @@ signing_key:
379
380
  specification_version: 4
380
381
  summary: Ruby client for DatoCMS API
381
382
  test_files: []
382
- has_rdoc: