archivesunleashed / warclight Goto Github PK
View Code? Open in Web Editor NEWA Rails engine supporting the discovery of web archives.
Home Page: https://archivesunleashed.org/warclight/
License: Other
A Rails engine supporting the discovery of web archives.
Home Page: https://archivesunleashed.org/warclight/
License: Other
Performance Cops will be removed from RuboCop 0.68. Use rubocop-performance gem instead.
Put this in your Gemfile.
gem 'rubocop-performance'
And then execute:
$ bundle install
Put this into your .rubocop.yml.
require: rubocop-performance
Noticed that revisits fall outside our solution to #18 here.
How do we want to handle revisits in Warclight? We could remove them in the requestHandlers.
@ianmilligan1 @anjackson @tokee @greebie curious what y'all's thoughts are on this.
Right now each record displays title, host, crawl date, content type, domain, this page links to, institution, collection name, and collection number. All but 'this page links to' or perhaps 'title' have natural limits.
In this case, a page is linking to dozens of other domains:
Should we have a limit โย i.e. list the top 10, to keep from cluttering up the results page too much?
Discussion item from breakout session.
...more of deployed Warclight application thing, and not a Rails Engine thing.
Basic idea, since you'll potentially have a large index of web archives, it might be cool to run a timemap service from you application. Maybe this could be a Blacklight plugin? shrugs
The TimeTravel API which is used in this method to create a reply URL link is unreliable.
This thread on the Memento Development list, started in November 2018, raised the issue initially. The recent TravisCI test runs have identified that the issue has now cascaded to our project, which has been raised in the mailing list thread.
So far I believe that we have two options:
If we do something similar to what @anjackson did in this commit, we'd leave less of a burden on the implementer to setup a custom solrconfig.xml
like we ship here, and if they already have a Solr index two setup with the same or similar schema.xml
that webarchive-discovery ships, it would be an easier drop-in.
warclight/lib/generators/warclight/templates/catalog_controller.rb
Lines 120 to 134 in ef0c872
Less things to maintain?
@anjackson @ianmilligan1 let me know what you think.
This field search is redundant as 'text' is a copyfield that include content.
As discussed, we should have a Wayback URL directly accessible from the search results page (I know the trick is what Wayback URL so that's a separate issue).
Should the Wayback URL or link?
Currently, the only documentation is the README file which has almost no information about what this tool does. I think there should be enough getting started material in the README that encourages people to try it out or they can know what to expect when they run the service.
I noticed that the resourcename
field has a type of text_general
after this commit. Since it is has a type of text_general
it is tokenized, which makes faceting worthless.
See "Filename" facet in the demo:
My question then is, should we change this to string
? If we do we can have a "Filename" facet. However, that might, or more likely will, have downstream repercussions for webarchive-discovery that will force re-indexing.
My goal with warclight has been align our schema.xml
and solrconfig.xml
with webarchive-discovery so that doesn't need to happen since any potential warclight user who is already a webarchive-discovery user will most likely have a very large index, and re-indexing is probably a non-starter.
That said, could we create a copyField for this? Or is there some other Solr magic we could lean on?
...or do we even care about faceting on "Filename"?
@ianmilligan1 @anjackson @tokee I'd love to have your thoughts on this ๐
Currently we're ignoring this in Rubocop. We shouldn't.
Offenses:
app/models/concerns/warclight/solr_document.rb:12:32: C: Rails/TimeZone: Do not use Time.parse.strftime without zone. Use one of Time.zone.parse.strftime, Time.current, Time.parse.strftime.in_time_zone, Time.parse.strftime.utc, Time.parse.strftime.getlocal, Time.parse.strftime.iso8601, Time.parse.strftime.jisx0301, Time.parse.strftime.rfc3339, Time.parse.strftime.to_i, Time.parse.strftime.to_f instead.
time_travel_time = (Time.parse(first(:crawl_date)).strftime time_travel_time_format).to_s
Should we be providing a replay link in the view?
I don't think we can do this out of the box in Warclight since we can't know what replay system folks will be using; archive.org Wayback, Archive-It Waybac, local Wayback, PyWB, etc? Maybe we should make this a documentation issues? Say it is possible, and give an example of doing it?
I have started using Web Archives for some paper research and I was not quick to realize that the "+" was the appropriate link for setting a filter.
This was for a search for "prorogue" with a desired filter for 2008.
I wanted to click on the date itself and/or the number of entries.
I realize that this is probably a BlackLight thing, but it might be worth considering the alteration in the case of Web Archives because dates, formats etc. aren't as thick with meaning as other examples I've seen around (e.g. subject headings etc.).
request: http://192.168.32.36:8983/solr/utoronto_shard5_replica_n12/update?update.distrib=TOLEADER&distrib.from=http%3A%2F%2F192.168.32.35%3A8983%2Fsolr%2Futoronto_shard5_replica_n11%2F&wt=javabin&version=2
Remote error message: Exception writing document id sha1:4I2XUV4FTHDJH6TH5FJOR7D2KC7W4FIR/txMrhuN6kFGPs3zkjFkAhQ== to the index; possible analysis error: Document contains at least one immense term in field="links_hosts" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped. Please correct the analyzer to not produce such terms. The prefix of the first immense term is: '[98, 97, 110, 101, 115, 45, 97, 108, 108, 111, 116, 109, 101, 110, 116, 115, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65]...', original message: bytes can be at most 32766 in length; got 1055104. Perhaps the document has an indexed string field (solr.StrField) which is too large
Current fields are:
These are the potential fields.
@ianmilligan1 @anjackson @greebie
Feel free to tag others.
As of d9920a7 bundle exec rake warclight:server
yields:
RSolr::Error::Http - 400 Bad Request Error: {"responseHeader":{"status":400,"QTime":3,"params":{"facet.query":["pub_date:[2012 TO *]","pub_date:[2007 TO *]","pub_date:[1992 TO *]"],"f.subject_topic_facet.facet.limit":"21","facet.field":["format","{!ex=pub_date_single}pub_date","subject_topic_facet","language_facet","lc_1letter_facet","subject_geo_facet","subject_era_facet"],"facet.pivot":"format,language_facet","sort":"score desc, pub_date_sort desc, title_sort asc","rows":"10","facet":"true","wt":"json","f.language_facet.facet.limit":"11"}},"error":{"metadata":["error-class","org.apache.solr.common.SolrException","root-error-class","org.apache.solr.common.SolrException"],"msg":"sort param field can't be found: pub_date_sort","code":400}} URI: http://127.0.0.1:8983/solr/blacklight-core/select?wt=json&facet.field=format&facet.field=%7B%21ex%3Dpub_date_single%7Dpub_date&facet.field=subject_topic_facet&facet.field=language_facet&facet.field=lc_1letter_facet&facet.field=subject_geo_facet&facet.field=subject_era_facet&facet.query=pub_date%3A%5B2012+TO+*%5D&facet.query=pub_date%3A%5B2007+TO+*%5D&facet.query=pub_date%3A%5B1992+TO+*%5D&facet.pivot=format%2Clanguage_facet&&&rows=10&facet=true&f.subject_topic_facet.facet.limit=21&f.language_facet.facet.limit=11&sort=score+desc%2C+pub_date_sort+desc%2C+title_sort+asc Backtrace: /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rsolr-2.0.2/lib/rsolr/client.rb:195:in `rescue in execute' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rsolr-2.0.2/lib/rsolr/client.rb:185:in `execute' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rsolr-2.0.2/lib/rsolr/client.rb:180:in `send_and_receive' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/bundler/gems/blacklight-8160d7d61143/lib/blacklight/solr/repository.rb:38:in `block in send_and_receive' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activesupport-5.1.3/lib/active_support/benchmarkable.rb:41:in `block in benchmark' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activesupport-5.1.3/lib/active_support/core_ext/benchmark.rb:12:in `block in ms' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/2.4.0/benchmark.rb:308:in `realtime' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activesupport-5.1.3/lib/active_support/core_ext/benchmark.rb:12:in `ms' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activesupport-5.1.3/lib/active_support/benchmarkable.rb:41:in `benchmark' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/bundler/gems/blacklight-8160d7d61143/lib/blacklight/solr/repository.rb:36:in `send_and_receive' /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/bundler/gems/blacklight-8160d7d61143/lib/blacklight/solr/repository.rb:22:in `search'
I think it's time to start setting up the default Solr fields for warclight
.
Title (Goal) | Trend Diagram |
---|---|
Primary Actor | Researcher |
Scope | Access |
Level | Medium to High |
Story | Similar to the UKWA's Shine Interface, this supports the discovery and exploration of changing concepts and trends over time. A user might be interested in the relative frequency of a given term: i.e. "Aboriginal" or "public transportation" across a collection, or across specific domains or content-types. It should support various solr facets. i.e. "public transportation" in domain:liberal.ca or links-to:liberal.ca. While open to misinterpretation due to underlying data, it's an important access feature that really engages users (as our media experience with [WebArchives.ca)(http://webarchives.ca/) showed, and as I think the UKWA can attest!) |
Example from SHINE (WebArchives.ca):
Current fields are:
These are the potential fields.
@ianmilligan1 @anjackson @greebie
Feel free to tag others.
Currently we're ignoring this in Rubocop. We shouldn't.
Offenses:
app/models/concerns/warclight/solr_document.rb:9:5: C: Metrics/AbcSize: Assignment Branch Condition size for replay_link is too high. [20.12/15]
def replay_link
return_five
will run if there are less than 5 items in an array, which makes display wrong. Update the method to add a conditional for less than 5.
https://github.com/archivesunleashed/warclight/blob/master/solr/conf/solrconfig.xml#L104
text
is everything, so the baseline is actually 25. When removing this line, look at the scores of the others ones.
Remove mentions of master
.
Title (Goal) | Advanced Search |
---|---|
Primary Actor | user |
Scope | access |
Level | High |
Story | This again borrows from UKWA Shine as we seek to bring functionality of Blacklight up to their platform! Researchers may want functionality beyond the simple faceted search provided on the main page of Warclight. For example, a user may want to find mentions of "Twitter" in sites excluding "Twitter.com," or may want to provide more granular date ranges ("public transportation" in July and August 2007, rather than just the year itself), or they may want to find pages that contain multiple words within x words of each other. The user would be overwhelmed if all the facets were provided in the main search, but they may want more granularity in an advanced search. |
Word Proximity:
One common example we used on WebArchives.ca was the word proximity. We searched for the word "Harper" and the word "fascist" within 25 words of each other, as a way to begin to find sites that may have used extreme rhetoric with the Conservative government. This allowed us to find Green Party blogs that characterized the Conservative government this way.
Here is the example from SHINE:
Granularity:
Right now in the main page, here are the list of facets for date for example:
For many users, this is enough! But people may want to use only a few months, or exclude certain date ranges (say if a crawl was corrupted, or if they were overwhelmed by a particular event and wanted to ignore it). It would be good to have date range search like so (again borrowing from Shine):
This comes up during bundle exec rake
Could not find generator 'warclight:install'. Maybe you meant 'blacklight:install', 'devise:install' or 'rspec:install'
Run `rails generate --help` for more options.
Related to #22
Currently we search all fields with our normal search
Do we want to add additional fields? See the Project Blacklight demo for an example
If we do want to add them, what fields should be there?
@ianmilligan1 @lintool @greebie @anjackson
Feel free to tag others.
Current fields are:
These are the potential fields.
@ianmilligan1 @anjackson @greebie
Feel free to tag others.
I don't think this is an environment issue. I'm using a clean gemset with rvm on Ubuntu 16.04.
installing with rails new warclight -m https://raw.githubusercontent.com/archivesunleashed/warclight/master/template.rb
There doesn't seem to be any install errors. solr_wrapper and rails server start, but browsing gets:
Sprockets::FileNotFound in Catalog#index
couldn't find file 'blacklight/core' with type 'application/javascript'
Checked in these paths:
/home/greg/warclight/app/assets/config
/home/greg/warclight/app/assets/images
/home/greg/warclight/app/assets/javascripts
/home/greg/warclight/app/assets/stylesheets
/home/greg/.rvm/gems/ruby-2.4.3@warclight/gems/jquery-rails-4.3.3/vendor/assets/javascripts
...
The two blacklight gems are in the gemfile from github and are listed during bundle install. I also have things like config/blacklight.yml
Tried with Rails 2.0.latest, 5.1.6 and 5.1.2. I wanted 5.1.2 somewhere, but even doing rails new 5.1.2 updated rails to 5.1.6 at some point in the template file.
Maybe url should be, and the other should be fuzzy?
Since we've added the helper method, we lost the ability have link_to_facet
. We should add this functionality back.
An error occurred while loading ./spec/warclight_spec.rb.
Failure/Error: Cabybara.javascript_driver = :poltergeist
NameError:
uninitialized constant Cabybara
# ./spec/spec_helper.rb:17:in `<top (required)>'
# ./spec/warclight_spec.rb:3:in `require'
# ./spec/warclight_spec.rb:3:in `<top (required)>'
No examples found.
Finished in 0.00023 seconds (files took 1.39 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples
Coverage report generated for RSpec to /home/nruest/git/rails_engines/warclight/coverage. 9 / 9 LOC (100.0%) covered.
/home/nruest/.rbenv/versions/2.4.0/bin/ruby -I/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/lib:/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rspec-support-3.6.0/lib /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rspec-core-3.6.0/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb failed
An error occurred while loading ./spec/warclight_spec.rb.
Failure/Error: require 'rpsec/rails'
LoadError:
cannot load such file -- rpsec/rails
# ./vendor/bundle/ruby/2.4.0/gems/activesupport-5.1.3/lib/active_support/dependencies.rb:292:in `require'
# ./vendor/bundle/ruby/2.4.0/gems/activesupport-5.1.3/lib/active_support/dependencies.rb:292:in `block in require'
# ./vendor/bundle/ruby/2.4.0/gems/activesupport-5.1.3/lib/active_support/dependencies.rb:258:in `load_dependency'
# ./vendor/bundle/ruby/2.4.0/gems/activesupport-5.1.3/lib/active_support/dependencies.rb:292:in `require'
# ./spec/spec_helper.rb:14:in `<top (required)>'
# ./spec/warclight_spec.rb:3:in `require'
# ./spec/warclight_spec.rb:3:in `<top (required)>'
No examples found.
Would it be worth adding a field that displays the current http status code for a url in the item's view? Might be useful to know if the url is at least a 200 OK, or 404 NOT FOUND.
Follow-on to #45
To align ourselves with webarchive-discovery users, and allow those users to use Warclight with an existing index, let's use the default config there.
The Codecov setup using the example repo doesn't work. It results in the error pasted below, and has been removed as of c3d23f9. We should get it back in, and this issue is meant to take care of that.
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:85:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'codecov'. (Bundler::GemRequireError)
Gem Load Error is: uninitialized constant SimpleCov
Did you mean? SimpleDelegator
Backtrace for gem load error is:
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/codecov-0.1.10/lib/codecov.rb:5:in `<top (required)>'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:82:in `require'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:82:in `block (2 levels) in require'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:77:in `each'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:77:in `block in require'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:66:in `each'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:66:in `require'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler.rb:108:in `require'
/home/nruest/git/rails_engines/warclight/.internal_test_app/config/application.rb:7:in `<top (required)>'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/command/actions.rb:15:in `require'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/command/actions.rb:15:in `require_application_and_environment!'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/commands/generate/generate_command.rb:8:in `help'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/commands/generate/generate_command.rb:17:in `perform'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/thor-0.19.4/lib/thor/command.rb:27:in `run'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/thor-0.19.4/lib/thor/invocation.rb:126:in `invoke_command'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/thor-0.19.4/lib/thor.rb:369:in `dispatch'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/command/base.rb:63:in `perform'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/command.rb:44:in `invoke'
/home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/commands.rb:16:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Bundler Error Backtrace:
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:81:in `block (2 levels) in require'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:77:in `each'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:77:in `block in require'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:66:in `each'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler/runtime.rb:66:in `require'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bundler-1.15.3/lib/bundler.rb:108:in `require'
from /home/nruest/git/rails_engines/warclight/.internal_test_app/config/application.rb:7:in `<top (required)>'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/command/actions.rb:15:in `require'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/command/actions.rb:15:in `require_application_and_environment!'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/commands/generate/generate_command.rb:8:in `help'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/commands/generate/generate_command.rb:17:in `perform'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/thor-0.19.4/lib/thor/command.rb:27:in `run'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/thor-0.19.4/lib/thor/invocation.rb:126:in `invoke_command'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/thor-0.19.4/lib/thor.rb:369:in `dispatch'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/command/base.rb:63:in `perform'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/command.rb:44:in `invoke'
from /home/nruest/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.1.3/lib/rails/commands.rb:16:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
rake aborted!
EngineCart failed on with: pid 3885 exit 1
/home/nruest/.rbenv/versions/2.4.0/bin/bundle:22:in `load'
/home/nruest/.rbenv/versions/2.4.0/bin/bundle:22:in `<main>'
Tasks: TOP => default => ci => warclight:generate => engine_cart:generate
(See full trace by running task with --trace)
When I'm trying to install WARCLight following the documentation (rails new tolight -m https://raw.githubusercontent.com/archivesunleashed/warclight/master/template.rb
), the installation stops with the following error message:
Resolving dependencies...
Bundler could not find compatible versions for gem "rails":
In Gemfile:
rails (~> 6.0.2, >= 6.0.2.1)
warclight was resolved to 0.8.3, which depends on
rails (~> 5.0)
I don't know if it is a bug, or if I'm missing something obvious. But can you tell me how to solve this?
Thanks in advance!
Your Gemfile lists the gem warclight (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem bundler (~> 1.14) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem codecov (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem engine_cart (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem mocha (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem poltergeist (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem rake (~> 12.0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem rspec-rails (~> 3.0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem rubocop (~> 0.48.1) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem rubocop-rspec (~> 1.15.0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem simplecov (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
Your Gemfile lists the gem solr_wrapper (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of one of them later.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.