firebase_dynamic_link 0.1.3 → 1.0.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +141 -0
- data/Appraisals +14 -12
- data/Gemfile +8 -1
- data/Gemfile.lock +2 -2
- data/Guardfile +70 -0
- data/README.md +84 -52
- data/Rakefile +3 -1
- data/bin/console +1 -0
- data/firebase_dynamic_link.gemspec +24 -22
- data/gemfiles/version_2016.gemfile +1 -1
- data/gemfiles/version_2016.gemfile.lock +5 -5
- data/gemfiles/version_2017a.gemfile.lock +2 -2
- data/gemfiles/version_2017b.gemfile.lock +2 -2
- data/gemfiles/version_2018.gemfile.lock +2 -2
- data/lib/firebase_dynamic_link.rb +73 -23
- data/lib/firebase_dynamic_link/client.rb +132 -56
- data/lib/firebase_dynamic_link/connection.rb +44 -0
- data/lib/firebase_dynamic_link/link_renderer.rb +53 -0
- data/lib/firebase_dynamic_link/version.rb +3 -1
- metadata +40 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b8833e89c026a88c4375d66c0b9eec4e0e62b3f
|
4
|
+
data.tar.gz: 32431d2b24ed100688667c1b934a17fdfa3d2b82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6b997cb918cbd0a3efcf22f253576ccf626afaf7e93728c8431c42b0e1f289557d8b0e8c503a1566b5de96dcce206f1f4d7c9e2a39cf26af61f24a8898d5868
|
7
|
+
data.tar.gz: aade124ecd68188957b5b0ecae65e013f5141037ef1546f5e3b73192e36e077dd823bbf2b8489a9e93da5e44743398b17ea7e084d1372efefbf86edd225e0522
|
data/.rubocop.yml
CHANGED
@@ -3,3 +3,144 @@ Metrics/BlockLength:
|
|
3
3
|
- 'Rakefile'
|
4
4
|
- '**/*.rake'
|
5
5
|
- 'spec/**/*.rb'
|
6
|
+
|
7
|
+
# Prefer &&/|| over and/or.
|
8
|
+
Style/AndOr:
|
9
|
+
Enabled: true
|
10
|
+
|
11
|
+
# Do not use braces for hash literals when they are the last argument of a
|
12
|
+
# method call.
|
13
|
+
Style/BracesAroundHashParameters:
|
14
|
+
Enabled: true
|
15
|
+
EnforcedStyle: context_dependent
|
16
|
+
|
17
|
+
# Align `when` with `case`.
|
18
|
+
Layout/CaseIndentation:
|
19
|
+
Enabled: true
|
20
|
+
|
21
|
+
# Align comments with method definitions.
|
22
|
+
Layout/CommentIndentation:
|
23
|
+
Enabled: true
|
24
|
+
|
25
|
+
Layout/ElseAlignment:
|
26
|
+
Enabled: true
|
27
|
+
|
28
|
+
# Align `end` with the matching keyword or starting expression except for
|
29
|
+
# assignments, where it should be aligned with the LHS.
|
30
|
+
Layout/EndAlignment:
|
31
|
+
Enabled: true
|
32
|
+
EnforcedStyleAlignWith: variable
|
33
|
+
AutoCorrect: true
|
34
|
+
|
35
|
+
Layout/EmptyLineAfterMagicComment:
|
36
|
+
Enabled: true
|
37
|
+
|
38
|
+
# In a regular class definition, no empty lines around the body.
|
39
|
+
Layout/EmptyLinesAroundClassBody:
|
40
|
+
Enabled: true
|
41
|
+
|
42
|
+
# In a regular method definition, no empty lines around the body.
|
43
|
+
Layout/EmptyLinesAroundMethodBody:
|
44
|
+
Enabled: true
|
45
|
+
|
46
|
+
# In a regular module definition, no empty lines around the body.
|
47
|
+
Layout/EmptyLinesAroundModuleBody:
|
48
|
+
Enabled: true
|
49
|
+
|
50
|
+
Layout/FirstParameterIndentation:
|
51
|
+
Enabled: true
|
52
|
+
|
53
|
+
# Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
|
54
|
+
Style/HashSyntax:
|
55
|
+
Enabled: true
|
56
|
+
|
57
|
+
# Two spaces, no tabs (for indentation).
|
58
|
+
Layout/IndentationWidth:
|
59
|
+
Enabled: true
|
60
|
+
|
61
|
+
Layout/LeadingCommentSpace:
|
62
|
+
Enabled: true
|
63
|
+
|
64
|
+
Layout/SpaceAfterColon:
|
65
|
+
Enabled: true
|
66
|
+
|
67
|
+
Layout/SpaceAfterComma:
|
68
|
+
Enabled: true
|
69
|
+
|
70
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
71
|
+
Enabled: true
|
72
|
+
|
73
|
+
Layout/SpaceAroundKeyword:
|
74
|
+
Enabled: true
|
75
|
+
|
76
|
+
Layout/SpaceAroundOperators:
|
77
|
+
Enabled: true
|
78
|
+
|
79
|
+
Layout/SpaceBeforeComma:
|
80
|
+
Enabled: true
|
81
|
+
|
82
|
+
Layout/SpaceBeforeFirstArg:
|
83
|
+
Enabled: true
|
84
|
+
|
85
|
+
Style/DefWithParentheses:
|
86
|
+
Enabled: true
|
87
|
+
|
88
|
+
# Defining a method with parameters needs parentheses.
|
89
|
+
Style/MethodDefParentheses:
|
90
|
+
Enabled: true
|
91
|
+
|
92
|
+
Style/FrozenStringLiteralComment:
|
93
|
+
Enabled: true
|
94
|
+
EnforcedStyle: always
|
95
|
+
|
96
|
+
# Use `foo {}` not `foo{}`.
|
97
|
+
Layout/SpaceBeforeBlockBraces:
|
98
|
+
Enabled: true
|
99
|
+
|
100
|
+
# Use `foo { bar }` not `foo {bar}`.
|
101
|
+
Layout/SpaceInsideBlockBraces:
|
102
|
+
Enabled: true
|
103
|
+
|
104
|
+
# Use `{ a: 1 }` not `{a:1}`.
|
105
|
+
Layout/SpaceInsideHashLiteralBraces:
|
106
|
+
Enabled: true
|
107
|
+
|
108
|
+
Layout/SpaceInsideParens:
|
109
|
+
Enabled: true
|
110
|
+
|
111
|
+
# Check quotes usage according to lint rule below.
|
112
|
+
Style/StringLiterals:
|
113
|
+
Enabled: true
|
114
|
+
EnforcedStyle: double_quotes
|
115
|
+
|
116
|
+
# Detect hard tabs, no hard tabs.
|
117
|
+
Layout/Tab:
|
118
|
+
Enabled: true
|
119
|
+
|
120
|
+
# Blank lines should not have any spaces.
|
121
|
+
Layout/TrailingBlankLines:
|
122
|
+
Enabled: true
|
123
|
+
|
124
|
+
# No trailing whitespace.
|
125
|
+
Layout/TrailingWhitespace:
|
126
|
+
Enabled: true
|
127
|
+
|
128
|
+
# Use quotes for string literals when they are enough.
|
129
|
+
Style/UnneededPercentQ:
|
130
|
+
Enabled: true
|
131
|
+
|
132
|
+
# Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
|
133
|
+
Lint/RequireParentheses:
|
134
|
+
Enabled: true
|
135
|
+
|
136
|
+
Style/RedundantReturn:
|
137
|
+
Enabled: true
|
138
|
+
AllowMultipleReturnValues: true
|
139
|
+
|
140
|
+
Style/Semicolon:
|
141
|
+
Enabled: true
|
142
|
+
AllowAsExpressionSeparator: true
|
143
|
+
|
144
|
+
# Prefer Foo.method over Foo::method
|
145
|
+
Style/ColonMethodCall:
|
146
|
+
Enabled: true
|
data/Appraisals
CHANGED
@@ -1,19 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
appraise "version-2018" do
|
4
|
+
gem "dry-configurable", "0.7.0"
|
5
|
+
gem "faraday", "0.14.0"
|
4
6
|
end
|
5
7
|
|
6
|
-
appraise
|
7
|
-
gem
|
8
|
-
gem
|
8
|
+
appraise "version-2017b" do
|
9
|
+
gem "dry-configurable", "0.6.0"
|
10
|
+
gem "faraday", "0.11.0"
|
9
11
|
end
|
10
12
|
|
11
|
-
appraise
|
12
|
-
gem
|
13
|
-
gem
|
13
|
+
appraise "version-2017a" do
|
14
|
+
gem "dry-configurable", "0.6.0"
|
15
|
+
gem "faraday", "0.10.1"
|
14
16
|
end
|
15
17
|
|
16
|
-
appraise
|
17
|
-
gem
|
18
|
-
gem
|
18
|
+
appraise "version-2016" do
|
19
|
+
gem "dry-configurable", "0.5.0"
|
20
|
+
gem "faraday", "0.9.2"
|
19
21
|
end
|
data/Gemfile
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source "https://rubygems.org"
|
2
4
|
|
3
|
-
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
5
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
6
|
|
5
7
|
# Specify your gem's dependencies in firebase_dynamic_link.gemspec
|
6
8
|
gemspec
|
9
|
+
|
10
|
+
# group :development do
|
11
|
+
# gem 'guard'
|
12
|
+
# gem 'guard-rspec'
|
13
|
+
# end
|
data/Gemfile.lock
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
## Uncomment and set this to only include directories you want to watch
|
5
|
+
# directories %w(app lib config test spec features) \
|
6
|
+
# .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
|
7
|
+
|
8
|
+
## Note: if you are using the `directories` clause above and you are not
|
9
|
+
## watching the project directory ('.'), then you will want to move
|
10
|
+
## the Guardfile to a watched dir and symlink it back, e.g.
|
11
|
+
#
|
12
|
+
# $ mkdir config
|
13
|
+
# $ mv Guardfile config/
|
14
|
+
# $ ln -s config/Guardfile .
|
15
|
+
#
|
16
|
+
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"
|
17
|
+
|
18
|
+
# Note: The cmd option is now required due to the increasing number of ways
|
19
|
+
# rspec may be run, below are examples of the most common uses.
|
20
|
+
# * bundler: 'bundle exec rspec'
|
21
|
+
# * bundler binstubs: 'bin/rspec'
|
22
|
+
# * spring: 'bin/rspec' (This will use spring if running and you have
|
23
|
+
# installed the spring binstubs per the docs)
|
24
|
+
# * zeus: 'zeus rspec' (requires the server to be started separately)
|
25
|
+
# * 'just' rspec: 'rspec'
|
26
|
+
|
27
|
+
guard :rspec, cmd: "bundle exec rspec" do
|
28
|
+
require "guard/rspec/dsl"
|
29
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
30
|
+
|
31
|
+
# Feel free to open issues for suggestions and improvements
|
32
|
+
|
33
|
+
# RSpec files
|
34
|
+
rspec = dsl.rspec
|
35
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
36
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
37
|
+
watch(rspec.spec_files)
|
38
|
+
|
39
|
+
# Ruby files
|
40
|
+
ruby = dsl.ruby
|
41
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
42
|
+
|
43
|
+
# Rails files
|
44
|
+
rails = dsl.rails(view_extensions: %w(erb haml slim))
|
45
|
+
dsl.watch_spec_files_for(rails.app_files)
|
46
|
+
dsl.watch_spec_files_for(rails.views)
|
47
|
+
|
48
|
+
watch(rails.controllers) do |m|
|
49
|
+
[
|
50
|
+
rspec.spec.call("routing/#{m[1]}_routing"),
|
51
|
+
rspec.spec.call("controllers/#{m[1]}_controller"),
|
52
|
+
rspec.spec.call("acceptance/#{m[1]}")
|
53
|
+
]
|
54
|
+
end
|
55
|
+
|
56
|
+
# Rails config changes
|
57
|
+
watch(rails.spec_helper) { rspec.spec_dir }
|
58
|
+
watch(rails.routes) { "#{rspec.spec_dir}/routing" }
|
59
|
+
watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
|
60
|
+
|
61
|
+
# Capybara features specs
|
62
|
+
watch(rails.view_dirs) { |m| rspec.spec.call("features/#{m[1]}") }
|
63
|
+
watch(rails.layouts) { |m| rspec.spec.call("features/#{m[1]}") }
|
64
|
+
|
65
|
+
# Turnip features and steps
|
66
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
67
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
|
68
|
+
Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
|
69
|
+
end
|
70
|
+
end
|
data/README.md
CHANGED
@@ -13,9 +13,7 @@ based on reference https://firebase.google.com/docs/reference/dynamic-links/link
|
|
13
13
|
|
14
14
|
Add this line to your application's Gemfile:
|
15
15
|
|
16
|
-
|
17
|
-
gem 'firebase_dynamic_link'
|
18
|
-
```
|
16
|
+
gem 'firebase_dynamic_link'
|
19
17
|
|
20
18
|
And then execute:
|
21
19
|
|
@@ -30,74 +28,108 @@ Or install it yourself as:
|
|
30
28
|
### Configure the HTTP client
|
31
29
|
|
32
30
|
```ruby
|
33
|
-
FirebaseDynamicLink.configure do |config|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
FirebaseDynamicLink.configure do |config|
|
32
|
+
# the adapter should be supported by Faraday
|
33
|
+
# more info look at https://github.com/lostisland/faraday/tree/master/test/adapters
|
34
|
+
# Faraday.default_adapter is the default adapter
|
35
|
+
config.adapter = :httpclient
|
38
36
|
|
39
|
-
|
40
|
-
|
37
|
+
# required
|
38
|
+
config.api_key = 'API_KEY'
|
41
39
|
|
42
|
-
|
43
|
-
|
40
|
+
# default 'UNGUESSABLE'
|
41
|
+
config.suffix_option = 'SHORT' or 'UNGUESSABLE'
|
44
42
|
|
45
|
-
|
46
|
-
|
43
|
+
# required, Don't put http://
|
44
|
+
config.dynamic_link_domain = 'xyz.app.goo.gl'
|
47
45
|
|
48
|
-
|
49
|
-
|
46
|
+
# default 3 seconds
|
47
|
+
config.timeout = 3
|
50
48
|
|
51
|
-
|
52
|
-
|
53
|
-
end
|
49
|
+
# default 3 seconds
|
50
|
+
config.open_timeout = 3
|
51
|
+
end
|
52
|
+
```
|
54
53
|
|
55
|
-
|
56
|
-
options = {
|
57
|
-
# optional, to override default suffix default config
|
58
|
-
suffix_option: '',
|
54
|
+
### Shorten a link
|
59
55
|
|
60
|
-
|
61
|
-
|
56
|
+
```ruby
|
57
|
+
client = FirebaseDynamicLink::Client.new
|
58
|
+
link = "http://domain.com/path/path"
|
59
|
+
options = {
|
60
|
+
# optional, to override default suffix default config
|
61
|
+
suffix_option: '',
|
62
62
|
|
63
|
-
|
64
|
-
|
63
|
+
# optional, to override default dynamic_link_domain default config
|
64
|
+
dynamic_link_domain: '',
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
}
|
66
|
+
# optional, timeout of each request of this instance
|
67
|
+
timeout: 10,
|
69
68
|
|
70
|
-
#
|
71
|
-
|
69
|
+
# optional, open timeout of each request of this instance
|
70
|
+
open_timeout: 10
|
71
|
+
}
|
72
72
|
|
73
|
+
# options argument is optional
|
74
|
+
result = client.shorten_link(link, options)
|
73
75
|
```
|
74
76
|
|
75
|
-
|
77
|
+
### Shorten parameters
|
76
78
|
|
77
79
|
```ruby
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
80
|
+
client = FirebaseDynamicLink::Client.new
|
81
|
+
options = {
|
82
|
+
# optional, to override default suffix default config
|
83
|
+
suffix_option: '',
|
84
|
+
|
85
|
+
# optional, to override default dynamic_link_domain default config
|
86
|
+
dynamic_link_domain: '',
|
87
|
+
|
88
|
+
# optional, timeout of each request of this instance
|
89
|
+
timeout: 10,
|
90
|
+
|
91
|
+
# optional, open timeout of each request of this instance
|
92
|
+
open_timeout: 10
|
93
|
+
}
|
94
|
+
|
95
|
+
parameters = {
|
96
|
+
link: link,
|
97
|
+
android_info: {
|
98
|
+
android_package_name: name,
|
99
|
+
}
|
100
|
+
ios_info: {},
|
101
|
+
navigation_info: {},
|
102
|
+
analytics_info: {},
|
103
|
+
social_meta_tag_info: {}
|
104
|
+
}
|
105
|
+
|
106
|
+
# options argument is optional
|
107
|
+
result = client.shorten_parameters(parameters, options)
|
93
108
|
```
|
94
109
|
|
95
|
-
|
110
|
+
if request successful, then the result should be like following hash object
|
111
|
+
|
112
|
+
or if the request reached daily quota, client will throw `FirebaseDynamicLink::QuotaExceeded` error
|
96
113
|
|
97
|
-
|
114
|
+
```ruby
|
115
|
+
{
|
116
|
+
:link=>"https://--.app.goo.gl/ukph",
|
117
|
+
:preview_link=>"https://--.app.goo.gl/ukph?d=1",
|
118
|
+
:warning=>[
|
119
|
+
{
|
120
|
+
"warningCode"=>"UNRECOGNIZED_PARAM",
|
121
|
+
"warningMessage"=>"..."},
|
122
|
+
{
|
123
|
+
"warningCode"=>"..."
|
124
|
+
},
|
125
|
+
{
|
126
|
+
"warningCode"=>"..."
|
127
|
+
}
|
128
|
+
]
|
129
|
+
}
|
130
|
+
```
|
98
131
|
|
99
|
-
|
100
|
-
be able shorten a JSON object
|
132
|
+
otherwise it will throw `FirebaseDynamicLink::ConnectionError` error, with message = http error message
|
101
133
|
|
102
134
|
## Development
|
103
135
|
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,37 +1,39 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
lib = File.expand_path("lib", __dir__)
|
3
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
6
|
+
require "firebase_dynamic_link/version"
|
5
7
|
|
6
8
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
9
|
+
spec.name = "firebase_dynamic_link"
|
8
10
|
spec.version = FirebaseDynamicLink::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
+
spec.authors = ["M Saiqul Haq"]
|
12
|
+
spec.email = ["saiqulhaq@gmail.com"]
|
11
13
|
|
12
|
-
spec.summary =
|
14
|
+
spec.summary = "Ruby client for Firebase Dynamic Link service"
|
13
15
|
spec.description = spec.summary
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
16
|
-
spec.metadata["yard.run"] =
|
16
|
+
spec.homepage = "https://github.com/saiqulhaq/firebase_dynamic_link"
|
17
|
+
spec.license = "MIT"
|
18
|
+
spec.metadata["yard.run"] = "yri"
|
17
19
|
|
18
20
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
19
21
|
f.match(%r{^(test|spec|features)/})
|
20
22
|
end
|
21
|
-
spec.bindir =
|
23
|
+
spec.bindir = "exe"
|
22
24
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
-
spec.require_paths = [
|
25
|
+
spec.require_paths = ["lib"]
|
24
26
|
|
25
|
-
spec.add_runtime_dependency
|
26
|
-
spec.add_runtime_dependency
|
27
|
+
spec.add_runtime_dependency "dry-configurable", "~> 0.6", ">= 0.6.0"
|
28
|
+
spec.add_runtime_dependency "faraday", "~> 0.9", ">= 0.9.2"
|
27
29
|
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
36
|
-
spec.add_development_dependency
|
30
|
+
spec.add_development_dependency "appraisal", "~> 2.2.0"
|
31
|
+
spec.add_development_dependency "bootsnap", "~> 1.3.0"
|
32
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
33
|
+
spec.add_development_dependency "dotenv", "~> 2.2", ">= 2.2.2"
|
34
|
+
spec.add_development_dependency "pry", "~> 0.11.3"
|
35
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
36
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
37
|
+
spec.add_development_dependency "simplecov", ">= 0.16.1"
|
38
|
+
spec.add_development_dependency "vcr", "~> 4.0", ">= 4.0.0"
|
37
39
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
firebase_dynamic_link (0.
|
5
|
-
dry-configurable (~> 0.
|
4
|
+
firebase_dynamic_link (1.0.0)
|
5
|
+
dry-configurable (~> 0.6, >= 0.6.0)
|
6
6
|
faraday (~> 0.9, >= 0.9.2)
|
7
7
|
|
8
8
|
GEM
|
@@ -18,8 +18,8 @@ GEM
|
|
18
18
|
concurrent-ruby (1.0.5)
|
19
19
|
diff-lcs (1.3)
|
20
20
|
docile (1.3.0)
|
21
|
-
dotenv (2.
|
22
|
-
dry-configurable (0.
|
21
|
+
dotenv (2.4.0)
|
22
|
+
dry-configurable (0.6.0)
|
23
23
|
concurrent-ruby (~> 1.0)
|
24
24
|
faraday (0.9.2)
|
25
25
|
multipart-post (>= 1.2, < 3)
|
@@ -60,7 +60,7 @@ DEPENDENCIES
|
|
60
60
|
bootsnap (~> 1.3.0)
|
61
61
|
bundler (~> 1.16)
|
62
62
|
dotenv (~> 2.2, >= 2.2.2)
|
63
|
-
dry-configurable (= 0.
|
63
|
+
dry-configurable (= 0.6.0)
|
64
64
|
faraday (= 0.9.2)
|
65
65
|
firebase_dynamic_link!
|
66
66
|
pry (~> 0.11.3)
|
@@ -1,40 +1,90 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-configurable"
|
4
|
+
require "faraday"
|
5
|
+
require "firebase_dynamic_link/client"
|
6
|
+
require "firebase_dynamic_link/link_renderer"
|
7
|
+
require "firebase_dynamic_link/version"
|
5
8
|
|
6
9
|
module FirebaseDynamicLink
|
7
10
|
extend Dry::Configurable
|
8
11
|
|
12
|
+
# called when invalid configuration given
|
9
13
|
class InvalidConfig < StandardError; end
|
14
|
+
|
15
|
+
# called when HTTP request failed
|
10
16
|
class ConnectionError < StandardError; end
|
11
17
|
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
18
|
+
# called when Firebase says that no more quota
|
19
|
+
class QuotaExceeded < StandardError; end
|
20
|
+
|
21
|
+
# @!group Configuration
|
22
|
+
# @!method adapter
|
23
|
+
# @!scope class
|
24
|
+
# Selected Faraday HTTP adapter
|
25
|
+
# @!method adapter=(adapter_key)
|
26
|
+
# @!scope class
|
27
|
+
# Set Faraday HTTP adapter
|
28
|
+
# @param adapter_key [Symbol]
|
29
|
+
# @example
|
30
|
+
# FirebaseDynamicLink.adapter = :patron
|
31
|
+
# FirebaseDynamicLink.adapter = :httpclient
|
32
|
+
# FirebaseDynamicLink.adapter = :net_http_persistent
|
33
|
+
# @see https://github.com/lostisland/faraday/tree/master/test/adapters
|
34
|
+
# @since 0.1.0
|
19
35
|
setting :adapter, Faraday.default_adapter
|
20
36
|
|
37
|
+
# @!method api_key
|
38
|
+
# @!scope class
|
39
|
+
# Given api key
|
40
|
+
# @!method api_key=(key)
|
41
|
+
# @!scope class
|
42
|
+
# Set api key
|
43
|
+
# @param key [String]
|
44
|
+
# @since 0.1.0
|
21
45
|
setting :api_key
|
22
46
|
|
23
|
-
#
|
47
|
+
# @!method timout
|
48
|
+
# Timeout default setting is 3 seconds
|
49
|
+
# @!scope class
|
50
|
+
# @!method timout=(seconds)
|
51
|
+
# @!scope class
|
52
|
+
# @param seconds [Integer]
|
53
|
+
# @since 0.1.0
|
54
|
+
# @!scope class
|
24
55
|
setting :timeout, 3
|
25
56
|
|
26
|
-
#
|
57
|
+
# @!method open_timout
|
58
|
+
# @!scope class
|
59
|
+
# Open timeout default setting is 3 seconds
|
60
|
+
# @!method open_timout=(seconds)
|
61
|
+
# @!scope class
|
62
|
+
# @param seconds [Integer]
|
63
|
+
# @since 0.1.0
|
64
|
+
# @!scope class
|
27
65
|
setting :open_timeout, 3
|
28
66
|
|
29
|
-
#
|
30
|
-
#
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
67
|
+
# @!method dynamic_link_domain
|
68
|
+
# @!scope class
|
69
|
+
# Firebase dynamic link domain
|
70
|
+
# @!method dynamic_link_domain=(domain)
|
71
|
+
# @!scope class
|
72
|
+
# @param domain [String]
|
73
|
+
# @since 1.0.0
|
74
|
+
# @!scope class
|
75
|
+
setting(:dynamic_link_domain)
|
76
|
+
|
77
|
+
# @!method suffix_option
|
78
|
+
# @!scope class
|
79
|
+
# Firebase suffix option setting, default is UNGUESSABLE
|
80
|
+
# @!method suffix_option=(suffix)
|
81
|
+
# @!scope class
|
82
|
+
# @raise [FirebaseDynamicLink::InvalidConfig] if value is not one of SHORT and UNGUESSABLE
|
83
|
+
# @param suffix [String]
|
84
|
+
# @since 1.0.0
|
85
|
+
# @!scope class
|
86
|
+
setting(:suffix_option, "UNGUESSABLE") do |value|
|
87
|
+
%w[SHORT UNGUESSABLE].include?(value) ? value : raise(FirebaseDynamicLink::InvalidConfig, "default suffix option config is not valid")
|
39
88
|
end
|
89
|
+
# @!endgroup
|
40
90
|
end
|
@@ -1,85 +1,161 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "firebase_dynamic_link/connection"
|
4
|
+
require "firebase_dynamic_link/link_renderer"
|
5
|
+
|
1
6
|
module FirebaseDynamicLink
|
7
|
+
# Main class that responsible to shorten link or parameters
|
2
8
|
class Client
|
3
|
-
|
9
|
+
extend Forwardable
|
4
10
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
11
|
+
def initialize
|
12
|
+
@link_renderer = FirebaseDynamicLink::LinkRenderer.new
|
13
|
+
@connection = FirebaseDynamicLink::Connection.new(end_point)
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param link [String] required
|
17
|
+
# @param options [Hash]
|
18
|
+
# * :timeout optional, default is FirebaseDynamicLink.config.timout
|
19
|
+
# * :open_timeout [Integer] optional, default is FirebaseDynamicLink.config.open_timout
|
20
|
+
# * :suffix_option [String] optional, default is FirebaseDynamicLink.config.suffix_option
|
21
|
+
# * :dynamic_link_domain [String] optional, default is FirebaseDynamicLink.config.dynamic_link_domain
|
22
|
+
# @return [Hash{Symbol=>String}]
|
23
|
+
# @see FirebaseDynamicLink::LinkRenderer#render LinkRenderer#render for returned Hash
|
10
24
|
def shorten_link(link, options = {})
|
11
|
-
|
25
|
+
connection.timeout = options[:timeout] if options.key?(:timeout)
|
26
|
+
connection.open_timeout = options[:open_timeout] if options.key?(:open_timeout)
|
12
27
|
|
13
|
-
suffix_option = options.
|
14
|
-
suffix_option ||= config.default.suffix.option
|
28
|
+
suffix_option = options[:suffix_option] if options.key?(:suffix_option)
|
15
29
|
|
16
30
|
response = connection.post(nil, {
|
17
31
|
longDynamicLink: build_link(link, options),
|
18
32
|
suffix: {
|
19
|
-
option: suffix_option
|
33
|
+
option: suffix_option || config.suffix_option
|
20
34
|
}
|
21
35
|
}.to_json)
|
22
|
-
|
23
|
-
render_success(response)
|
24
|
-
else
|
25
|
-
raise_error(response)
|
26
|
-
end
|
36
|
+
link_renderer.render(response)
|
27
37
|
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
|
28
38
|
raise FirebaseDynamicLink::ConnectionError, e.message
|
29
39
|
end
|
30
40
|
|
31
|
-
|
32
|
-
|
33
|
-
|
41
|
+
# @param params [Hash]
|
42
|
+
# * link [String]
|
43
|
+
# * android_info [Hash]
|
44
|
+
# * android_package_name [String]
|
45
|
+
# * android_fallback_link [String]
|
46
|
+
# * android_min_package_version_code [String]
|
47
|
+
# * android_link [String]
|
48
|
+
# * ios_info [Hash]
|
49
|
+
# * ios_bundle_id [String]
|
50
|
+
# * ios_fallback_link [String]
|
51
|
+
# * ios_custom_scheme [String]
|
52
|
+
# * ios_ipad_fallback_link [String]
|
53
|
+
# * ios_ipad_bundle_id [String]
|
54
|
+
# * ios_app_store_id [String]
|
55
|
+
# * navigation_info [Hash]
|
56
|
+
# * enable_forced_redirect [Boolean]
|
57
|
+
# * analytics_info [Hash]
|
58
|
+
# * google_play_analytics [Hash]
|
59
|
+
# * utm_source [String]
|
60
|
+
# * utm_medium [String]
|
61
|
+
# * utm_campaign [String]
|
62
|
+
# * utm_term [String]
|
63
|
+
# * utm_content [String]
|
64
|
+
# * gclid [String]
|
65
|
+
# * itunes_connect_analytics [Hash]
|
66
|
+
# * at [String]
|
67
|
+
# * ct [String]
|
68
|
+
# * mt [String]
|
69
|
+
# * pt [String]
|
70
|
+
# * social_meta_tag_info [Hash]
|
71
|
+
# * social_title [String]
|
72
|
+
# * social_description [String]
|
73
|
+
# * social_image_link [String]
|
74
|
+
# @example
|
75
|
+
# options = {
|
76
|
+
# suffix_option: "SHORT",
|
77
|
+
# dynamic_link_domain: 'domain' # optional
|
78
|
+
# }
|
79
|
+
#
|
80
|
+
# parameters = {
|
81
|
+
# link: link,
|
82
|
+
# android_info: {
|
83
|
+
# android_package_name: string,
|
84
|
+
# android_fallback_link: string,
|
85
|
+
# android_min_package_version_code: string,
|
86
|
+
# android_link: string
|
87
|
+
# },
|
88
|
+
# ios_info: {
|
89
|
+
# ios_bundle_id: string,
|
90
|
+
# ios_fallback_link: string,
|
91
|
+
# ios_custom_scheme: string,
|
92
|
+
# ios_ipad_fallback_link: string,
|
93
|
+
# ios_ipad_bundle_id: string,
|
94
|
+
# ios_app_store_id: string
|
95
|
+
# },
|
96
|
+
# navigation_info: {
|
97
|
+
# enable_forced_redirect: boolean,
|
98
|
+
# },
|
99
|
+
# analytics_info: {
|
100
|
+
# google_play_analytics: {
|
101
|
+
# utm_source: string,
|
102
|
+
# utm_medium: string,
|
103
|
+
# utm_campaign: string,
|
104
|
+
# utm_term: string,
|
105
|
+
# utm_content: string,
|
106
|
+
# gclid: string
|
107
|
+
# },
|
108
|
+
# itunes_connect_analytics: {
|
109
|
+
# at: string,
|
110
|
+
# ct: string,
|
111
|
+
# mt: string,
|
112
|
+
# pt: string
|
113
|
+
# }
|
114
|
+
# },
|
115
|
+
# social_meta_tag_info: {
|
116
|
+
# social_title: string,
|
117
|
+
# social_description: string,
|
118
|
+
# social_image_link: string
|
119
|
+
# }
|
120
|
+
# }
|
121
|
+
# result = instance.shorten_parameters(parameters, options)
|
122
|
+
# @return [Hash{Symbol=>String}]
|
123
|
+
# @see FirebaseDynamicLink::LinkRenderer#render LinkRenderer#render for returned Hash
|
124
|
+
def shorten_parameters(params, options = {})
|
125
|
+
connection.timeout = options[:timeout] if options.key?(:timeout)
|
126
|
+
connection.open_timeout = options[:open_timeout] if options.key?(:open_timeout)
|
34
127
|
|
35
|
-
|
128
|
+
suffix_option = options[:suffix_option] if options.key?(:suffix_option)
|
36
129
|
|
37
|
-
def build_link(link, options)
|
38
130
|
dynamic_link_domain = options.delete(:dynamic_link_domain)
|
39
|
-
dynamic_link_domain ||= config.
|
40
|
-
"#{dynamic_link_domain}?link=#{link}"
|
41
|
-
end
|
131
|
+
dynamic_link_domain ||= config.dynamic_link_domain || raise(FirebaseDynamicLink::InvalidConfig, "Dynamic link domain is empty")
|
42
132
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
133
|
+
response = connection.post(nil, {
|
134
|
+
dynamicLinkInfo: params.merge(dynamicLinkDomain: dynamic_link_domain),
|
135
|
+
suffix: {
|
136
|
+
option: suffix_option || config.suffix_option
|
137
|
+
}
|
138
|
+
}.to_json)
|
139
|
+
link_renderer.render(response)
|
140
|
+
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
|
141
|
+
raise FirebaseDynamicLink::ConnectionError, e.message
|
47
142
|
end
|
48
143
|
|
49
|
-
|
50
|
-
@connection ||= Faraday::Connection.new(url: end_point,
|
51
|
-
headers: { 'Content-Type' => 'application/json' })
|
52
|
-
end
|
144
|
+
private
|
53
145
|
|
54
|
-
|
55
|
-
|
56
|
-
end
|
146
|
+
def_delegators :@link_renderer, :render_success, :raise_error
|
147
|
+
def_delegators :FirebaseDynamicLink, :config
|
57
148
|
|
58
|
-
|
59
|
-
"https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=#{config.api_key}"
|
60
|
-
end
|
149
|
+
attr_reader :link_renderer, :connection
|
61
150
|
|
62
|
-
def
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
body = JSON.parse(response.body)
|
67
|
-
body['error']['message']
|
68
|
-
rescue
|
69
|
-
response.body
|
70
|
-
end
|
71
|
-
end
|
72
|
-
raise FirebaseDynamicLink::ConnectionError, message
|
151
|
+
def build_link(link, options)
|
152
|
+
dynamic_link_domain = options.delete(:dynamic_link_domain)
|
153
|
+
dynamic_link_domain ||= config.dynamic_link_domain || raise(FirebaseDynamicLink::InvalidConfig, "Dynamic link domain is empty")
|
154
|
+
"#{dynamic_link_domain}?link=#{link}"
|
73
155
|
end
|
74
156
|
|
75
|
-
def
|
76
|
-
|
77
|
-
has_error = body.key?('error')
|
78
|
-
{
|
79
|
-
link: has_error ? nil : body['shortLink'],
|
80
|
-
preview_link: has_error ? nil : body['previewLink'],
|
81
|
-
warning: has_error ? nil : body['warning']
|
82
|
-
}
|
157
|
+
def end_point
|
158
|
+
"https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=#{config.api_key}"
|
83
159
|
end
|
84
160
|
end
|
85
161
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FirebaseDynamicLink
|
4
|
+
# Responsible to do HTTP request
|
5
|
+
class Connection
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
# @!method post
|
9
|
+
# see Faraday::Connection#post
|
10
|
+
def_delegators :client, :post
|
11
|
+
|
12
|
+
def initialize(end_point)
|
13
|
+
@client = Faraday::Connection.new(url: end_point,
|
14
|
+
headers: { "Content-Type" => "application/json" })
|
15
|
+
|
16
|
+
client.options.timeout = FirebaseDynamicLink.config.timeout
|
17
|
+
client.options.open_timeout = FirebaseDynamicLink.config.open_timeout
|
18
|
+
end
|
19
|
+
|
20
|
+
# @see Faraday.timeout=
|
21
|
+
def timeout=(time)
|
22
|
+
client.options.timeout = time
|
23
|
+
end
|
24
|
+
|
25
|
+
# @see Faraday.timeout
|
26
|
+
def timeout
|
27
|
+
client.options.timeout
|
28
|
+
end
|
29
|
+
|
30
|
+
# @see Faraday.open_timeout=
|
31
|
+
def open_timeout=(time)
|
32
|
+
client.options.open_timeout = time
|
33
|
+
end
|
34
|
+
|
35
|
+
# @see Faraday.open_timeout
|
36
|
+
def open_timeout
|
37
|
+
client.options.open_timeout
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
attr_reader :client
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FirebaseDynamicLink
|
4
|
+
# Responsible to formatting output of Client#shorten_link
|
5
|
+
class LinkRenderer
|
6
|
+
# @param response [Faraday::Connection] http reponse
|
7
|
+
# @return [Hash<Symbol, String or Hash>
|
8
|
+
# @example
|
9
|
+
# {
|
10
|
+
# :link => short link result
|
11
|
+
# :preview_link => preview of short link result
|
12
|
+
# :warning => warning message by Firebase if present
|
13
|
+
# }
|
14
|
+
# @raise FirebaseDynamicLink::ConnectionError if there is something wrong with Faraday request
|
15
|
+
# @raise FirebaseDynamicLink::QuotaExceeded if request reached Google Firebase quota
|
16
|
+
def render(response)
|
17
|
+
if response.status.between?(200, 299)
|
18
|
+
render_success(response)
|
19
|
+
elsif response.status == 429
|
20
|
+
raise_limit_has_reached
|
21
|
+
else
|
22
|
+
raise_error(response)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def render_success(response)
|
29
|
+
body = JSON.parse(response.body)
|
30
|
+
return raise_error(response) if body.key?("error")
|
31
|
+
{
|
32
|
+
link: body["shortLink"],
|
33
|
+
preview_link: body["previewLink"],
|
34
|
+
warning: body["warning"]
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def raise_error(response)
|
39
|
+
reason = response.reason_phrase.to_s if response.respond_to?(:reason_phrase)
|
40
|
+
message = begin
|
41
|
+
body = JSON.parse(response.body)
|
42
|
+
body["error"]["message"]
|
43
|
+
rescue JSON::ParserError, NoMethodError
|
44
|
+
response.body
|
45
|
+
end
|
46
|
+
raise FirebaseDynamicLink::ConnectionError, [reason, message].compact.join(": ")
|
47
|
+
end
|
48
|
+
|
49
|
+
def raise_limit_has_reached
|
50
|
+
raise FirebaseDynamicLink::QuotaExceeded, "Request limit has been reached"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: firebase_dynamic_link
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- M Saiqul Haq
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04
|
11
|
+
date: 2018-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-configurable
|
@@ -16,20 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.6'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.
|
22
|
+
version: 0.6.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '0.
|
29
|
+
version: '0.6'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.
|
32
|
+
version: 0.6.0
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: faraday
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -65,25 +65,33 @@ dependencies:
|
|
65
65
|
- !ruby/object:Gem::Version
|
66
66
|
version: 2.2.0
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
|
-
name:
|
68
|
+
name: bootsnap
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
71
|
- - "~>"
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
74
|
-
- - ">="
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 4.0.0
|
73
|
+
version: 1.3.0
|
77
74
|
type: :development
|
78
75
|
prerelease: false
|
79
76
|
version_requirements: !ruby/object:Gem::Requirement
|
80
77
|
requirements:
|
81
78
|
- - "~>"
|
82
79
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
84
|
-
|
80
|
+
version: 1.3.0
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: bundler
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
85
86
|
- !ruby/object:Gem::Version
|
86
|
-
version:
|
87
|
+
version: '1.16'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '1.16'
|
87
95
|
- !ruby/object:Gem::Dependency
|
88
96
|
name: dotenv
|
89
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,19 +113,19 @@ dependencies:
|
|
105
113
|
- !ruby/object:Gem::Version
|
106
114
|
version: 2.2.2
|
107
115
|
- !ruby/object:Gem::Dependency
|
108
|
-
name:
|
116
|
+
name: pry
|
109
117
|
requirement: !ruby/object:Gem::Requirement
|
110
118
|
requirements:
|
111
119
|
- - "~>"
|
112
120
|
- !ruby/object:Gem::Version
|
113
|
-
version:
|
121
|
+
version: 0.11.3
|
114
122
|
type: :development
|
115
123
|
prerelease: false
|
116
124
|
version_requirements: !ruby/object:Gem::Requirement
|
117
125
|
requirements:
|
118
126
|
- - "~>"
|
119
127
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
128
|
+
version: 0.11.3
|
121
129
|
- !ruby/object:Gem::Dependency
|
122
130
|
name: rake
|
123
131
|
requirement: !ruby/object:Gem::Requirement
|
@@ -147,47 +155,39 @@ dependencies:
|
|
147
155
|
- !ruby/object:Gem::Version
|
148
156
|
version: '3.0'
|
149
157
|
- !ruby/object:Gem::Dependency
|
150
|
-
name:
|
158
|
+
name: simplecov
|
151
159
|
requirement: !ruby/object:Gem::Requirement
|
152
160
|
requirements:
|
153
|
-
- - "
|
161
|
+
- - ">="
|
154
162
|
- !ruby/object:Gem::Version
|
155
|
-
version: 0.
|
163
|
+
version: 0.16.1
|
156
164
|
type: :development
|
157
165
|
prerelease: false
|
158
166
|
version_requirements: !ruby/object:Gem::Requirement
|
159
167
|
requirements:
|
160
|
-
- - "
|
168
|
+
- - ">="
|
161
169
|
- !ruby/object:Gem::Version
|
162
|
-
version: 0.
|
170
|
+
version: 0.16.1
|
163
171
|
- !ruby/object:Gem::Dependency
|
164
|
-
name:
|
172
|
+
name: vcr
|
165
173
|
requirement: !ruby/object:Gem::Requirement
|
166
174
|
requirements:
|
167
175
|
- - "~>"
|
168
176
|
- !ruby/object:Gem::Version
|
169
|
-
version:
|
170
|
-
type: :development
|
171
|
-
prerelease: false
|
172
|
-
version_requirements: !ruby/object:Gem::Requirement
|
173
|
-
requirements:
|
174
|
-
- - "~>"
|
175
|
-
- !ruby/object:Gem::Version
|
176
|
-
version: 1.3.0
|
177
|
-
- !ruby/object:Gem::Dependency
|
178
|
-
name: simplecov
|
179
|
-
requirement: !ruby/object:Gem::Requirement
|
180
|
-
requirements:
|
177
|
+
version: '4.0'
|
181
178
|
- - ">="
|
182
179
|
- !ruby/object:Gem::Version
|
183
|
-
version: 0.
|
180
|
+
version: 4.0.0
|
184
181
|
type: :development
|
185
182
|
prerelease: false
|
186
183
|
version_requirements: !ruby/object:Gem::Requirement
|
187
184
|
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '4.0'
|
188
188
|
- - ">="
|
189
189
|
- !ruby/object:Gem::Version
|
190
|
-
version: 0.
|
190
|
+
version: 4.0.0
|
191
191
|
description: Ruby client for Firebase Dynamic Link service
|
192
192
|
email:
|
193
193
|
- saiqulhaq@gmail.com
|
@@ -204,6 +204,7 @@ files:
|
|
204
204
|
- CODE_OF_CONDUCT.md
|
205
205
|
- Gemfile
|
206
206
|
- Gemfile.lock
|
207
|
+
- Guardfile
|
207
208
|
- LICENSE.txt
|
208
209
|
- README.md
|
209
210
|
- Rakefile
|
@@ -221,6 +222,8 @@ files:
|
|
221
222
|
- gemfiles/version_2018.gemfile.lock
|
222
223
|
- lib/firebase_dynamic_link.rb
|
223
224
|
- lib/firebase_dynamic_link/client.rb
|
225
|
+
- lib/firebase_dynamic_link/connection.rb
|
226
|
+
- lib/firebase_dynamic_link/link_renderer.rb
|
224
227
|
- lib/firebase_dynamic_link/version.rb
|
225
228
|
homepage: https://github.com/saiqulhaq/firebase_dynamic_link
|
226
229
|
licenses:
|